View a markdown version of this page

Menggunakan Deteksi Loop Rekursif Lambda untuk Mencegah Loop Tak Terbatas - AWS Lambda

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

Menggunakan Deteksi Loop Rekursif Lambda untuk Mencegah Loop Tak Terbatas

Ketika Anda mengkonfigurasi fungsi Lambda untuk menghasilkan ke layanan atau sumber daya yang sama yang memanggil fungsi, dimungkinkan untuk membuat loop rekursif tak terbatas. Misalnya, fungsi Lambda mungkin menulis pesan ke antrian Amazon Simple Queue Service (Amazon SQS), yang kemudian memanggil fungsi yang sama. Pemanggilan ini menyebabkan fungsi menulis pesan lain ke antrian, yang pada gilirannya memanggil fungsi lagi.

Loop rekursif yang tidak disengaja dapat mengakibatkan tagihan tak terduga kepada Anda. Akun AWS Loop juga dapat menyebabkan Lambda men skalakan dan menggunakan semua konkurensi yang tersedia di akun Anda. Untuk membantu mengurangi dampak loop yang tidak disengaja, Lambda mendeteksi jenis loop rekursif tertentu segera setelah terjadi.

Secara default, ketika Lambda mendeteksi loop rekursif, ia menghentikan fungsi Anda dipanggil dan memberi tahu Anda. Jika desain Anda sengaja menggunakan pola rekursif, Anda dapat mengubah konfigurasi default fungsi untuk memungkinkannya dipanggil secara rekursif. Untuk informasi selengkapnya, lihat Mengizinkan fungsi Lambda berjalan dalam loop rekursif.

Memahami deteksi loop rekursif

Deteksi loop rekursif di Lambda bekerja dengan melacak peristiwa. Lambda adalah layanan komputasi berbasis peristiwa yang menjalankan kode fungsi Anda ketika peristiwa tertentu terjadi. Misalnya, saat item ditambahkan ke antrian Amazon SQS atau topik Amazon Simple Notification Service (Amazon SNS). Lambda meneruskan peristiwa ke fungsi Anda sebagai objek JSON, yang berisi informasi tentang perubahan status sistem. Ketika suatu peristiwa menyebabkan fungsi Anda berjalan, ini disebut pemang gilan.

Untuk mendeteksi loop rekursif, Lambda menggunakan header pel AWS X-Ray acakan. Ketika Layanan AWS dukungan deteksi loop rekursif mengirim peristiwa ke Lambda, peristiwa tersebut secara otomatis dianotasi dengan metadata. Ketika fungsi Lambda Anda menulis salah satu peristiwa ini ke acara lain yang didukung Layanan AWS menggunakan versi AWS SDK yang didukung, fungsi ini akan memperbarui metadata ini. Metadata yang diperbarui mencakup penghitungan berapa kali peristiwa memanggil fungsi.

catatan

Anda tidak perlu mengaktifkan pelacakan X-Ray aktif agar fitur ini berfungsi. Deteksi loop rekursif diaktifkan secara default untuk semua AWS pelanggan. Tidak ada biaya untuk menggunakan fitur ini.

Ran taian permintaan adalah urutan pemanggilan Lambda yang disebabkan oleh peristiwa pemicu yang sama. Misalnya, bayangkan bahwa antrian Amazon SQS memanggil fungsi Lambda Anda. Fungsi Lambda Anda kemudian mengirimkan peristiwa yang diproses kembali ke antrian Amazon SQS yang sama, yang memanggil fungsi Anda lagi. Dalam contoh ini, setiap pemanggilan fungsi Anda berada dalam rantai permintaan yang sama.

Jika fungsi Anda dipanggil sekitar 16 kali dalam rantai permintaan yang sama, maka Lambda secara otomatis menghentikan pemanggilan fungsi berikutnya dalam rantai permintaan tersebut dan memberi tahu Anda. Jika fungsi Anda dikonfigurasi dengan beberapa pemicu, maka pemanggilan dari pemicu lain tidak terpengaruh.

catatan

Bahkan ketika maxReceiveCount pengaturan pada kebijakan redrive antrian sumber lebih tinggi dari 16, perlindungan rekursi Lambda tidak mencegah Amazon SQS mencoba kembali pesan setelah loop rekursif terdeteksi dan dihentikan. Ketika Lambda mendeteksi loop rekursif dan menghapus pemanggilan berikutnya, ia mengembalikan a RecursiveInvocationException ke pemetaan sumber peristiwa. Ini menambah receiveCount nilai pada pesan. Lambda terus mencoba lagi pesan, dan terus memblokir pemanggilan fungsi, sampai Amazon SQS menentukan bahwa pesan tersebut terlampaui dan mengirimkan pesan ke maxReceiveCount antrian huruf mati yang dikonfigurasi.

