Setelah Anda mengimplementasikan dan mengonfigurasi kait siklus hidup instans, Function Compute akan memanggil kait yang sesuai ketika peristiwa siklus hidup instans tertentu terjadi. Topik ini menjelaskan cara mengimplementasikan kait siklus hidup instans untuk gambar kustom.
Informasi latar belakang
Siklus hidup instans fungsi melibatkan kait Initializer dan PreStop. Kait Initializer mencakup dua jenis: invoke code dan execute instruction. Saat ini, hanya fungsi yang dipercepat GPU yang mendukung kait Initializer jenis execute instruction. Untuk informasi selengkapnya, lihat Konfigurasi siklus hidup instans.
Kait siklus hidup instans ditagih dengan cara yang sama seperti permintaan pemanggilan biasa. Log eksekusinya hanya muncul di Real-time Log, Function Log, atau Advanced Log, dan tidak ditampilkan di Invocation Request List. Untuk informasi selengkapnya, lihat Melihat log kait siklus hidup instans.
Saat ini, log yang dihasilkan oleh kait `execute instruction` tidak dapat ditulis ke log fungsi.
Implementasikan metode panggilan balik
Ketika peristiwa siklus hidup instans tertentu terjadi, Function Compute akan memanggil kait yang sesuai. Siklus hidup instans mencakup kait Initializer dan PreStop. Kait Initializer dapat berupa salah satu dari dua jenis: invoke code atau execute instruction. Anda hanya dapat mengonfigurasi satu jenis kait Initializer dalam satu waktu.
Invoke code
Setelah Anda mengonfigurasi kait `invoke code`, sistem akan mengirim permintaan HTTP ke fungsi Anda. Permintaan `POST /initialize` dikirim saat instans dimulai, dan permintaan `GET /pre-stop` dikirim saat instans dihentikan. Anda harus menangani permintaan ini dalam kode bisnis Anda.
Jalur | Permintaan masukan | Tanggapan yang diharapkan |
(Opsional) POST |
| Badan tanggapan: Nilai kembali dari Initializer fungsi. KodeStatus
Catatan Ketika kait Initializer mengalami timeout atau gagal, server selalu mengembalikan kode status HTTP 200. Anda harus memeriksa header tanggapan |
(Opsional) GET |
| Badan tanggapan: Nilai kembali dari PreStop fungsi. KodeStatus
|
Untuk menggunakan kait Initializer dalam gambar kustom, Anda harus mengimplementasikan logika untuk jalur `POST /initialize` di server HTTP Anda. Demikian pula, untuk kait PreStop, Anda harus mengimplementasikan logika untuk jalur `GET /pre-stop`. Contoh berikut menggunakan runtime kustom untuk Python 3.10.
Jika Anda tidak mengonfigurasi kait Initializer saat membuat fungsi, Anda tidak perlu mengimplementasikan jalur `/initialize`. Jika Anda mengimplementasikan jalur `/initialize` tetapi tidak mengonfigurasi kait tersebut, logika dalam kode Anda tidak akan dipanggil. Hal yang sama berlaku untuk kait PreStop dan jalur `/pre-stop`.
import os
from flask import Flask
from flask import request
app = Flask(__name__)
@app.route('/initialize', methods=['POST'])
def init_invoke():
rid = request.headers.get('x-fc-request-id')
print("FC Initialize Start RequestId: " + rid)
# lakukan hal-hal Anda
print("FC Initialize End RequestId: " + rid)
return "OK"
@app.route('/', defaults={'path': ''})
@app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE'])
def hello_world(path):
rid = request.headers.get('x-fc-request-id')
print("FC invoke Start RequestId: " + rid)
# lakukan hal-hal Anda
print("FC invoke End RequestId: " + rid)
return "Hello, World!", 200, [('Function-Name', os.getenv('FC_FUNCTION_NAME'))]
@app.route('/pre-stop', methods=['GET'])
def prestop_invoke():
rid = request.headers.get('x-fc-request-id')
print("FC PreStop Start RequestId: " + rid)
# lakukan hal-hal Anda
print("FC PreStop End RequestId: " + rid)
return "OK"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=9000)
Selain kode di atas, kesalahan eksekusi fungsi juga dapat terjadi dalam Python. Kode berikut menunjukkan contoh skenario kesalahan untuk /initialize.
@app.route('/initialize', methods=['POST'])
def init():
raise Exception("hahaha")
return "OK", 200, []@app.route('/initialize', methods=['POST'])
def init():
return "OK", 404, []Execute instruction
Anda dapat mengonfigurasi instruksi panggilan balik untuk melakukan operasi inisialisasi setelah instans fungsi dimulai. Anda dapat menggunakan implementasi shell apa pun yang didukung oleh lingkungan runtime fungsi, seperti /bin/bash, /bin/sh, /bin/csh, atau /bin/zsh.
Konsol Function Compute menyediakan dua shell prasetel: /bin/bash dan /bin/sh. Contoh berikut menggunakan /bin/sh.
#!/bin/sh
URL="http://localhost:7860"
REQUEST_PATH="sdapi/v1/txt2img"
JSON_DATA='{
"prompt": "",
"steps": 1,
"height": 8,
"width": 8
}'
temp_file=$(mktemp)
trap 'rm -f "$temp_file"' EXIT
if ! http_code=$(curl -s -w "%{http_code}" \
-H "Content-Type: application/json" \
-d "$JSON_DATA" \
-o "$temp_file" \
-X POST "$URL"/"$REQUEST_PATH"); then
echo "{\"status\": \"curl_error\", \"code\": $curl_exit_code}" \
| jq . >&2
exit 1
fi
response=$(<"$temp_file")
echo "http code $http_code"
if [ "$http_code" -eq 200 ]; then
echo "$response" | jq -r '.' || printf "%s\n" "$response"
exit 0
else
echo "$response_body" \
| jq -c 'if type == "object" then . else {raw: .} end' 2>/dev/null \
| jq -s '{status: "http_error", code: $code, response: .[0]}' \
--arg code "$http_code" \
>&2
exit 1
fiJika kode keluar dari instruksi panggilan balik adalah 0, eksekusi berhasil. Kode keluar lainnya menunjukkan kegagalan. Anda dapat mengeluarkan pesan kesalahan ke standard error (stderr) dalam skrip untuk membantu mendiagnosis kesalahan. Misalnya, potongan kode berikut menunjukkan cara mengeluarkan informasi kesalahan dan mengatur kode keluar menjadi 1 setelah permintaan curl gagal.
if ! http_code=$(curl -s -w "%{http_code}" \
-H "Content-Type: application/json" \
-d "$JSON_DATA" \
-o "$temp_file" \
-X POST "$URL"/"$REQUEST_PATH"); then
echo "{\"status\": \"curl_error\", \"code\": $curl_exit_code}" \
| jq . >&2
exit 1
fiKode kesalahan panggilan balik
Invoke code
ID kode kesalahan | Deskripsi |
400 |
|
404 | |
500 | Function Compute me-restart instans. |
Execute instruction
Jika kode keluar dari instruksi bukan 0, instruksi tersebut tidak dieksekusi ulang, dan sistem akan mengembalikan kesalahan.
Konfigurasi kait siklus hidup
Masuk ke Konsol Function Compute. Di panel navigasi sebelah kiri, pilih .
Di bilah navigasi atas, pilih wilayah. Di halaman Functions, klik fungsi yang dituju.
Di halaman detail fungsi, klik tab Configuration. Di bagian Instance Configuration, klik Edit.
Di panel Instance Configuration, konfigurasikan kait Initializer dan atur Initializer Timeout.
Invoke code

