Kait siklus hidup instans menjalankan logika kustom Anda saat sebuah instans fungsi dimulai atau dihentikan. Topik ini menjelaskan cara mengimplementasikan dan mengonfigurasi kait Initializer dan PreStop untuk fungsi yang menggunakan custom image.
Informasi latar belakang
Siklus hidup instans fungsi melibatkan kait Initializer dan PreStop. Function Compute memanggil kait yang sesuai ketika event siklus hidup instans terkait terjadi.
Kait Initializer memiliki dua jenis: invoke code dan execute instruction. Saat ini, hanya fungsi berakselerasi GPU yang mendukung jenis kait Initializer bertipe execute instruction. Untuk informasi selengkapnya, lihat Configure instance lifecycle.
Aturan penagihan untuk kait siklus hidup instans sama dengan permintaan pemanggilan reguler.
Untuk informasi lebih lanjut tentang log kait, lihat View instance lifecycle hook logs.
Jenis kait
Kait Initializer mendukung dua jenis implementasi. Tabel berikut membandingkan keduanya.
Jenis kait | Mekanisme | Cakupan penerapan |
invoke code | Function Compute mengirim permintaan HTTP ke fungsi Anda. Kode bisnis Anda merespons permintaan tersebut. | Kait Initializer dan PreStop |
execute instruction | Function Compute menjalankan perintah shell atau skrip yang Anda konfigurasi. Kode keluar menentukan keberhasilan atau kegagalan. | Hanya untuk kait Initializer pada fungsi berakselerasi GPU |
Anda hanya dapat mengonfigurasi salah satu dari kedua jenis tersebut untuk kait Initializer.
Implementasi kait
Bagian berikut menjelaskan cara mengimplementasikan masing-masing jenis kait.
Invoke code
Setelah Anda mengonfigurasi kait bertipe invoke code, Function Compute mengirim permintaan HTTP POST /initialize atau GET /pre-stop ke fungsi Anda saat instans fungsi dimulai atau dihentikan. Anda harus merespons permintaan tersebut dalam kode bisnis Anda.
Path | Permintaan | Respons yang diharapkan |
(Opsional) POST | Badan permintaan: Tidak ada. Header permintaan: header permintaan umum. Untuk informasi selengkapnya, lihat Function Compute common request headers. | Badan respons: nilai yang dikembalikan oleh Initializer fungsi. Kode status: 2xx: berhasil. Bukan 2xx: gagal. Ketika kait Initializer mengalami timeout atau gagal, server selalu mengembalikan kode status HTTP 200. Gunakan header respons |
(Opsional) GET | Badan permintaan: Tidak ada. Header permintaan: header permintaan umum. Untuk informasi selengkapnya, lihat Function Compute common request headers. | Badan respons: nilai yang dikembalikan oleh PreStop fungsi.
|
Kolom Path ditandai sebagai (Opsional) karena setiap kait merupakan konfigurasi opsional. Jika Anda tidak mengatur Initializer untuk fungsi yang Anda buat, Anda tidak perlu mengimplementasikan /initialize. Dalam kasus ini, meskipun server HTTP Anda mengimplementasikan /initialize, logika /initialize dalam kode Anda tidak akan pernah dipanggil. Hal yang sama berlaku untuk PreStop.
Untuk menggunakan metode kait Initializer dalam custom image, implementasikan logika untuk path /initialize dengan metode POST dalam server HTTP Anda. Hal yang sama berlaku untuk metode kait PreStop. Program contoh berikut menggunakan runtime kustom Python 3.10 sebagai contoh.
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)Kode kait Anda juga dapat gagal saat runtime. Contoh /initialize berikut menunjukkan dua kegagalan khas dan cara Function Compute merespons masing-masing. Untuk perilaku sistem setiap kode kesalahan, lihat Hook error codes.
Pada contoh berikut, penanganan melemparkan exception. Function Compute memperlakukan kegagalan tersebut sebagai error 500 dan memulai ulang instans.
@app.route('/initialize', methods=['POST'])
def init():
raise Exception("hahaha")
return "OK", 200, []Pada contoh berikut, penanganan mengembalikan kode status 404. Function Compute tidak mengirim ulang permintaan.
@app.route('/initialize', methods=['POST'])
def init():
return "OK", 404, []Execute instruction (hanya untuk fungsi berakselerasi GPU)
Jenis execute instruction hanya tersedia untuk fungsi berakselerasi GPU.
Dengan jenis execute instruction, Function Compute menjalankan perintah shell atau skrip yang Anda konfigurasi setelah instans fungsi dimulai. Kode keluar 0 menunjukkan bahwa instruksi kait berhasil dijalankan. Kode keluar lainnya menunjukkan kegagalan.
Anda dapat menggunakan implementasi shell kustom, seperti /bin/bash, /bin/sh, /bin/csh, atau /bin/zsh. Pastikan lingkungan runtime fungsi mendukung implementasi shell yang Anda gunakan.
Konsol Function Compute menyediakan /bin/bash dan /bin/sh sebagai opsi prasetel. Contoh berikut menggunakan /bin/sh. Skrip ini melakukan pemeriksaan kesehatan inisialisasi: menggunakan curl untuk mengirim permintaan ke layanan lokal dan menggunakan jq untuk memformat output. Pastikan kedua alat tersebut tersedia di lingkungan runtime Anda.
#!/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
fiTulis informasi error ke standard error (stderr) dalam skrip Anda untuk membantu menemukan penyebab error. Misalnya, potongan kode berikut menulis informasi error saat permintaan curl gagal dan mengatur kode keluar menjadi 1. Perilaku kegagalan yang sama berlaku: jika instruksi mengembalikan kode keluar bukan nol, instruksi tidak dijalankan lagi dan sistem mengembalikan error terkait. Untuk informasi selengkapnya, lihat Hook error codes.
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
fiKonfigurasi kait siklus hidup
Masuk ke Function Compute console. Di panel navigasi sebelah kiri, pilih Function Management > Functions.
Di bilah navigasi atas, pilih wilayah. Pada halaman Functions, klik fungsi target.
Di halaman detail fungsi, klik tab Configuration. Di bagian Instance Configuration, klik Modify.
Di panel Instance Configuration, konfigurasikan kait Initializer. Aktifkan sakelar Initializer hook, lalu atur Initializer timeout sesuai kebutuhan bisnis Anda. Dalam contoh ini, timeout diatur menjadi
300detik. Untuk hook type, pilih salah satu jenis berikut:invoke code
Setelah kait diaktifkan, Function Compute mengirim permintaan HTTP POST
/initializeke fungsi saat instans dimulai. Kode bisnis Anda harus merespons permintaan tersebut dan mengembalikan kode status 200.execute instruction
Jenis execute instruction hanya tersedia untuk fungsi berakselerasi GPU.
Pilih execute instruction sebagai jenis kait, lalu pilih instruksi shell, seperti /bin/sh. Di editor kode, tulis skrip inisialisasi. Untuk contoh lengkap, lihat Execute instruction (GPU-accelerated functions only).
(Opsional) Konfigurasikan kait PreStop. Aktifkan sakelar PreStop hook, lalu atur PreStop timeout sesuai kebutuhan bisnis Anda. Dalam contoh ini, timeout diatur menjadi
3detik.Klik Deploy.
Verifikasi bahwa kait berjalan efektif. Panggil fungsi, atau perbarui konfigurasi atau kode fungsi, untuk memicu pembuatan dan penghancuran instans. Lalu periksa log kait dengan mengikuti petunjuk di View instance lifecycle hook logs.
Lihat log kait siklus hidup instans
Anda dapat mengkueri log eksekusi kait di Real-time Log, Function Logs, atau Advanced Logs. Invocation Request List tidak menampilkan log kait.
Log yang dihasilkan oleh kait execute instruction tidak dapat ditulis ke Function Logs.
Anda dapat melihat log kait menggunakan fitur Function Logs.
Masuk ke Function Compute console. Di panel navigasi sebelah kiri, pilih Function Management > Functions.
Di bilah navigasi atas, pilih wilayah. Pada halaman Functions, klik fungsi target.
Di halaman detail fungsi, klik tab Test, klik Test Function, lalu pilih Logs > Function Logs.
Di tab Function Logs, Anda dapat melihat log pemanggilan dan log kait Initializer fungsi. Contoh berikut menunjukkan log tersebut.
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*******Setiap instans fungsi di-cache selama periode tertentu dan tidak langsung dihancurkan, sehingga log kait PreStop tidak tersedia segera. Untuk memicu kait PreStop dengan cepat, perbarui konfigurasi fungsi atau kode fungsi. Setelah pembaruan selesai, periksa kembali Function Logs untuk melihat log kait PreStop. Contoh berikut menunjukkan log tersebut.
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*******Kode kesalahan kait
Invoke code
Kode kesalahan | Deskripsi |
400 | Jika kait Initializer fungsi gagal dan mengembalikan 400 atau 404, permintaan tidak dikirim ulang, tetapi sistem terus mencoba hingga pemanggilan berhasil. Jika kait PreStop fungsi gagal dan mengembalikan 400 atau 404, proses pembekuan dan penghentian instans fungsi tidak terpengaruh. |
404 | |
500 | Function Compute memulai ulang instans. |
Execute instruction
Jika instruksi mengembalikan kode keluar bukan nol, instruksi tidak dijalankan lagi dan sistem mengembalikan error terkait. Jika skrip Anda menulis informasi error ke stderr, Anda dapat menggunakan output tersebut untuk menemukan penyebab kegagalan.