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 HTTP 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 (disarankan): Memanggil fungsi melalui HTTP, misalnya dengan menggunakan Pemicu HTTP atau nama domain kustom.
-
Panggilan API: Memanggil fungsi dengan memanggil API InvokeFunction, misalnya dengan menggunakan SDK untuk memanggil fungsi atau dengan memicu fungsi melalui sumber event.
Metode pemanggilan yang berbeda menghasilkan format permintaan dan respons yang berbeda pada server HTTP Anda.
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 mendukung bidang kustom yang diawali dengan
x-fc-atau bidang kustom berikut:-
connection
-
keep-alive
-
-
Jika permintaan melebihi batasan berikut, kode status
400dan kode kesalahanInvalidArgumentakan dikembalikan.-
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 mendukung bidang kustom yang diawali dengan
x-fc-atau bidang kustom berikut:-
connection
-
content-length
-
date
-
keep-alive
-
server
-
content-disposition:attachment
CatatanKarena alasan keamanan, saat Anda menggunakan domain aliyuncs.com bawaan Function Compute, server secara paksa menambahkan header
content-disposition: attachmentke header respons. Header ini menyebabkan respons diunduh sebagai lampiran di browser. Untuk menghapus pembatasan ini, konfigurasikan nama domain kustom.
-
-
Jika respons melebihi batasan berikut, kode status
502dan kode kesalahanBadResponseakan dikembalikan.-
Ukuran header: Ukuran total semua kunci dan nilai dalam header tidak boleh melebihi 8 KB.
-
-
-
Catatan penggunaan lainnya
Anda dapat memetakan path akses HTTP yang berbeda ke fungsi Anda dengan mengikat nama domain kustom. Untuk informasi selengkapnya, lihat Mengonfigurasi nama domain kustom.
Panggilan HTTP (disarankan)
Untuk pemanggilan HTTP, Function Compute menggunakan mode passthrough. Permintaan HTTP dari klien diteruskan langsung ke server HTTP Anda, dan respons dari server HTTP diteruskan kembali ke klien. Beberapa bidang yang dicadangkan sistem tidak diteruskan. Untuk informasi selengkapnya, lihat Batasan.
Header permintaan
Saat Anda memanggil fungsi menggunakan Pemicu HTTP atau nama domain kustom, Function Compute memungkinkan Anda mengonfigurasi header permintaan untuk mengontrol perilaku permintaan. Tabel berikut menjelaskan header permintaan yang didukung.
|
Name |
Type |
Required |
Example |
Description |
|
X-Fc-Invocation-Type |
String |
No |
Sync |
Metode pemanggilan. Untuk informasi selengkapnya, lihat Metode pemanggilan. Nilai yang valid:
|
|
X-Fc-Log-Type |
String |
No |
Tail |
Log yang dikembalikan dalam respons. Nilai yang valid:
|
Header respons
Saat Anda memanggil fungsi menggunakan Pemicu HTTP atau nama domain kustom, respons berisi beberapa header respons yang ditambahkan Function Compute secara default. Tabel berikut menjelaskan header respons tersebut.
|
Name |
Description |
Example |
|
X-Fc-Request-Id |
ID permintaan dari pemanggilan fungsi. |
dab25e58-9356-4e3f-97d6-f044c4**** |
Panggilan API
Untuk pemanggilan menggunakan API InvokeFunction, Function Compute mengonversi permintaan InvokeFunction menjadi permintaan HTTP dan mengirimkannya ke server HTTP Anda. Aturan konversinya sebagai berikut:
-
Parameter
eventdari InvokeFunction dikonversi menjadi badan pesan permintaan HTTP. -
pathadalah/invoke. -
methodadalahPOST. -
Header pesan
Content-Typeadalahapplication/octet-stream.
Function Compute mengonversi respons server HTTP Anda menjadi respons InvokeFunction dan mengembalikannya ke klien. Aturan konversinya sebagai berikut:
-
Body respons HTTP dikonversi menjadi body respons InvokeFunction.
-
Header respons HTTP dan kode status hilang selama konversi.
Contoh konversi permintaan API Invoke
|
Invoke request |
HTTP request (the request received by the HTTP server) |
|
Isi permintaan API Invoke:
|
|
Contoh output respons API Invoke
|
HTTP response |
Invoke response |
|
|
|
|
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 respons serta header respons.
-
Kode respons
StatusCode-
200: berhasil. -
404: gagal.
-
-
Header respons
x-fc-status-
200: berhasil. -
404: gagal.
-
Anda dapat menggunakan header respons x-fc-status untuk melaporkan kepada Function Compute apakah eksekusi fungsi berhasil atau tidak.
-
Jika Anda tidak mengatur
x-fc-status: Function Compute secara default mengasumsikan bahwa pemanggilan berhasil dieksekusi. Namun, fungsi Anda mungkin mengalami pengecualian yang tidak dilaporkan ke Function Compute. Function Compute menganggap eksekusi bebas kesalahan. Hal ini mungkin tidak memengaruhi logika bisnis Anda, tetapi 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)) # Simulate an exception to trigger a runtime error 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
x-fc-status: Jika fungsi Anda mengalami pengecualian, Anda dapat menggunakan header responsx-fc-statusuntuk melaporkan kegagalan eksekusi ke Function Compute, dan informasi stack kesalahan akan dicetak ke log. Seperti yang ditunjukkan pada contoh berikut, setelah Anda mengatur header responsx-fc-statuske404, Function Compute mengidentifikasi pemanggilan tersebut sebagai eksekusi yang gagal. Jenis kesalahannya adalahInvocationError, dan hasil yang dikembalikan adalahmock exception. Contoh kode dalam app.py adalah sebagai berikut:@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 menyarankan agar Anda mengatur baik StatusCode maupun x-fc-status.
Contoh kode
Jika pemicu dikonfigurasi untuk fungsi tersebut, Anda dapat mengimplementasikan server HTTP dalam bahasa apa pun. Topik ini menggunakan Python sebagai contoh. Kode contohnya adalah sebagai berikut.
Kode contoh ini bergantung pada lingkungan Python dan library Flask. Kami menyarankan Anda memilih Web Function sebagai metode pembuatan fungsi dan 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 contoh 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. Rute ini dapat 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-iddalam 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 headerFunction-Name.