Jika Anda memiliki tujuan pada kegagalan atau antrian huruf mati yang dikonfigurasi untuk fungsi Anda, maka Lambda juga mengirimkan peristiwa dari pemanggilan yang dihentikan ke tujuan atau antrean huruf mati. Saat mengonfigurasi antrean tujuan atau huruf mati untuk fungsi Anda, pastikan untuk tidak menggunakan pemicu peristiwa atau pemetaan sumber peristiwa yang juga digunakan fungsi Anda. Jika Anda mengirim peristiwa ke sumber daya yang sama yang memanggil fungsi Anda, maka Anda dapat membuat loop rekursif lain dan loop ini juga dihentikan. Jika Anda memilih keluar dari deteksi loop rekursi, loop ini tidak dihentikan.

Didukung Layanan AWS dan SDK

Lambda hanya dapat mendeteksi loop rekursif yang menyertakan dukungan tertentu. Layanan AWS Agar loop rekursif dapat dideteksi, fungsi Anda juga harus menggunakan salah satu SDK yang didukung AWS .

Didukung Layanan AWS

Lambda saat ini mendeteksi loop rekursif antara fungsi Anda, Amazon SQS, Amazon S3, dan Amazon SNS. Lambda juga mendeteksi loop yang hanya terdiri dari fungsi Lambda, yang mungkin saling memanggil secara sinkron atau asinkron. Diagram berikut menunjukkan beberapa contoh loop yang dapat dideteksi Lambda:

Diagram loop rekursif antara fungsi Lambda, Amazon SNS, Amazon S3, dan antrian Amazon SQS.

Ketika yang lain Layanan AWS seperti Amazon DynamoDB membentuk bagian dari loop, Lambda saat ini tidak dapat mendeteksi dan menghentikannya.

Karena Lambda saat ini hanya mendeteksi loop rekursif yang melibatkan Amazon SQS, Amazon S3, dan Amazon SNS, masih mungkin loop yang melibatkan lainnya Layanan AWS dapat mengakibatkan penggunaan fungsi Lambda Anda yang tidak diinginkan.

Untuk mencegah tagihan tak terduga yang ditagih kepada Anda Akun AWS, kami sarankan Anda mengonfigurasi CloudWatch alarm Amazon untuk mengingatkan Anda tentang pola penggunaan yang tidak biasa. Misalnya, Anda dapat mengonfigurasi CloudWatch untuk memberi tahu Anda tentang lonjakan dalam konkurensi fungsi Lambda atau pemanggilan. Anda juga dapat mengonfigurasi alarm penagihan untuk memberi tahu Anda saat pengeluaran di akun Anda melebihi ambang batas yang Anda tentukan. Atau, Anda dapat menggunakannya AWS Cost Anomaly Detection untuk mengingatkan Anda tentang pola penagihan yang tidak biasa.

Didukung AWS SDK

Agar Lambda dapat mendeteksi loop rekursif, fungsi Anda harus menggunakan salah satu versi SDK berikut atau lebih tinggi:

Waktu Aktif Versi AWS SDK minimum yang diperlukan

Node.js

2.1147.0 (SDK versi 2)

3.105.0 (SDK versi 3)

Python

1.24.46 (suara2)

1.27.46 (botocore)

Java 8 dan Java 11

2.17.135

Jawa 17

2.20.81

Jawa 21

2.21.24

.NET

3.7.293.0

Ruby

3.134.0

PHP

3.232.0

Go

V2 SDK 1.57.0

Beberapa runtime Lambda seperti Python dan Node.js menyertakan versi SDK. AWS Jika versi SDK yang disertakan dalam runtime fungsi Anda lebih rendah dari minimum yang diperlukan, maka Anda dapat menambahkan versi SDK yang didukung ke paket penerapan fungsi Anda. Anda juga dapat menambahkan versi SDK yang didukung ke fungsi Anda menggunakan lapisan Mengelola dependensi Lambda dengan lapisan Lambda. Untuk daftar SDK yang disertakan dengan setiap runtime Lambda, lihat. Runtime Lambda

Pemberitahuan loop rekursif

Ketika Lambda menghentikan loop rekursif, Anda menerima pemberitahuan melalui Dasbor Health dan melalui email. Anda juga dapat menggunakan CloudWatch metrik untuk memantau jumlah pemanggilan rekursif yang telah dihentikan Lambda.

Dasbor Health notifikasi

