Lingkungan eksekusi Lambda - AWS Lambda

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

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.

Waktu pengoperasian fungsi tersebut berkomunikasi dengan Lambda menggunakan API Waktu Pengoperasian. Ekstensi berkomunikasi dengan Lambda menggunakan API Ekstensi. Ekstensi juga dapat menerima pesan log dan telemetri lain dari fungsi dengan menggunakan API Telemetri.

Diagram arsitektur untuk lingkungan eksekusi.

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

Fase Init diikuti dengan satu atau beberapa invokasi fungsi. Ketika tidak ada permintaan invokasi, Lambda menginisialisasi fase Shutdown.

Setiap fase dimulai dengan kejadian yang dikirimkan Lambda ke waktu pengoperasian dan ke semua ekstensi terdaftar. Waktu pengoperasian dan setiap ekstensi menunjukkan penyelesaian dengan mengirimkan permintaan API Next. Lambda membekukan lingkungan eksekusi saat waktu pengoperasian dan setiap ekstensi telah selesai dan tidak ada kejadian yang tertunda.

Fase inisialisasi

Di fase Init, Lambda melakukan tiga tugas:

Fase Init berakhir ketika waktu pengoperasian dan semua ekstensi menandakan bahwa ekstensi siap dengan mengirim permintaan API Next. 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 — Log INIT_REPORT untuk batas waktu
INIT_REPORT Init Duration: 1236.04 ms Phase: init Status: timeout
contoh — Log INIT_REPORT 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 hook 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

Saat fungsi Lambda diinvokasi untuk menanggapi permintaan API Next, Lambda mengirim kejadian Invoke ke waktu pengoperasian dan untuk setiap perpanjangan.

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 invokasi berakhir ketika waktu pengoperasian dan semua ekstensi menandakan bahwa ekstensi selesai dengan mengirim permintaan API Next.

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 fase INIT, yang berjalan tanpa kesalahan.

  • Fase kedua adalah fase INVOKE, yang berjalan tanpa kesalahan.

  • Pada titik tertentu, misalkan fungsi Anda mengalami kegagalan pemanggilan (seperti batas waktu fungsi atau kesalahan runtime). Fase ketiga, berlabel INVOKE WITH ERROR, menggambarkan skenario ini. Ketika ini terjadi, layanan Lambda melakukan reset. Reset berperilaku seperti kejadian Shutdown. Pertama, Lambda mematikan runtime, lalu mengirimkan Shutdown 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.

    catatan

    Reset Lambda tidak menghapus konten /tmp direktori sebelum fase init berikutnya. Perilaku ini konsisten dengan fase shutdown reguler.

  • Fase keempat mewakili fase INVOKE 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 INIT tambahan di Log. CloudWatch Sebagai gantinya, Anda mungkin memperhatikan bahwa durasi di baris LAPORAN menyertakan durasi INIT tambahan+durasi INVOKE. 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 adalah 2,5 detik. Ini tidak cocok dengan durasi yang dilaporkan 3022,91 milldetik, karena tidak memperhitungkan INIT ekstra (init yang ditekan) yang dilakukan Lambda. Dalam contoh ini, Anda dapat menyimpulkan bahwa fase INVOKE yang sebenarnya membutuhkan waktu 2,5 detik.

    Untuk wawasan lebih lanjut tentang perilaku ini, Anda dapat menggunakanAPI Telemetri Lambda. API Telemetri memancarkanINIT_START,INIT_RUNTIME_DONE, dan INIT_REPORT peristiwa dengan input yang ditekan phase=invoke setiap kali terjadi di antara fase pemanggilan.

  • Fase kelima mewakili fase SHUTDOWN, 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. Kejadian Shutdown adalah respons terhadap permintaan API Next.

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 dalam 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 Simple Queue Service). 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.