Gunakan 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.

Gunakan deteksi loop rekursif Lambda untuk mencegah loop tak terbatas

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

Loop rekursif yang tidak disengaja dapat mengakibatkan biaya tak terduga ditagih ke Anda. Akun AWS Loop juga dapat menyebabkan Lambda menskalakan dan menggunakan semua konkurensi akun Anda yang tersedia. Untuk membantu mengurangi dampak loop yang tidak disengaja, Lambda mendeteksi jenis loop rekursif tertentu segera setelah terjadi. Secara default, ketika Lambda mendeteksi loop rekursif, Lambda 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 saat peristiwa tertentu terjadi. Misalnya, saat item ditambahkan ke topik SQS antrian Amazon atau Amazon Simple Notification Service (AmazonSNS). Lambda meneruskan peristiwa ke fungsi Anda sebagai JSON objek, yang berisi informasi tentang perubahan status sistem. Ketika suatu peristiwa menyebabkan fungsi Anda berjalan, ini disebut pemanggilan.

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

catatan

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

Rantai permintaan adalah urutan pemanggilan Lambda yang disebabkan oleh peristiwa pemicu yang sama. Misalnya, bayangkan SQS antrian Amazon memanggil fungsi Lambda Anda. Fungsi Lambda Anda kemudian mengirim peristiwa yang diproses kembali ke SQS antrean Amazon 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

Meskipun maxReceiveCount pengaturan pada kebijakan redrive antrian sumber lebih tinggi dari 16, perlindungan rekursi Lambda tidak SQS mencegah Amazon mencoba ulang pesan setelah loop rekursif terdeteksi dan dihentikan. Ketika Lambda mendeteksi loop rekursif dan menjatuhkan pemanggilan berikutnya, ia mengembalikan a RecursiveInvocationException ke pemetaan sumber peristiwa. Ini meningkatkan receiveCount nilai pada pesan. Lambda terus mencoba lagi pesan, dan terus memblokir pemanggilan fungsi, hingga SQS Amazon menentukan bahwa terlampaui dan mengirim pesan maxReceiveCount ke antrian huruf mati yang dikonfigurasi.

Jika Anda memiliki tujuan yang gagal atau antrean huruf mati yang dikonfigurasi untuk fungsi Anda, maka Lambda juga mengirimkan acara dari pemanggilan yang dihentikan ke antrean tujuan atau surat mati Anda. Saat mengonfigurasi antrian tujuan atau huruf mati untuk fungsi Anda, pastikan untuk tidak menggunakan topik Amazon SNS atau SQS antrian Amazon yang juga digunakan fungsi Anda sebagai pemicu peristiwa atau pemetaan sumber peristiwa. Jika Anda mengirim peristiwa ke sumber daya yang sama yang memanggil fungsi Anda, maka Anda dapat membuat loop rekursif lain.

Didukung Layanan AWS dan SDKs

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

Didukung Layanan AWS

Lambda saat ini mendeteksi loop rekursif antara fungsi Anda, Amazon, Amazon SQS S3, dan Amazon. SNS Lambda juga mendeteksi loop yang hanya terdiri dari fungsi Lambda, yang dapat memanggil satu sama lain 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, Amazon SQS S3, dan AmazonSNS, masih mungkin loop yang melibatkan loop lain Layanan AWS dapat mengakibatkan penggunaan fungsi Lambda Anda yang tidak diinginkan.

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

Didukung AWS SDKs

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

Waktu Aktif AWS SDKVersi minimum yang diperlukan

Node.js

2.1147.0 (versi 2) SDK

3.105.0 (SDKversi 3)

Python

1.24.46 (Boto3)

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

SDKV2 (gunakan versi terbaru)

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

Pemberitahuan loop rekursif

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

AWS Health Dashboard pemberitahuan

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

Peringatan email

Saat Lambda pertama kali menghentikan pemanggilan rekursif fungsi Anda, Lambda mengirimkan peringatan email kepada Anda. Lambda mengirim maksimal satu email setiap 24 jam untuk setiap fungsi di Anda. Akun AWS Setelah Lambda mengirimkan 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 ini dapat memakan waktu hingga tiga jam setelah Lambda menghentikan pemanggilan rekursif sebelum Anda menerima peringatan email ini.

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

CloudWatch Metrik Amazon