Ketika Lambda menghentikan pemanggilan rekursif, akan Dasbor Health menampilkan pemberitahuan di halaman kesehatan akun Anda, di bawah Masalah terbuka dan terbaru. Perhatikan bahwa dapat memakan waktu hingga 3,5 jam setelah Lambda menghentikan pemanggilan rekursif sebelum pemberitahuan ini ditampilkan. Untuk informasi selengkapnya tentang melihat peristiwa akun di Dasbor Health, lihat Mem ulai dengan AWS Dasbor Kesehatan — Kesehatan akun Anda di Panduan Pengguna AWS Kesehatan.

Peringatan email

Ketika Lambda pertama kali menghentikan pemanggilan rekursif fungsi Anda, ia mengirimi Anda peringatan email. Lambda mengirimkan maksimal satu email setiap 24 jam untuk setiap fungsi di Anda Akun AWS. Setelah Lambda mengirim pemberitahuan email, Anda tidak akan menerima email lagi untuk fungsi itu selama 24 jam lagi, bahkan jika Lambda menghentikan pemanggilan rekursif lebih lanjut dari fungsi tersebut. Perhatikan bahwa dapat memakan waktu hingga 3,5 jam setelah Lambda menghentikan pemanggilan rekursif sebelum Anda menerima peringatan email ini.

Lambda mengirimkan peringatan email loop rekursif ke kontak akun utama dan kontak operasi alternatif Anda Akun AWS. Untuk informasi tentang melihat atau memperbarui alamat email di akun Anda, lihat Memper barui informasi kontak di Refer AWS ensi Umum.

CloudWatch Metrik Amazon

CloudWatch Metrik RecursiveInvocationsDropped mencatat jumlah pemanggilan fungsi yang telah dihentikan Lambda karena fungsi Anda telah dipanggil lebih dari sekitar 16 kali dalam satu rantai permintaan. Lambda memancarkan metrik ini segera setelah menghentikan pemanggilan rekursif. Untuk melihat metrik ini, ikuti petunjuk untuk Melihat metrik di CloudWatch konsol dan pilih metrikRecursiveInvocationsDropped.

Menanggapi pemberitahuan deteksi loop rekursif

Ketika fungsi Anda dipanggil lebih dari sekitar 16 kali oleh peristiwa pemicu yang sama, Lambda menghentikan pemanggilan fungsi berikutnya untuk peristiwa itu untuk memutus loop rekursif. Untuk mencegah terjadinya kembali loop rekursif yang telah rusak Lambda, lakukan hal berikut:

  • Kurangi konkurensi fungsi Anda yang tersedia Memahami penskalaan fungsi Lambda menjadi nol, yang membatasi semua pemanggilan di masa mendatang.

  • Hapus atau nonaktifkan pemetaan sumber pemicu atau peristiwa yang memanggil fungsi Anda.

  • Mengidentifikasi dan memperbaiki cacat kode yang menulis peristiwa kembali ke AWS sumber daya yang memanggil fungsi Anda. Sumber cacat umum terjadi ketika Anda menggunakan variabel untuk menentukan sumber dan target peristiwa fungsi. Pastikan Anda tidak menggunakan nilai yang sama untuk kedua variabel.

Selain itu, jika sumber peristiwa untuk fungsi Lambda Anda adalah antrian Amazon SQS, pertimbangkan untuk mengonfigurasi antrean huruf mati pada antrian sumber.

catatan

Pastikan Anda mengonfigurasi antrean surat gagal di antrean sumber, bukan di fungsi Lambda. Antrean surat gagal yang dikonfigurasikan di fungsi digunakan untuk antrean invokasi asinkron fungsi, bukan untuk antrean sumber kejadian.

Jika sumber peristiwa adalah topik Amazon SNS, pertimbangkan untuk menambahkan tujuan saat gagal untuk fungsi Anda.

Untuk mengurangi konkurensi fungsi yang tersedia menjadi nol (konsol)
  1. Buka halaman Fungsi di konsol Lambda.

  2. Pilih nama fungsi Anda.

  3. Pilih Throttle.

  4. Di kotak dialog Throttle your function, pilih Con firm.

Untuk menghapus pemicu atau pemetaan sumber peristiwa untuk fungsi Anda (konsol)
  1. Buka halaman Fungsi di konsol Lambda.

  2. Pilih nama fungsi Anda.

  3. Pilih tab Konfigurasi, lalu pilih Pem icu.

  4. Di bawah Pem icu, pilih pemetaan sumber pemicu atau peristiwa yang ingin Anda hapus, lalu pilih H apus.

  5. Di kotak dialog Hapus pemicu, pilih H apus.

