Topik ini menjelaskan metode pemanggilan, batasan, dan contoh kode untuk fungsi dalam runtime kustom.
Informasi latar belakang
Runtime kustom dapat menghosting server HTTP Anda. Function Compute mengonversi permintaan pemanggilan fungsi menjadi permintaan HTTP dan mengirimkannya ke server HTTP Anda. Function Compute kemudian mengonversi respons dari server Anda menjadi respons pemanggilan fungsi dan mengembalikannya ke klien. Gambar berikut menunjukkan proses tersebut.
Anda dapat memanggil fungsi dengan salah satu dari dua cara berikut:
-
Panggilan HTTP (Direkomendasikan): Panggil fungsi melalui HTTP menggunakan http trigger atau nama domain kustom.
-
Panggilan API: Panggil fungsi dengan memanggil API InvokeFunction, misalnya menggunakan SDK atau sumber event.
Format permintaan dan respons HTTP bergantung pada metode pemanggilan.
Batasan
-
Anda hanya dapat membuat satu http trigger 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-bidang berikut:
-
connection
-
keep-alive
-
-
Jika permintaan melebihi batasan berikut, Function Compute 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 body: Ukuran total body permintaan untuk pemanggilan sinkron tidak boleh melebihi 32 MB. Ukuran total body permintaan untuk pemanggilan asinkron tidak boleh melebihi 128 KB.
-
-
-
Batasan respons HTTP
-
Header respons tidak boleh berisi bidang kustom yang diawali dengan x-fc- atau bidang-bidang berikut:
-
connection
-
content-length
-
date
-
keep-alive
-
server
-
content-disposition:attachment
CatatanKarena alasan keamanan, saat Anda menggunakan domain aliyuncs.com bawaan untuk Function Compute, server secara paksa menambahkan header content-disposition: attachment ke respons. Header ini menyebabkan respons diunduh sebagai lampiran di browser Anda. Untuk menghapus pembatasan ini, konfigurasikan nama domain kustom.
-
-
Jika respons melebihi batasan berikut, Function Compute mengembalikan kode status
502dan kode kesalahanBadResponse.-
Ukuran header: Ukuran total semua kunci dan nilai dalam header tidak boleh melebihi 8 KB.
-
-
-
Catatan tambahan
Anda dapat memetakan path akses HTTP yang berbeda ke fungsi Anda dengan mengikat nama domain kustom. Untuk informasi selengkapnya, lihat Konfigurasi 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 diteruskan kembali ke klien. Function Compute tidak meneruskan beberapa bidang yang dicadangkan sistem. Untuk informasi selengkapnya, lihat Batasan.
Header permintaan
Saat memanggil fungsi dengan http trigger atau nama domain kustom, gunakan header permintaan yang dijelaskan di bawah ini untuk mengontrol permintaan.
|
Nama |
Tipe |
Wajib |
Contoh |
Deskripsi |
|
X-Fc-Invocation-Type |
String |
Tidak |
Sync |
Menentukan metode pemanggilan. Untuk informasi selengkapnya, lihat Metode pemanggilan. Nilai yang valid:
|
|
X-Fc-Log-Type |
String |
Tidak |
Tail |
Menentukan apakah log dikembalikan dalam respons. Nilai yang valid:
|
Header respons
Function Compute menambahkan header default yang dijelaskan di bawah ini ke respons.
|
Nama |
Deskripsi |
Contoh |
|
X-Fc-Request-Id |
ID permintaan unik untuk pemanggilan fungsi. |
dab25e58-9356-4e3f-97d6-f044c4**** |
Panggilan API
Saat fungsi dipanggil menggunakan API InvokeFunction, Function Compute mengonversi permintaan API menjadi permintaan HTTP dan mengirimkannya ke server HTTP Anda. Konversi mengikuti aturan berikut:
-
Parameter
eventdari permintaan InvokeFunction menjadi body pesan permintaan HTTP. -
pathadalah/invoke. -
methodadalahPOST. -
Header permintaan
Content-Typeadalahapplication/octet-stream.
Function Compute mengonversi respons dari server HTTP Anda menjadi respons API InvokeFunction dan mengembalikannya ke klien. Konversi mengikuti aturan berikut:
-
Body respons HTTP menjadi body respons InvokeFunction.
-
Konversi ini mengabaikan header respons HTTP dan kode status.
Contoh konversi permintaan API InvokeFunction
|
Permintaan invoke |
Permintaan HTTP |
|
Isi permintaan API Invoke:
|
|
Contoh respons API InvokeFunction
|
Respons HTTP |
Respons invoke |
|
|
|
|
Kode respons dan header respons Function Compute
Runtime kustom pada dasarnya adalah server HTTP yang Anda implementasikan. Oleh karena itu, setiap pemanggilan fungsi merupakan permintaan HTTP, dan setiap respons mencakup kode status serta header respons.
-
Kode statusrespons-
200: Berhasil. -
404: Gagal.
-
-
Header respons
x-fc-status-
200: Berhasil. -
404: Gagal.
-
Anda dapat menggunakan header respons x-fc-status untuk melaporkan status eksekusi fungsi ke Function Compute.
-
Jika Anda tidak mengatur header
x-fc-status, Function Compute secara default mengasumsikan pemanggilan berhasil. Namun, jika fungsi Anda mengalami kesalahan tanpa melaporkannya, Function Compute tidak akan mengenali kegagalan tersebut. Hal ini mungkin tidak memengaruhi logika bisnis Anda, tetapi akan berdampak pada pemantauan dan observabilitas. Kode berikut menunjukkan contohnya:print("FC Invoke Start RequestId: " + rid) data = request.stream.read() print("Path: " + path) print("Data: " + str(data)) # Simulasikan pengecualian untuk memicu error runtime raise Exception("mock exception") print("FC Invoke End RequestId: " + rid) return "Hello, World!" if __name__ == '__main__': app.run(host='0.0.0.0', port=9000) -
Jika Anda mengatur header
x-fc-status, Anda dapat melaporkan kegagalan ke Function Compute dan mencetak jejak stack error ke log saat fungsi Anda mengalami kesalahan. Misalnya, setelah Anda mengatur header responsx-fc-statuske404, Function Compute mengidentifikasi pemanggilan sebagai kegagalan dengan tipeInvocationError, dan hasil pemanggilan adalahmock exception. File app.py berikut memberikan contohnya:@app.route('/', defaults={'path': ''}) @app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE']) def hello_world(path): rid = request.headers.get(REQUEST_ID_HEADER) print("FC Invoke Start RequestId: " + rid) try: raise Exception("mock exception") except Exception as e: print("FC Invoke End RequestId: " + rid + ", Error: Unhandled Exception") print(str(e)) return str(e), 404, [{"x-fc-status", "404"}]
Dalam respons HTTP yang dikembalikan, kami merekomendasikan agar Anda mengatur baik kode status maupun header x-fc-status.
Contoh kode
Saat Anda mengonfigurasi trigger untuk fungsi Anda, Anda dapat mengimplementasikan server HTTP dalam bahasa pemrograman apa pun. Topik ini menggunakan Python sebagai contoh.
Kode contoh ini memerlukan lingkungan Python dan pustaka Flask. Kami merekomendasikan agar Anda membuat fungsi dengan memilih Web Function dan menggunakan 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)
Kode ini bekerja sebagai berikut:
-
@app.route('/', defaults={'path': ''}): Ini adalah rute default yang sesuai dengan path root. -
@app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE']): Ini adalah rute dinamis dengan parameter path yang dapat menangani permintaan GET, POST, PUT, dan DELETE. Rute ini meneruskan nilai parameter path 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 variabeldata. -
return "Hello, World!", 200, [('Function-Name', os.getenv('FC_FUNCTION_NAME'))]: Mengembalikan body respons yang berisi "Hello, World!", kode status 200, dan header responsFunction-Name.