CloudWatch Metrik RecursiveInvocationsDropped mencatat jumlah pemanggilan fungsi yang 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 notifikasi deteksi loop rekursif

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

  • Kurangi konkurensi fungsi Anda yang tersedia menjadi nol, yang membatasi semua pemanggilan future.

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

  • Identifikasi dan perbaiki cacat kode yang menulis peristiwa kembali ke AWS sumber daya yang menjalankan fungsi Anda. Sebuah sumber umum cacat terjadi ketika Anda menggunakan variabel untuk menentukan sumber peristiwa fungsi dan target. Periksa apakah Anda tidak menggunakan nilai yang sama untuk kedua variabel.

Selain itu, jika sumber peristiwa untuk fungsi Lambda Anda adalah SQS antrian Amazon, pertimbangkan untuk mengonfigurasi antrian huruf mati pada antrean 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 acara adalah SNS topik Amazon, pertimbangkan untuk menambahkan tujuan yang gagal untuk fungsi Anda.

Untuk mengurangi konkurensi fungsi Anda 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 Confirm.

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 Pemicu.

  4. Di bawah Pemicu, pilih pemicu atau pemetaan sumber peristiwa yang ingin Anda hapus, lalu pilih Hapus.

  5. Di kotak dialog Hapus pemicu, pilih Hapus.

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

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

    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 penggunaan loop rekursif dalam desain Anda. Kesalahan implementasi dapat menyebabkan pemanggilan rekursif menggunakan semua konkurensi Anda Akun AWS yang tersedia dan biaya tak terduga yang ditagih ke akun Anda.

penting

Jika Anda menggunakan loop rekursif, perlakukan dengan hati-hati. Menerapkan best practice guard rail untuk meminimalkan risiko kesalahan implementasi. Untuk mempelajari lebih lanjut tentang praktik terbaik untuk menggunakan pola rekursif, lihat Pola rekursif yang menyebabkan fungsi Lambda yang tidak terkendali di Tanah Tanpa Server.

Anda dapat mengonfigurasi fungsi untuk memungkinkan loop rekursif menggunakan konsol Lambda, AWS Command Line Interface AWS CLI(), dan. PutFunctionRecursionConfigAPI Anda juga dapat mengonfigurasi pengaturan deteksi loop rekursif fungsi di AWS SAM dan AWS 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 saat Anda mengonfigurasi fungsi untuk mengizinkan loop rekursif, CloudWatch metrik RecursiveInvocationsDropped tidak dipancarkan.

Console
Untuk memungkinkan 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 Konkurensi dan deteksi rekursi.

  4. Selain deteksi loop rekursif, pilih Edit.

  5. Pilih Izinkan loop rekursif.

  6. Pilih Simpan.

AWS CLI

Anda dapat menggunakan PutFunctionRecursionConfigAPIuntuk memungkinkan fungsi Anda dipanggil dalam loop rekursif. Tentukan Allow untuk parameter loop rekursif. Misalnya, Anda dapat memanggil ini API 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 menghentikan loop rekursif saat mendeteksi mereka. 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 Konkurensi dan deteksi rekursi.

  4. Selain deteksi loop rekursif, pilih Edit.

  5. Pilih Hentikan loop rekursif.

  6. Pilih Simpan.

AWS CLI

Anda dapat menggunakan PutFunctionRecursionConfigAPIuntuk mengonfigurasi fungsi Anda sehingga Lambda mengakhiri loop rekursif saat mendeteksi mereka. Tentukan Terminate untuk parameter loop rekursif. Misalnya, Anda dapat memanggil ini API 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 sebagai berikut. Wilayah AWS

  • AS Timur (N. Virginia)

  • AS Timur (Ohio)

  • AS Barat (California Utara)

  • AS Barat (Oregon)

  • Afrika (Cape Town)

  • Asia Pasifik (Hong Kong)

  • Asia Pasifik (Mumbai)

  • Asia Pasifik (Osaka)

  • Asia Pasifik (Seoul)

  • Asia Pasifik (Singapura)

  • Asia Pasifik (Sydney)

  • Asia Pasifik (Tokyo)

  • Kanada (Pusat)

  • Eropa (Frankfurt)

  • Eropa (Irlandia)

  • Eropa (London)

  • Eropa (Milan)

  • Eropa (Paris)

  • Eropa (Stockholm)

  • Timur Tengah (Bahrain)

  • Amerika Selatan (Sao Paulo)