Topik ini menjelaskan metode dan batasan pemanggilan fungsi dalam runtime Custom Container serta menyediakan contoh kode.
Latar Belakang
Runtime Custom Container mendukung hosting server HTTP. Sistem mengonversi permintaan pemanggilan fungsi menjadi permintaan HTTP, mengirimkan permintaan tersebut ke server HTTP, mengonversi respons HTTP menjadi respons pemanggilan fungsi, dan kemudian mengembalikan respons pemanggilan fungsi ke klien. Gambar berikut menunjukkan prosesnya.
Fungsi dapat dipanggil menggunakan salah satu metode berikut:
Panggilan HTTP (direkomendasikan): Fungsi dapat dipanggil menggunakan panggilan HTTP. Sebagai contoh, Anda dapat memanggil fungsi menggunakan Pemicu HTTP atau nama domain default.
Panggilan API: Anda dapat memanggil fungsi dengan memanggil operasi InvokeFunction. Sebagai contoh, Anda dapat memanggil fungsi menggunakan SDK atau memicu fungsi menggunakan sumber acara.
Format permintaan dan respons server HTTP bervariasi tergantung pada metode pemanggilan.
Batasan
Hanya satu Pemicu HTTP yang dapat dibuat untuk fungsi HTTP di setiap versi atau alias. Untuk informasi lebih lanjut, lihat Kelola versi dan Kelola alias.
Batasan pada permintaan HTTP
Header permintaan tidak mendukung bidang kustom yang dimulai dengan x-fc- atau bidang-bidang berikut:
connection
keep-alive
Sistem mengembalikan kode status
400dan kode kesalahanInvalidArgumentjika permintaan melebihi salah satu batasan berikut:Ukuran header: Total ukuran semua kunci dan nilai dalam header tidak boleh melebihi 8 KB.
Ukuran path: Total ukuran path, termasuk semua parameter query, tidak boleh melebihi 4 KB.
Ukuran body: Total ukuran body dari permintaan pemanggilan sinkron tidak boleh melebihi 32 MB. Total ukuran body dari permintaan pemanggilan asinkron tidak boleh melebihi 128 KB.
Batasan pada respons HTTP
Header respons tidak mendukung bidang kustom yang dimulai dengan x-fc- atau bidang-bidang berikut:
connection
content-length
date
keep-alive
server
content-disposition:attachment
CatatanUntuk alasan keamanan, jika Anda menggunakan nama domain default aliyuncs.com dari Function Compute, server secara paksa menambahkan bidang content-disposition: attachment ke header respons. Bidang ini membuat hasil yang dikembalikan diunduh sebagai lampiran di browser. Untuk menghapus batasan ini, Anda harus menentukan nama domain kustom. Untuk informasi lebih lanjut, lihat Konfigurasi nama domain kustom.
Jika respons melebihi salah satu batasan berikut, sistem mengembalikan kode status
502dan kesalahanBadResponse:Ukuran header: Total ukuran semua kunci dan nilai dalam header tidak boleh melebihi 8 KB.
Lainnya
Anda dapat memetakan jalur HTTP yang berbeda untuk fungsi dengan mengikat nama domain kustom. Untuk informasi lebih lanjut, lihat Konfigurasi nama domain kustom.
Panggilan HTTP (direkomendasikan)
Untuk panggilan HTTP, Function Compute meneruskan permintaan HTTP dari klien ke server HTTP dan respons server HTTP ke klien menggunakan mode passthrough. Beberapa bidang cadangan sistem tidak dapat diteruskan. Untuk informasi lebih lanjut, lihat Batasan.
Header permintaan HTTP
Jika Anda menggunakan Pemicu HTTP atau nama domain default untuk memanggil fungsi, Anda dapat menggunakan header permintaan untuk mengontrol perilaku permintaan dalam Function Compute. Tabel berikut menjelaskan detailnya.
Parameter | Tipe | Diperlukan | Contoh | Deskripsi |
X-Fc-Invocation-Type | String | Tidak | Sync | Mode pemanggilan. Untuk informasi lebih lanjut, lihat Metode pemanggilan. Nilai valid:
|
X-Fc-Log-Type | String | Tidak | Tail | Metode yang digunakan untuk mengembalikan log. Nilai valid:
|
Header respons HTTP
Ketika Anda menggunakan Pemicu HTTP atau nama domain default untuk memanggil fungsi, respons berisi beberapa header respons yang secara otomatis ditambahkan oleh Function Compute. Tabel berikut menjelaskan detailnya.
Parameter | Deskripsi | Contoh |
X-Fc-Request-Id | ID permintaan pemanggilan fungsi. | dab25e58-9356-4e3f-97d6-f044c4**** |
Panggilan API
Untuk pemanggilan fungsi yang diinisiasi oleh operasi InvokeFunction, Function Compute mengonversi permintaan yang dikirim dari operasi InvokeFunction menjadi permintaan HTTP dan meneruskan permintaan tersebut ke klien. Aturan konversi berikut berlaku:
Parameter event dari InvokeFunction dikonversi menjadi badan pesan permintaan HTTP.
pathdisetel ke/invoke.methoddisetel kePOST.Content-Typedisetel keapplication/octe-stream.
Function Compute mengonversi respons server HTTP menjadi respons InvokeFunction dan mengembalikan respons tersebut ke klien. Aturan konversi berikut berlaku:
Badan respons HTTP dikonversi menjadi badan respons InvokeFunction.
Informasi header respons HTTP dan kode status hilang selama konversi.
Contoh konversi permintaan InvokeFunction
Permintaan InvokeFunction | Permintaan HTTP yang diterima oleh server HTTP |
Konten permintaan InvokeFunction: | |
Contoh keluaran respons InvokeFunction
Respons HTTP | Respons InvokeFunction |
| |
| |
Contoh kode
Saat Anda mengonfigurasi pemicu untuk fungsi Anda, Anda dapat mengimplementasikan server HTTP dalam bahasa apa pun. Python digunakan sebagai contoh dalam topik ini.
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)
Deskripsi:
@app.route('/', defaults={'path': ''}): rute default, yang sesuai dengan direktori root.@app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE']): rute dinamis yang berisi parameter path. Permintaan GET, POST, PUT, dan DELETE dapat diproses. Nilai parameter path diteruskan ke fungsi hello_world sebagai parameter path.rid = request.headers.get(REQUEST_ID_HEADER): mendapatkan nilai bidangx-fc-request-iddalam header permintaan.data = request.stream.read(): membaca isi permintaan dan menetapkannya ke variabel data.return "Hello, World!", 200, [('Function-Name', os.getenv('FC_FUNCTION_NAME'))]: mengembalikan badan respons yang berisi "Hello, World!" dan menetapkan kode status menjadi 200 serta tuple yang berisi headerFunction-Name.