Topik ini menjelaskan metode pemanggilan, batasan, dan contoh kode untuk fungsi web dalam runtime kustom.
Latar Belakang
Runtime kustom dapat menjalankan server HTTP Anda. Function Compute mengonversi permintaan pemanggilan fungsi menjadi permintaan HTTP dan mengirimkannya ke server Anda. Respons dari server kemudian dikonversi menjadi respons pemanggilan fungsi dan dikembalikan ke klien.
Anda dapat memanggil fungsi dengan dua cara:
Panggilan HTTP (Direkomendasikan): Memanggil fungsi melalui HTTP menggunakan Pemicu HTTP atau nama domain kustom.
Panggilan API: Memanggil fungsi dengan menggunakan API InvokeFunction melalui SDK atau sumber event.
Format permintaan dan respons untuk server HTTP Anda berbeda tergantung pada metode pemanggilan yang digunakan.
Batasan
Anda hanya dapat membuat satu Pemicu HTTP untuk setiap versi atau alias fungsi. Untuk informasi selengkapnya, lihat Mengelola versi dan Mengelola alias.
Batasan permintaan HTTP
Header permintaan tidak boleh berisi bidang kustom yang diawali dengan x-fc- atau bidang terbatas berikut:
connection
keep-alive
Jika permintaan melebihi batasan berikut, Function Compute akan mengembalikan kode status
400dan kode kesalahanInvalidArgument.Ukuran header: Ukuran total semua kunci dan nilai dalam header tidak boleh melebihi 8 KB.
Ukuran path: Ukuran total path, termasuk semua parameter kueri, tidak boleh melebihi 4 KB.
Ukuran badan: Ukuran total badan permintaan pemanggilan sinkron tidak boleh melebihi 32 MB. Ukuran total badan permintaan pemanggilan asinkron tidak boleh melebihi 128 KB.
Batasan respons HTTP
Header respons tidak boleh berisi bidang kustom yang diawali dengan x-fc- atau bidang terbatas berikut:
connection
content-length
date
keep-alive
server
content-disposition:attachment
CatatanUntuk alasan keamanan, saat Anda menggunakan domain default
aliyuncs.comyang disediakan oleh Function Compute, layanan secara otomatis menambahkan header content-disposition: attachment ke respons. Hal ini menyebabkan respons diunduh sebagai lampiran di browser. Untuk menghapus pembatasan ini, Anda harus mengonfigurasi nama domain kustom.
Jika respons melebihi batasan berikut, Function Compute akan mengembalikan kode status
502dan kode kesalahanBadResponse.Ukuran header: Ukuran total semua kunci dan nilai dalam header tidak boleh melebihi 8 KB.
Informasi tambahan
Anda dapat memetakan path akses HTTP yang berbeda ke fungsi Anda dengan mengaitkannya ke nama domain kustom. Untuk informasi selengkapnya, lihat Mengonfigurasi nama domain kustom.
Panggilan HTTP (Direkomendasikan)
Untuk panggilan HTTP, Function Compute menggunakan mode passthrough. Permintaan HTTP dari klien diteruskan ke server HTTP Anda, dan respons server dikirim kembali ke klien. Bidang-bidang tertentu yang dicadangkan sistem tidak diteruskan. Untuk detailnya, lihat Batasan.
Header permintaan
Saat memanggil fungsi menggunakan Pemicu HTTP atau nama domain kustom, Anda dapat mengonfigurasi header permintaan untuk mengontrol perilaku permintaan. Tabel berikut menjelaskan header permintaan tersebut.
Parameter | Tipe | Wajib | Contoh | Deskripsi |
X-Fc-Invocation-Type | String | Tidak | Sync | Metode pemanggilan. Untuk informasi selengkapnya, lihat Metode pemanggilan. Nilai yang valid:
|
X-Fc-Log-Type | String | Tidak | Tail | Menentukan apakah log eksekusi disertakan dalam respons. Nilai yang valid:
|
Header respons
Saat memanggil fungsi menggunakan Pemicu HTTP atau nama domain kustom, respons mencakup header yang ditambahkan oleh Function Compute. Tabel berikut menjelaskan header respons tersebut.
Parameter | Deskripsi | Contoh |
X-Fc-Request-Id | ID permintaan unik untuk pemanggilan fungsi. | dab25e58-9356-4e3f-97d6-f044c4**** |
Panggilan API
Untuk panggilan API yang menggunakan API InvokeFunction, Function Compute mengonversi permintaan API menjadi permintaan HTTP dan meneruskannya ke server HTTP Anda. Konversi mengikuti aturan berikut:
Parameter
eventdari permintaan InvokeFunction dikonversi menjadi badan permintaan HTTP.pathdiatur ke/invoke.methoddiatur kePOST.Header
Content-Typediatur keapplication/octet-stream.
Function Compute kemudian mengonversi respons dari server HTTP Anda menjadi respons InvokeFunction dan mengembalikannya ke klien. Konversi mengikuti aturan berikut:
Badan respons HTTP dikonversi menjadi badan respons InvokeFunction.
Konversi mengabaikan header respons HTTP dan kode status.
Konversi permintaan InvokeFunction
InvokeFunction request | Permintaan HTTP yang diterima |
Isi permintaan InvokeFunction: | |
Contoh respons API Invoke
Respons HTTP | Respons Invoke |
| |
| |
Kode respons dan header Function Compute
Runtime Kustom adalah server HTTP yang Anda implementasikan. Setiap pemanggilan fungsi merupakan permintaan HTTP. Akibatnya, setiap respons memiliki kode respons dan header respons.
Kode respons
StatusCode200: Menunjukkan keberhasilan.404: Menunjukkan kegagalan.
Header respons
x-fc-status200: Menunjukkan keberhasilan.404: Menunjukkan kegagalan.
Gunakan header respons x-fc-status untuk melaporkan kepada Function Compute apakah fungsi lokal dieksekusi dengan sukses.
Jika
x-fc-statustidak diatur: Function Compute secara default mengasumsikan pemanggilan berhasil. Jika terjadi exception dalam fungsi tetapi tidak dilaporkan, Function Compute tetap menganggap eksekusi berhasil. Hal ini mungkin tidak memengaruhi logika bisnis, tetapi berdampak pada pemantauan dan observabilitas, seperti yang ditunjukkan pada gambar berikut:
Jika
x-fc-statusdiatur: Jika terjadi exception dalam fungsi, gunakan responsx-fc-statusuntuk melaporkan kegagalan eksekusi kepada Function Compute. Hal ini juga mencetak jejak stack error ke log, seperti yang ditunjukkan pada gambar berikut:
Dalam respons HTTP yang dikembalikan, atur kedua hal berikut: StatusCode dan x-fc-status.
Contoh kode
Setelah mengonfigurasi pemicu untuk fungsi, Anda dapat mengimplementasikan server HTTP dalam bahasa apa pun. Contoh berikut menggunakan Python.
Kode contoh ini bergantung pada lingkungan Python dan library Flask. Untuk menjalankan kode ini, buat Web Function dan pilih Python 3.10 sebagai runtime.
import os
from flask import Flask
from flask import request
REQUEST_ID_HEADER = 'x-fc-request-id'
app = Flask(__name__)
@app.route('/', defaults={'path': ''})
@app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE'])
def hello_world(path):
rid = request.headers.get(REQUEST_ID_HEADER)
data = request.stream.read()
print("Path: " + path)
print("Data: " + str(data))
return "Hello, World!", 200, [('Function-Name', os.getenv('FC_FUNCTION_NAME'))]
if __name__ == '__main__':
app.run(host='0.0.0.0', port=9000)
Penjelasan kode sebagai berikut:
@app.route('/', defaults={'path': ''}): Rute default yang sesuai dengan path root.@app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE']): Rute dinamis dengan parameter path yang menangani permintaan GET, POST, PUT, dan DELETE. Nilai parameter path diteruskan ke fungsi hello_world sebagai argumen path.rid = request.headers.get(REQUEST_ID_HEADER): Mendapatkan nilai bidangx-fc-request-iddari header permintaan.data = request.stream.read(): Membaca konten permintaan dan menetapkannya ke variabel data.return "Hello, World!", 200, [('Function-Name', os.getenv('FC_FUNCTION_NAME'))]: Mengembalikan badan respons yang berisi "Hello, World!", menetapkan kode status ke 200, dan menyertakan tupel dengan headerFunction-Name.