Execute instruction
Konsol menyediakan dua shell prasetel:
/bin/bashdan/bin/sh.
Di panel Konfigurasi Instans, konfigurasikan kait PreStop dan atur timeout-nya. Lalu, klik Deploy.

Lihat log kait siklus hidup instans
Saat ini, log yang dihasilkan oleh kait `execute instruction` tidak dapat ditulis ke log fungsi.
Anda dapat menggunakan fitur Function Log untuk melihat log kait.
Masuk ke Konsol Function Compute. Di panel navigasi sebelah kiri, pilih .
Di bilah navigasi atas, pilih wilayah. Di halaman Functions, klik fungsi yang dituju.
Di halaman detail fungsi, klik tab Test, klik Test Function, lalu pilih .
Di tab Function Log, Anda dapat melihat log pemanggilan fungsi dan log kait Initializer. Berikut adalah contohnya.
2024-06-26 10:59:23FC Initialize Start RequestId: 529eab23-9b3a-4ffc-88c8-9a686******* 2024-06-26 10:59:23FC Initialize End RequestId: 529eab23-9b3a-4ffc-88c8-9a686******* 2024-06-26 10:59:25FC Invoke Start RequestId: 1-667b840c-15c49df0-b7dc1******* 2024-06-26 10:59:25FC Invoke End RequestId: 1-667b840c-15c49df0-b7dc1*******Karena setiap instans fungsi di-cache selama periode tertentu dan tidak langsung dihapus, Anda mungkin tidak dapat melihat log kait PreStop secara langsung. Untuk memicu kait PreStop segera, Anda dapat memperbarui konfigurasi atau kode fungsi. Setelah pembaruan selesai, Anda dapat melihat log kait PreStop di Function Log. Berikut adalah contohnya.
2024-06-26 11:04:33FC PreStop Start RequestId: c4385899-f071-490e-a8b7-e33c5******* 2024-06-26 11:04:33FC PreStop End RequestId: c4385899-f071-490e-a8b7-e33c5*******