Setelah Anda mengimplementasikan dan mengonfigurasi kait siklus hidup instans, Function Compute memanggil kait yang sesuai untuk peristiwa siklus hidup instans tertentu. Topik ini menjelaskan cara mengimplementasikan kait tersebut dalam custom image.
Latar Belakang
Siklus hidup instans mencakup kait Initializer dan kait PreStop. Kait Initializer memiliki dua jenis: invoke code dan execute instruction. Saat ini, hanya fungsi yang dipercepat GPU yang mendukung jenis execute instruction. Untuk informasi selengkapnya, lihat Konfigurasi siklus hidup instans.
Kait siklus hidup instans mengikuti aturan penagihan yang sama dengan permintaan pemanggilan biasa. Namun, log eksekusinya hanya tersedia di Real-time Log, Function Logs, atau Advanced Logs, dan tidak muncul di Invocation Request List. Untuk informasi selengkapnya, lihat Melihat log kait siklus hidup instans.
Saat ini, log dari kait execute instruction tidak dapat ditulis ke Function Log.
Implementasi metode panggilan balik
Function Compute memanggil kait yang sesuai untuk peristiwa siklus hidup instans tertentu. Siklus hidup instans mencakup kait Initializer dan kait PreStop. Kait Initializer mendukung dua jenis: invoke code dan execute instruction. Anda tidak dapat mengonfigurasi kedua jenis secara bersamaan; hanya satu yang dapat aktif pada satu waktu.
Invoke code
Setelah Anda mengonfigurasi kait invoke code, sistem mengirim permintaan HTTP ke fungsi Anda, seperti POST /initialize atau GET /pre-stop, ketika instans dimulai atau akan dihentikan. Anda harus menangani permintaan tersebut dalam kode aplikasi Anda.
Path | Request | Expected response |
(Opsional) POST |
| Response body: Nilai kembali dari kait Initializer fungsi. StatusCode
Catatan Jika kait Initializer gagal atau timeout, server selalu mengembalikan kode status HTTP 200. Untuk memastikan adanya kegagalan, Anda harus memeriksa header respons |
(Opsional) GET |
| Response body: Nilai kembali dari kait PreStop fungsi. |
Untuk menggunakan kait Initializer dalam custom image, server HTTP Anda harus mengimplementasikan logika untuk path /initialize dengan metode POST. Hal yang sama berlaku untuk kait PreStop, yang memerlukan logika untuk path /pre-stop dengan metode GET. Contoh kode berikut menunjukkan implementasi untuk runtime Python 3.10 kustom.
Anda hanya perlu mengimplementasikan logika /initialize jika Anda mengonfigurasi kait Initializer. Jika kait tidak dikonfigurasi, kode terkait apa pun di server HTTP Anda tidak akan pernah dipanggil. Hal yang sama berlaku untuk kait PreStop dan path /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 tindakan 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 tindakan 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 tindakan Anda
print("FC PreStop End RequestId: " + rid)
return "OK"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=9000)
Contoh sebelumnya menunjukkan inisialisasi yang berhasil. Contoh berikut menunjukkan bagaimana kait /initialize dapat gagal dalam Python.
@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
Kait execute instruction menjalankan perintah untuk menginisialisasi instans setelah dimulai. Anda dapat menggunakan shell apa pun yang didukung oleh lingkungan runtime fungsi, seperti /bin/bash, /bin/sh, /bin/csh, atau /bin/zsh.
Konsol Function Compute menyediakan dua opsi preset: /bin/bash dan /bin/sh. Topik ini menggunakan /bin/sh sebagai contoh.
#!/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
fiKode keluar (exit code) 0 menunjukkan keberhasilan. Kode keluar lainnya menunjukkan kegagalan. Untuk membantu troubleshooting, Anda dapat menulis detail kesalahan ke standard error (stderr) dalam skrip. Misalnya, cuplikan berikut menunjukkan cara mengeluarkan detail kesalahan dan mengatur kode keluar menjadi 1 ketika 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
Kode kesalahan | Deskripsi |
400 |
|
404 | |
500 | Function Compute me-restart instans. |
Execute instruction
Jika kode keluar bukan 0, instruksi gagal dan tidak dieksekusi ulang. Sistem kemudian mengembalikan kesalahan.
Mengonfigurasi instance lifecycle hooks
Masuk ke Konsol Function Compute. Di panel navigasi kiri, pilih .
Di bilah navigasi atas, pilih wilayah. Di halaman Functions, klik fungsi target.
Di halaman detail fungsi, klik tab Configuration. Di bagian Instance Configuration, klik Modify.
Di panel Instance Configuration, konfigurasi kait Initializer dan atur Initializer Timeout.
Invoke code

Execute instruction
Konsol menyediakan dua shell preset:
/bin/bashdan/bin/sh.
Di panel Instance Configuration, konfigurasi kait PreStop dan atur timeout-nya. Lalu klik Deploy.

Melihat log kait siklus hidup instans
Saat ini, log dari kait execute instruction tidak dapat ditulis ke Function Log.
Anda dapat melihat log kait di Function Logs.
Masuk ke Konsol Function Compute. Di panel navigasi kiri, pilih .
Di bilah navigasi atas, pilih wilayah. Di halaman Functions, klik fungsi target.
Di halaman detail fungsi, klik tab Test, klik Test Function, lalu pilih .
Di tab Function Logs, 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*******Instans fungsi di-cache selama periode tertentu dan tidak langsung dihapus, sehingga log kait PreStop mungkin tidak muncul segera. Untuk memicu kait PreStop lebih cepat, perbarui konfigurasi atau kode fungsi. Setelah pembaruan selesai, lihat kembali Function Logs untuk melihat log kait PreStop. 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*******