Topik ini menjelaskan metode dan batasan pemanggilan fungsi dalam runtime kustom serta menyediakan contoh kode.
Informasi latar belakang
Dalam runtime kustom, server HTTP dapat dihosting. Pemanggilan fungsi dapat diubah menjadi permintaan HTTP dan dikirim ke server HTTP. Respons dari server HTTP kemudian dikirimkan ke klien sebagai respons dari pemanggilan fungsi. Gambar berikut mengilustrasikan proses tersebut.
Fungsi dapat dipanggil menggunakan salah satu metode berikut:
Panggilan HTTP (direkomendasikan): Fungsi dapat dipanggil melalui panggilan HTTP, seperti menggunakan pemicu HTTP atau nama domain kustom.
Panggilan API: Fungsi dapat dipanggil dengan memanggil operasi InvokeFunction, baik melalui SDK maupun sumber acara.
Format permintaan dan respons server HTTP bervariasi tergantung pada metode pemanggilan yang digunakan.
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 Permintaan HTTP
Header permintaan tidak mendukung bidang kustom yang dimulai dengan x-fc- atau bidang berikut:
connection
keep-alive
Sistem akan mengembalikan kode status
400dan kode kesalahanInvalidArgumentjika permintaan melebihi salah satu batasan berikut:Ukuran Header: Ukuran total semua kunci dan nilai dalam header tidak boleh melebihi 8 KB.
Ukuran Jalur: Ukuran total jalur, termasuk semua parameter kueri, tidak boleh melebihi 4 KB.
Ukuran Badan: Ukuran total badan permintaan pemanggilan sinkron tidak boleh melebihi 32 MB. Untuk pemanggilan asinkron, ukuran maksimum adalah 128 KB.
Batasan Respons HTTP
Header respons tidak mendukung bidang kustom yang dimulai dengan x-fc- atau 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 otomatis menambahkan bidang content-disposition: attachment ke header respons. Hal 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 Konfigurasikan Nama Domain Kustom.
Jika respons melebihi salah satu batasan berikut, sistem akan mengembalikan kode status
502dan kesalahanBadResponse:Ukuran Header: Ukuran total 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 Konfigurasikan Nama Domain Kustom.
Panggilan HTTP (direkomendasikan)
Untuk panggilan HTTP, Function Compute meneruskan permintaan HTTP dari klien ke server HTTP dan respons dari 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 kustom untuk memanggil fungsi, Anda dapat menggunakan header permintaan untuk mengontrol perilaku permintaan di Function Compute. Tabel berikut menjelaskan detailnya.
Parameter | Tipe | Wajib | 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
Saat menggunakan pemicu HTTP atau nama domain kustom 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 mengubah permintaan yang dikirim dari operasi InvokeFunction menjadi permintaan HTTP dan meneruskannya ke klien. Aturan konversi berikut berlaku:
Parameter event dari InvokeFunction diubah menjadi badan pesan permintaan HTTP.
pathdisetel ke/invoke.methoddisetel kePOST.Content-Typedisetel keapplication/octe-stream.
Function Compute mengubah respons server HTTP menjadi respons InvokeFunction dan mengembalikannya ke klien. Aturan konversi berikut berlaku:
Badan respons HTTP diubah menjadi badan respons InvokeFunction.
Header respons HTTP dan informasi 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 mengonfigurasi pemicu untuk fungsi Anda, Anda dapat mengimplementasikan server HTTP dalam bahasa apa pun. Python digunakan sebagai contoh dalam topik ini.
Contoh kode bergantung pada lingkungan Python dan pustaka Flask. Kami merekomendasikan Anda memilih Web Function sebagai metode untuk membuat fungsi 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)
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 jalur. Permintaan GET, POST, PUT, dan DELETE dapat diproses. Nilai parameter jalur diteruskan ke fungsi
hello_worldsebagai parameter jalur.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 ke 200 serta tuple yang berisi headerFunction-Name.