Untuk menonaktifkan pemetaan sumber peristiwa untuk fungsi Anda (AWS CLI)
  1. Untuk menemukan UUID untuk pemetaan sumber peristiwa yang ingin Anda nonaktifkan, jalankan perintah AWS Command Line Interface (AWS CLI) list-event- source-mappings.

    aws lambda list-event-source-mappings
  2. Untuk menonaktifkan pemetaan sumber peristiwa, jalankan perintah AWS CLI update-event-source-mapping berikut ini.

    aws lambda update-event-source-mapping --function-name MyFunction \ --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 --no-enabled

Mengizinkan fungsi Lambda berjalan dalam loop rekursif

Jika desain Anda sengaja menggunakan loop rekursif, Anda dapat mengonfigurasi fungsi Lambda untuk memungkinkannya dipanggil secara rekursif. Kami menyarankan Anda menghindari menggunakan loop rekursif dalam desain Anda. Kesalahan implementasi dapat menyebabkan pemanggilan rekursif menggunakan semua konkurensi yang tersedia dan Akun AWS tagihan tak terduga ditagih ke akun Anda.

penting

Jika Anda menggunakan loop rekursif, perlakukan mereka dengan hati-hati. Menerapkan rel pelindung praktik terbaik untuk meminimalkan risiko kesalahan implementasi. Untuk mempelajari lebih lanjut tentang praktik terbaik untuk menggunakan pola rekursif, lihat Pola re kursif yang menyebabkan fungsi Lambda yang tidak dapat dijalankan di Serverless Land.

Anda dapat mengonfigurasi fungsi untuk mengizinkan loop rekursif menggunakan konsol Lambda, AWS Command Line Interface (AWS CLI), dan API. PutFunctionRecursionConfig Anda juga dapat mengonfigurasi pengaturan deteksi loop rekursif fungsi di AWS SAM dan CloudFormation.

Secara default, Lambda mendeteksi dan mengakhiri loop rekursif. Kecuali desain Anda sengaja menggunakan loop rekursif, sebaiknya Anda tidak mengubah konfigurasi default fungsi Anda.

Perhatikan bahwa ketika Anda mengonfigurasi fungsi untuk mengizinkan loop rekursif, CloudWatch metrik tidak RecursiveInvocationsDropped dipancarkan.

Console
Untuk mengizinkan fungsi berjalan dalam loop rekursif (konsol)
  1. Buka halaman Fungsi di konsol Lambda.

  2. Pilih nama fungsi Anda untuk membuka halaman detail fungsi.

  3. Pilih tab Konfigurasi, lalu pilih deteksi konkurensi dan rekursi.

  4. Selain deteksi loop rekursif, pilih Edit.

  5. Pilih Iz inkan loop rekursif.

  6. Pilih Simpan.

AWS CLI

Anda dapat menggunakan PutFunctionRecursionConfig API untuk memungkinkan fungsi Anda dipanggil dalam loop rekursif. Tentukan Allow untuk parameter loop rekursif. Misalnya, Anda dapat memanggil API ini dengan put-function-recursion-config AWS CLI perintah:

aws lambda put-function-recursion-config --function-name yourFunctionName --recursive-loop Allow

Anda dapat mengubah konfigurasi fungsi Anda kembali ke pengaturan default sehingga Lambda mengakhiri loop rekursif saat mendeteksinya. Edit konfigurasi fungsi Anda menggunakan konsol Lambda atau. AWS CLI

Console
Untuk mengkonfigurasi fungsi sehingga loop rekursif dihentikan (konsol)
  1. Buka halaman Fungsi di konsol Lambda.

  2. Pilih nama fungsi Anda untuk membuka halaman detail fungsi.

  3. Pilih tab Konfigurasi, lalu pilih deteksi konkurensi dan rekursi.

  4. Selain deteksi loop rekursif, pilih Edit.

  5. Pilih H entikan loop rekursif.

  6. Pilih Simpan.

AWS CLI

Anda dapat menggunakan PutFunctionRecursionConfig API untuk mengkonfigurasi fungsi Anda sehingga Lambda mengakhiri loop rekursif saat mendeteksinya. Tentukan Terminate untuk parameter loop rekursif. Misalnya, Anda dapat memanggil API ini dengan put-function-recursion-config AWS CLI perintah:

aws lambda put-function-recursion-config --function-name yourFunctionName --recursive-loop Terminate

Wilayah yang Didukung untuk deteksi loop rekursif Lambda

Deteksi loop rekursif lambda didukung di semua Wil ayah komersial kecuali Meksiko (Tengah) dan Asia Pasifik (Selandia Baru).