Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Memahami siklus hidup lingkungan eksekusi Lambda
Lambda melakukan invokasi fungsi dalam lingkungan eksekusi, yang menyediakan lingkungan waktu pengoperasian yang aman dan terisolasi. Lingkungan eksekusi mengelola sumber daya yang diperlukan untuk menjalankan fungsi Anda. Lingkungan eksekusi juga menyediakan dukungan siklus hidup untuk waktu pengoperasian fungsi dan ekstensi eksternal terkait fungsi Anda.
Runtime fungsi berkomunikasi dengan Lambda menggunakan Runtime. API Ekstensi berkomunikasi dengan Lambda menggunakan Ekstensi. API Ekstensi juga dapat menerima pesan log dan telemetri lain dari fungsi dengan menggunakan Telemetri. API
Saat membuat fungsi Lambda, Anda menentukan informasi konfigurasi, seperti jumlah memori yang tersedia dan waktu eksekusi maksimal yang diizinkan untuk fungsi Anda. Lambda menggunakan informasi ini untuk menyiapkan lingkungan eksekusi.
Waktu pengoperasian fungsi dan setiap ekstensi eksternal adalah proses yang berjalan di dalam lingkungan eksekusi. Izin, sumber daya, kredensial, dan variabel lingkungan dibagikan di antara fungsi dan ekstensi.
Siklus hidup lingkungan eksekusi Lambda
Setiap fase dimulai dengan kejadian yang dikirimkan Lambda ke waktu pengoperasian dan ke semua ekstensi terdaftar. Runtime dan setiap ekstensi menunjukkan penyelesaian dengan mengirimkan Next
API permintaan. Lambda membekukan lingkungan eksekusi saat waktu pengoperasian dan setiap ekstensi telah selesai dan tidak ada kejadian yang tertunda.
Topik
Fase inisialisasi
Di fase Init
, Lambda melakukan tiga tugas:
-
Memulai semua ekstensi (
Extension init
) -
Melakukan bootstrap waktu pengoperasian (
Runtime init
) -
Menjalankan kode statis fungsi (
Function init
) -
Jalankan kait beforeCheckpoint runtime apa pun (hanya Lambda) SnapStart
Init
Fase berakhir ketika runtime dan semua ekstensi memberi sinyal bahwa mereka siap dengan mengirim Next
API permintaan. Fase Init
dibatasi 10 detik. Jika ketiga tugas tidak selesai dalam 10 detik, Lambda mencoba kembali Init
fase pada saat pemanggilan fungsi pertama dengan batas waktu fungsi yang dikonfigurasi.
Ketika Lambda SnapStart diaktifkan, Init
fase terjadi ketika Anda mempublikasikan versi fungsi. Lambda menyimpan snapshot memori dan status disk dari lingkungan eksekusi yang diinisialisasi, mempertahankan snapshot terenkripsi, dan menyimpannya dalam cache untuk akses latensi rendah. Jika Anda memiliki hook beforeCheckpoint runtime, maka kode berjalan di akhir Init
fase.
catatan
Batas waktu 10 detik tidak berlaku untuk fungsi yang menggunakan konkurensi yang disediakan atau. SnapStart Untuk konkurensi dan SnapStart fungsi yang disediakan, kode inisialisasi Anda dapat berjalan hingga 15 menit. Batas waktu adalah 130 detik atau batas waktu fungsi yang dikonfigurasi (maksimum 900 detik), mana yang lebih tinggi.
Saat Anda menggunakan konkurensi yang disediakan, Lambda menginisialisasi lingkungan eksekusi saat Anda mengonfigurasi pengaturan PC untuk suatu fungsi. Lambda juga memastikan bahwa lingkungan eksekusi yang diinisialisasi selalu tersedia sebelum pemanggilan. Anda mungkin melihat kesenjangan antara fase pemanggilan dan inisialisasi fungsi Anda. Bergantung pada runtime dan konfigurasi memori fungsi Anda, Anda juga dapat melihat latensi variabel pada pemanggilan pertama pada lingkungan eksekusi yang diinisialisasi.
Untuk fungsi yang menggunakan konkurensi sesuai permintaan, Lambda terkadang dapat menginisialisasi lingkungan eksekusi sebelum permintaan pemanggilan. Ketika ini terjadi, Anda juga dapat mengamati kesenjangan waktu antara fase inisialisasi dan pemanggilan fungsi Anda. Kami menyarankan Anda untuk tidak mengambil ketergantungan pada perilaku ini.
Kegagalan selama fase Init
Jika fungsi macet atau habis waktu selama Init
fase, Lambda memancarkan informasi kesalahan di log. INIT_REPORT
contoh — INIT _ REPORT log untuk batas waktu
INIT_REPORT Init Duration: 1236.04 ms Phase: init Status: timeout
contoh — INIT _ REPORT log untuk kegagalan ekstensi
INIT_REPORT Init Duration: 1236.04 ms Phase: init Status: error Error Type: Extension.Crash
Jika Init
fase berhasil, Lambda tidak memancarkan INIT_REPORT
log SnapStart— kecuali diaktifkan. SnapStart fungsi selalu memancarkanINIT_REPORT
. Untuk informasi selengkapnya, lihat Pemantauan untuk Lambda SnapStart.
Fase pemulihan (hanya Lambda SnapStart )
Saat Anda pertama kali memanggil SnapStartfungsi dan saat fungsi meningkat, Lambda melanjutkan lingkungan eksekusi baru dari snapshot yang bertahan alih-alih menginisialisasi fungsi dari awal. Jika Anda memiliki hook afterRestore() runtime, kode berjalan di akhir Restore
fase. Anda dikenakan biaya untuk durasi kait afterRestore()
runtime. Runtime (JVM) harus dimuat dan kait afterRestore()
runtime harus selesai dalam batas waktu tunggu (10 detik). Jika tidak, Anda akan mendapatkan SnapStartTimeoutException. Ketika Restore
fase selesai, Lambda memanggil fungsi handler (the). Fase invokasi
Kegagalan selama fase Restore
Jika Restore
fase gagal, Lambda memancarkan informasi kesalahan di log. RESTORE_REPORT
contoh — RESTORE _ REPORT log untuk batas waktu
RESTORE_REPORT Restore Duration: 1236.04 ms Status: timeout
contoh — RESTORE _ REPORT log untuk kegagalan kait runtime
RESTORE_REPORT Restore Duration: 1236.04 ms Status: error Error Type: Runtime.ExitError
Untuk informasi lebih lanjut tentang RESTORE_REPORT
log, lihatPemantauan untuk Lambda SnapStart.
Fase invokasi
Ketika fungsi Lambda dipanggil sebagai respons terhadap permintaan Next
API, Lambda mengirimkan Invoke
acara ke runtime dan ke setiap ekstensi.
Pengaturan waktu habis fungsi membatasi durasi seluruh fase Invoke
. Misalnya, jika Anda mengatur waktu fungsi habis sebagai 360 detik, fungsi dan semua ekstensi harus selesai dalam 360 detik. Perhatikan bahwa tidak ada fase pasca-invokasi yang independen. Durasi adalah jumlah semua waktu invokasi (waktu pengoperasian + ekstensi) dan tidak dihitung hingga fungsi dan semua ekstensi selesai dijalankan.
Fase pemanggilan berakhir setelah runtime dan semua ekstensi memberi sinyal bahwa mereka dilakukan dengan mengirimkan permintaan. Next
API
Kegagalan selama fase pemanggilan
Jika fungsi Lambda mengalami crash atau waktu habis selama fase Invoke
, Lambda mengatur ulang lingkungan eksekusi. Diagram berikut menggambarkan perilaku lingkungan eksekusi Lambda ketika ada kegagalan pemanggilan:
Pada diagram sebelumnya:
-
Fase pertama adalah INITfase, yang berjalan tanpa kesalahan.
-
Fase kedua adalah INVOKEfase, yang berjalan tanpa kesalahan.
-
Pada titik tertentu, misalkan fungsi Anda mengalami kegagalan pemanggilan (seperti batas waktu fungsi atau kesalahan runtime). Fase ketiga, berlabel INVOKEWITHERROR, menggambarkan skenario ini. Ketika ini terjadi, layanan Lambda melakukan reset. Reset berperilaku seperti kejadian
Shutdown
. Pertama, Lambda mematikan runtime, lalu mengirimkanShutdown
acara ke setiap ekstensi eksternal terdaftar. Kejadian ini mencakup alasan untuk pematian. Jika lingkungan ini digunakan untuk pemanggilan baru, Lambda menginisialisasi ulang ekstensi dan runtime bersama dengan pemanggilan berikutnya.Perhatikan bahwa reset Lambda tidak menghapus konten
/tmp
direktori sebelum fase init berikutnya. Perilaku ini konsisten dengan fase shutdown reguler.catatan
AWS saat ini menerapkan perubahan pada layanan Lambda. Karena perubahan ini, Anda mungkin melihat perbedaan kecil antara struktur dan konten pesan log sistem dan segmen pelacakan yang dipancarkan oleh fungsi Lambda yang berbeda di Anda. Akun AWS
Jika konfigurasi log sistem fungsi Anda disetel ke teks biasa, perubahan ini memengaruhi pesan log yang ditangkap di CloudWatch Log saat fungsi Anda mengalami kegagalan pemanggilan. Contoh berikut menunjukkan output log dalam format lama dan baru.
Perubahan ini akan diterapkan selama beberapa minggu mendatang, dan semua fungsi di semua Wilayah AWS kecuali China dan GovCloud wilayah akan bertransisi untuk menggunakan pesan log format baru dan segmen pelacakan.
contoh CloudWatch Keluaran log log (runtime atau ekstensi crash) - gaya lama
START RequestId: c3252230-c73d-49f6-8844-968c01d1e2e1 Version: $LATEST RequestId: c3252230-c73d-49f6-8844-968c01d1e2e1 Error: Runtime exited without providing a reason Runtime.ExitError END RequestId: c3252230-c73d-49f6-8844-968c01d1e2e1 REPORT RequestId: c3252230-c73d-49f6-8844-968c01d1e2e1 Duration: 933.59 ms Billed Duration: 934 ms Memory Size: 128 MB Max Memory Used: 9 MB
contoh CloudWatch Keluaran log log (batas waktu fungsi) - gaya lama
START RequestId: b70435cc-261c-4438-b9b6-efe4c8f04b21 Version: $LATEST 2024-03-04T17:22:38.033Z b70435cc-261c-4438-b9b6-efe4c8f04b21 Task timed out after 3.00 seconds END RequestId: b70435cc-261c-4438-b9b6-efe4c8f04b21 REPORT RequestId: b70435cc-261c-4438-b9b6-efe4c8f04b21 Duration: 3004.92 ms Billed Duration: 3000 ms Memory Size: 128 MB Max Memory Used: 33 MB Init Duration: 111.23 ms
Format baru untuk CloudWatch log mencakup
status
bidang tambahan diREPORT
baris. Dalam kasus runtime atau ekstensi crash,REPORT
baris juga menyertakan bidangErrorType
.contoh CloudWatch Keluaran log log (runtime atau ekstensi crash) - gaya baru
START RequestId: 5b866fb1-7154-4af6-8078-6ef6ca4c2ddd Version: $LATEST END RequestId: 5b866fb1-7154-4af6-8078-6ef6ca4c2ddd REPORT RequestId: 5b866fb1-7154-4af6-8078-6ef6ca4c2ddd Duration: 133.61 ms Billed Duration: 133 ms Memory Size: 128 MB Max Memory Used: 31 MB Init Duration: 80.00 ms Status: error Error Type: Runtime.ExitError
contoh CloudWatch Keluaran log log (batas waktu fungsi) - gaya baru
START RequestId: 527cb862-4f5e-49a9-9ae4-a7edc90f0fda Version: $LATEST END RequestId: 527cb862-4f5e-49a9-9ae4-a7edc90f0fda REPORT RequestId: 527cb862-4f5e-49a9-9ae4-a7edc90f0fda Duration: 3016.78 ms Billed Duration: 3016 ms Memory Size: 128 MB Max Memory Used: 31 MB Init Duration: 84.00 ms Status: timeout
-
Fase keempat mewakili INVOKEfase segera setelah kegagalan pemanggilan. Di sini, Lambda menginisialisasi lingkungan lagi dengan menjalankan kembali fase. INIT Ini disebut init yang ditekan. Ketika input yang ditekan terjadi, Lambda tidak secara eksplisit melaporkan fase tambahan di Log. INIT CloudWatch Sebagai gantinya, Anda mungkin memperhatikan bahwa durasi di REPORT baris mencakup INITdurasi INVOKEtambahan+durasi. Misalnya, Anda melihat log berikut di CloudWatch:
2022-12-20T01:00:00.000-08:00 START RequestId: XXX Version: $LATEST 2022-12-20T01:00:02.500-08:00 END RequestId: XXX 2022-12-20T01:00:02.500-08:00 REPORT RequestId: XXX Duration: 3022.91 ms Billed Duration: 3000 ms Memory Size: 512 MB Max Memory Used: 157 MB
Dalam contoh ini, perbedaan antara stempel waktu REPORT dan START stempel waktu adalah 2,5 detik. Ini tidak cocok dengan durasi yang dilaporkan 3022,91 millseconds, karena tidak memperhitungkan ekstra INIT(init yang ditekan) yang dilakukan Lambda. Dalam contoh ini, Anda dapat menyimpulkan bahwa INVOKEfase sebenarnya membutuhkan waktu 2,5 detik.
Untuk wawasan lebih lanjut tentang perilaku ini, Anda dapat menggunakanMengakses data telemetri real-time untuk ekstensi menggunakan Telemetri API. Telemetri API memancarkan
INIT_START
,INIT_RUNTIME_DONE
, danINIT_REPORT
peristiwa dengan inputphase=invoke
setiap kali ditekan terjadi di antara fase pemanggilan. -
Fase kelima mewakili SHUTDOWNfase, yang berjalan tanpa kesalahan.
Fase pematian
Ketika Lambda akan mematikan runtime, ia mengirimkan Shutdown
acara ke setiap ekstensi eksternal yang terdaftar. Ekstensi dapat menggunakan waktu ini untuk tugas pembersihan akhir. Shutdown
Acara ini merupakan respons Next
API atas permintaan.
Durasi: Keseluruhan fase Shutdown
dibatasi hingga 2 detik. Jika waktu pengoperasian atau ekstensi tidak merespons, Lambda menghentikannya melalui sinyal (SIGKILL
).
Setelah fungsi dan semua ekstensi selesai, Lambda mempertahankan lingkungan eksekusi selama beberapa waktu untuk mengantisipasi invokasi fungsi lain. Namun, Lambda menghentikan lingkungan eksekusi setiap beberapa jam untuk memungkinkan pembaruan dan pemeliharaan runtime — bahkan untuk fungsi yang dipanggil terus menerus. Anda tidak boleh berasumsi bahwa lingkungan eksekusi akan bertahan tanpa batas waktu. Untuk informasi selengkapnya, lihat Menerapkan kewarganegaraan dalam fungsi.
Saat fungsinya diinvokasi lagi, Lambda mencairkan lingkungan untuk digunakan kembali. Menggunakan kembali lingkungan eksekusi memiliki implikasi berikut:
-
Objek yang dinyatakan di luar metode penangan fungsi tetap diinisialisasi, memberikan pengoptimalan tambahan ketika fungsi diinvokasi lagi. Misalnya, jika fungsi Lambda Anda menetapkan koneksi database, alih-alih menetapkan kembali koneksi, koneksi asli digunakan dalam invokasi berikutnya. Kami menyarankan Anda menambahkan logika dalam kode untuk memeriksa apakah ada koneksi sebelum membuat yang baru.
-
Setiap lingkungan eksekusi menyediakan antara 512 MB dan 10.240 MB, dalam peningkatan 1-MB, ruang disk di direktori.
/tmp
Isi direktori tetap ada ketika lingkungan eksekusi dibekukan, menyediakan cache sementara yang dapat digunakan untuk beberapa invokasi. Anda dapat menambahkan kode tambahan untuk memeriksa apakah cache memiliki data yang Anda simpan. Untuk informasi lebih lanjut tentang batas ukuran deployment, lihat Kuota Lambda. -
Proses latar belakang atau panggilan balik yang diinisialisasi fungsi Lambda Anda dan tidak selesai ketika fungsi berakhir akan dilanjutkan jika Lambda menggunakan kembali lingkungan eksekusi. Pastikan setiap proses latar belakang atau panggilan balik dalam kode Anda selesai sebelum kode tersebut ditutup.
Menerapkan kewarganegaraan dalam fungsi
Saat menulis kode fungsi Lambda Anda, perlakukan lingkungan eksekusi sebagai stateless, dengan asumsi bahwa itu hanya ada untuk satu pemanggilan. Lambda menghentikan lingkungan eksekusi setiap beberapa jam untuk memungkinkan pembaruan dan pemeliharaan runtime — bahkan untuk fungsi yang dipanggil terus menerus. Inisialisasi status apa pun yang diperlukan (misalnya, mengambil keranjang belanja dari tabel Amazon DynamoDB) saat fungsi Anda dimulai. Sebelum keluar, lakukan perubahan data permanen ke toko tahan lama seperti Amazon Simple Storage Service (Amazon S3), DynamoDB, atau Amazon Simple Queue Service (Amazon). SQS Hindari mengandalkan struktur data yang ada, file sementara, atau status yang mencakup pemanggilan, seperti penghitung atau agregat. Ini memastikan bahwa fungsi Anda menangani setiap pemanggilan secara independen.