Verwenden Sie die rekursive Lambda-Schleifenerkennung, um Endlosschleifen zu verhindern - AWS Lambda

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Verwenden Sie die rekursive Lambda-Schleifenerkennung, um Endlosschleifen zu verhindern

Wenn Sie als Ziel für die Ausgabe einer Lambda-Funktion den gleichen Service oder die gleiche Ressource konfigurieren, durch den bzw. durch die die Funktion aufgerufen wird, kann eine unendliche rekursive Schleife entstehen. Beispielsweise könnte eine Lambda-Funktion eine Nachricht in eine Amazon Simple Queue Service (AmazonSQS) -Warteschlange schreiben, die dann dieselbe Funktion aufruft. Dieser Aufruf veranlasst die Funktion, eine weitere Nachricht in die Warteschlange zu schreiben, die wiederum erneut die Funktion aufruft.

Unbeabsichtigte rekursive Schleifen können dazu führen, dass Ihnen unerwartete Gebühren in Rechnung gestellt werden. AWS-Konto Außerdem können Schleifen dazu führen, dass Lambda skaliert wird und die gesamte verfügbare Parallelität Ihres Kontos nutzt. Um die Auswirkungen unbeabsichtigter Schleifen zu reduzieren, erkennt Lambda bestimmte Arten von rekursiven Schleifen kurz nach ihrem Auftreten. Wenn Lambda eine rekursive Schleife erkennt, stoppt es standardmäßig den Aufruf Ihrer Funktion und benachrichtigt Sie. Wenn Ihr Design bewusst rekursive Muster verwendet, können Sie die Standardkonfiguration einer Funktion so ändern, dass sie rekursiv aufgerufen werden kann. Weitere Informationen finden Sie unter Zulassen, dass eine Lambda-Funktion in einer rekursiven Schleife ausgeführt wird.

Grundlegendes zur Erkennung rekursiver Schleifen

Zur Erkennung rekursiver Schleifen in Lambda werden Ereignisse nachverfolgt. Lambda ist ein ereignisgesteuerter Compute-Service, der Ihren Funktionscode ausführt, wenn bestimmte Ereignisse auftreten. Zum Beispiel, wenn ein Artikel zu einer SQS Amazon-Warteschlange oder einem Amazon Simple Notification Service (AmazonSNS) -Thema hinzugefügt wird. Lambda übergibt Ereignisse als JSON Objekte an Ihre Funktion, die Informationen über die Änderung des Systemstatus enthalten. Die Ausführung Ihrer Funktion infolge eines Ereignisses wird als Aufruf bezeichnet.

Zur Erkennung rekursiver Schleifen verwendet Lambda AWS X-Ray-Ablaufverfolgungs-Header. Wenn AWS-Services , die die Erkennung rekursiver Schleifen unterstützen, Ereignisse an Lambda senden, werden diese Ereignisse automatisch mit Metadaten versehen. Wenn Ihre Lambda-Funktion eines dieser Ereignisse AWS-Service mithilfe einer unterstützten Version von in ein anderes Ereignis schreibt AWS SDK, aktualisiert sie diese Metadaten. In den aktualisierten Metadaten ist angegeben, wie oft das Ereignis die Funktion aufgerufen hat.

Anmerkung

Dieses Feature funktioniert ohne Aktivierung der aktiven X-Ray-Ablaufverfolgung. Die Erkennung rekursiver Schleifen ist standardmäßig für alle AWS -Kunden aktiviert. Die Nutzung des Features ist kostenlos.

Bei einer Kette von Anforderungen handelt es sich um eine Sequenz von Lambda-Aufrufen, die durch das gleiche auslösende Ereignis verursacht werden. Stellen Sie sich zum Beispiel vor, dass eine SQS Amazon-Warteschlange Ihre Lambda-Funktion aufruft. Ihre Lambda-Funktion sendet dann das verarbeitete Ereignis zurück an dieselbe SQS Amazon-Warteschlange, die Ihre Funktion erneut aufruft. In diesem Beispiel gehört jeder Aufruf Ihrer Funktion zur gleichen Kette von Anforderungen.

Wenn Ihre Funktion ungefähr 16 Mal in derselben Kette von Anfragen aufgerufen wird, stoppt Lambda automatisch den nächsten Funktionsaufruf in dieser Anforderungskette und benachrichtigt Sie. Wenn Ihre Funktion mit mehreren Auslösern konfiguriert ist, sind Aufrufe von anderen Auslösern nicht betroffen.

Anmerkung

Selbst wenn die maxReceiveCount Einstellung in der Redrive-Richtlinie der Quellwarteschlange höher als 16 ist, verhindert der Lambda-Rekursionsschutz nicht, dass Amazon SQS die Nachricht erneut versucht, nachdem eine rekursive Schleife erkannt und beendet wurde. Wenn Lambda eine rekursive Schleife erkennt und nachfolgende Aufrufe abbricht, gibt es ein RecursiveInvocationException an die Zuordnung von Ereignisquellen zurück. Dadurch wird der Wert in der Nachricht erhöht. receiveCount Lambda versucht weiterhin, die Nachricht erneut zu senden, und blockiert weiterhin Funktionsaufrufe, bis Amazon SQS feststellt, dass der Wert überschritten wurde, und die Nachricht an die maxReceiveCount konfigurierte Warteschlange für unzustellbare Briefe sendet.

Wenn Sie für Ihre Funktion ein Ziel bei Ausfall oder eine Warteschlange für unzustellbare Nachrichten konfiguriert haben, sendet Lambda das Ereignis aus dem beendeten Aufruf auch an Ihr Ziel oder an die Warteschlange für unzustellbare Nachrichten. Achten Sie bei der Konfiguration einer Zielwarteschlange oder Warteschlange mit uneingeschränkten Briefen für Ihre Funktion darauf, kein SNS Amazon-Thema oder eine SQS Amazon-Warteschlange zu verwenden, die Ihre Funktion auch als Ereignisauslöser oder Ereignisquellenzuordnung verwendet. Wenn Sie Ereignisse an die Ressource senden, die auch Ihre Funktion aufruft, können Sie eine weitere rekursive Schleife erstellen.

Unterstützt und AWS-Services SDKs

Lambda kann nur rekursive Schleifen erkennen, die bestimmte unterstützte enthalten. AWS-Services Damit rekursive Schleifen erkannt werden können, muss Ihre Funktion auch eine der unterstützten Schleifen verwenden. AWS SDKs

Unterstützt AWS-Services

Lambda erkennt derzeit rekursive Schleifen zwischen Ihren Funktionen AmazonSQS, Amazon S3 und Amazon. SNS Außerdem erkennt Lambda Schleifen, die nur aus Lambda-Funktionen bestehen, die sich synchron oder asynchron gegenseitig aufrufen. Die folgenden Diagramme zeigen einige Beispiele für Schleifen, die von Lambda erkannt werden:

Diagramme von rekursiven Schleifen zwischen einer Lambda-Funktion, AmazonSNS, Amazon S3 und einer SQS Amazon-Warteschlange.

Wenn ein anderes AWS-Service System wie Amazon DynamoDB Teil der Schleife ist, kann Lambda es derzeit nicht erkennen und stoppen.

Da Lambda derzeit nur rekursive Schleifen erkennt, an denen AmazonSQS, Amazon S3 und Amazon beteiligt sind, ist es immer noch möglichSNS, dass Schleifen, an denen andere beteiligt sind, zu einer unbeabsichtigten Nutzung Ihrer Lambda-Funktionen führen AWS-Services können.

Um zu verhindern, dass Ihnen unerwartete Gebühren in Rechnung gestellt werden AWS-Konto, empfehlen wir Ihnen, CloudWatchAmazon-Alarme so zu konfigurieren, dass Sie auf ungewöhnliche Nutzungsmuster aufmerksam gemacht werden. Sie können beispielsweise so konfigurieren, dass Sie über CloudWatch Spitzenwerte bei der Parallelität oder bei Aufrufen von Lambda-Funktionen benachrichtigt werden. Des Weiteren können Sie einen Abrechnungsalarm konfigurieren, um benachrichtigt zu werden, wenn die Ausgaben für Ihr Konto einen von Ihnen angegebenen Schwellenwert übersteigen. Eine weitere Möglichkeit ist die Verwendung der AWS Cost Anomaly Detection, um über ungewöhnliche Abrechnungsmuster informiert zu werden.

Unterstützt AWS SDKs

Damit Lambda rekursive Schleifen erkennen kann, muss Ihre Funktion eine der folgenden SDK Versionen oder höher verwenden:

Laufzeit Erforderliche Mindestversion AWS SDK

Node.js

2.1147.0 (SDKVersion 2)

3.105.0 (Version 3) SDK

Python

1.24.46 (boto3)

1.27.46 (botocore)

Java 8 und Java 11

2.17.135

Java 17

2,20,81

Java 21

2,21,24

.NET

3,7,293,0

Ruby

3,134,0

PHP

3,232,0

Go

SDKV2 (neueste Version verwenden)

Einige Lambda-Laufzeiten wie Python und Node.js enthalten eine Version von. AWS SDK Wenn die in der Laufzeit Ihrer Funktion enthaltene SDK Version unter der erforderlichen Mindestversion liegt, können Sie dem SDK Bereitstellungspaket Ihrer Funktion eine unterstützte Version von hinzufügen. Sie können Ihrer Funktion auch mithilfe einer Lambda-Schicht eine unterstützte SDK Version hinzufügen. Eine Liste der in jeder Lambda-Laufzeit SDKs enthaltenen Funktionen finden Sie unterLambda-Laufzeiten.

Benachrichtigungen zu rekursiven Schleifen

Wenn Lambda eine rekursive Schleife beendet, erhalten Sie Benachrichtigungen über das AWS Health Dashboard und per E-Mail. Sie können auch CloudWatch Metriken verwenden, um die Anzahl der rekursiven Aufrufe zu überwachen, die Lambda gestoppt hat.

AWS Health Dashboard Benachrichtigungen

Wenn Lambda einen rekursiven Aufruf stoppt, wird auf der Seite Ihr Kontostatus unter Offene und aktuelle Probleme eine Benachrichtigung AWS Health Dashboard angezeigt. Beachten Sie, dass es nach der Beendigung eines rekursiven Aufrufs durch Lambda bis zu drei Stunden dauern kann, bis diese Benachrichtigung angezeigt wird. Weitere Informationen zum Anzeigen von Kontoereignissen in der AWS Health Dashboard finden Sie unter Erste Schritte mit Ihrem AWS Health Dashboard — Ihr Kontostatus im AWS Health-Benutzerhandbuch.

E-Mail-Benachrichtigungen

Wenn Lambda zum ersten Mal einen rekursiven Aufruf Ihrer Funktion beendet, erhalten Sie eine E-Mail-Benachrichtigung. Für jede Funktion in Ihrem AWS-Konto wird alle 24 Stunden maximal eine E-Mail gesendet. Nachdem Lambda eine E-Mail-Benachrichtigung gesendet hat, erhalten Sie für einen Zeitraum von 24 Stunden keine E-Mails mehr zu dieser Funktion. Das gilt auch, wenn Lambda weitere rekursive Aufrufe der Funktion beendet. Beachten Sie, dass es nach der Beendigung eines rekursiven Aufrufs durch Lambda bis zu drei Stunden dauern kann, bis Sie diese E-Mail-Benachrichtigung erhalten.

Lambda sendet rekursive Loop-E-Mail-Benachrichtigungen an Ihren primären AWS-Konto Kundenkontakt und an den alternativen Betriebskontakt. Informationen zum Anzeigen oder Aktualisieren der E-Mail-Adressen in Ihrem Konto finden Sie in der allgemeinen AWS -Referenz unter Updating contact information.

CloudWatch Amazon-Metriken

Die CloudWatch Metrik RecursiveInvocationsDropped zeichnet die Anzahl der Funktionsaufrufen auf, die Lambda gestoppt hat, weil Ihre Funktion in einer einzigen Anforderungskette mehr als etwa 16 Mal aufgerufen wurde. Lambda gibt diese Metrik aus, sobald ein rekursiver Aufruf beendet wurde. Um diese Metrik anzuzeigen, folgen Sie den Anweisungen unter Metriken anzeigen auf der CloudWatch Konsole und wählen Sie die Metrik aus. RecursiveInvocationsDropped

Reagieren auf Benachrichtigungen im Zusammenhang mit der Erkennung rekursiver Schleifen

Wenn Ihre Funktion mehr als ungefähr 16 Mal durch dasselbe auslösende Ereignis aufgerufen wird, stoppt Lambda den nächsten Funktionsaufruf für dieses Ereignis, um die rekursive Schleife zu unterbrechen. Gehen Sie wie folgt vor, um zu verhindern, dass eine rekursive Schleife, die von Lambda unterbrochen wurde, erneut auftritt:

  • Reduzieren Sie die verfügbare Parallelität Ihrer Funktion auf Null. Dadurch werden alle zukünftigen Aufrufe gedrosselt.

  • Entfernen oder deaktivieren Sie den Auslöser oder die Zuordnung von Ereignisquellen, der bzw. die Ihre Funktion aufruft.

  • Identifizieren und beheben Sie Codefehler, die Ereignisse in die AWS Ressource zurückschreiben, die Ihre Funktion aufruft. Eine Fehlerquelle entsteht häufig, wenn die Ereignisquelle und das Ziel einer Funktion mithilfe von Variablen definiert werden. Achten Sie darauf, nicht für beide Variablen den gleichen Wert zu verwenden.

Wenn es sich bei der Ereignisquelle für Ihre Lambda-Funktion um eine SQS Amazon-Warteschlange handelt, sollten Sie außerdem erwägen, eine Warteschlange für unzustellbare Briefe in der Quellwarteschlange zu konfigurieren.

Anmerkung

Achten Sie darauf, die Warteschlange für unzustellbare Nachrichten für die Quellwarteschlange und nicht für die Lambda-Funktion zu konfigurieren. Die Warteschlange für unzustellbare Nachrichten, die Sie für eine Funktion konfigurieren, wird für die Warteschlange asynchroner Aufrufe der Funktion und nicht für Ereignisquellen-Warteschlangen verwendet.

Wenn es sich bei der Ereignisquelle um ein SNS Amazon-Thema handelt, sollten Sie erwägen, ein Ziel für den Fall eines Fehlers für Ihre Funktion hinzuzufügen.

So reduzieren Sie die verfügbare Parallelität Ihrer Funktion auf Null (Konsole)
  1. Öffnen Sie die Seite Funktionen der Lambda-Konsole.

  2. Wählen Sie den Namen Ihrer Funktion aus.

  3. Wählen Sie Drosseln aus.

  4. Wählen Sie im Dialogfeld Funktion drosseln die Option Bestätigen aus.

So entfernen Sie einen Auslöser oder eine Zuordnung von Ereignisquellen für Ihre Funktion (Konsole)
  1. Öffnen Sie die Seite Funktionen der Lambda-Konsole.

  2. Wählen Sie den Namen Ihrer Funktion aus.

  3. Wählen Sie die Registerkarte Konfiguration und anschließend Auslöser aus.

  4. Wählen Sie unter Auslöser den Auslöser oder die Zuordnung von Ereignisquellen aus, den bzw. die Sie löschen möchten, und wählen Sie anschließend Löschen aus.

  5. Wählen Sie im Dialogfeld Auslöser löschen die Option Löschen aus.

So deaktivieren Sie eine Zuordnung von Ereignisquellen für Ihre Funktion (AWS CLI)
  1. Führen Sie den list-event-source-mappingsBefehl AWS Command Line Interface (AWS CLI) aus, um die Zuordnung UUID für die Ereignisquelle zu finden, die Sie deaktivieren möchten.

    aws lambda list-event-source-mappings
  2. Führen Sie den folgenden AWS CLI update-event-source-mappingBefehl aus, um die Zuordnung der Ereignisquellen zu deaktivieren.

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

Zulassen, dass eine Lambda-Funktion in einer rekursiven Schleife ausgeführt wird

Wenn Ihr Design absichtlich eine rekursive Schleife verwendet, können Sie eine Lambda-Funktion so konfigurieren, dass sie rekursiv aufgerufen werden kann. Wir empfehlen Ihnen, die Verwendung rekursiver Schleifen in Ihrem Design zu vermeiden. Implementierungsfehler können dazu führen, dass rekursive Aufrufe Ihre gesamte verfügbare Parallelität nutzen und dass Ihrem AWS-Konto Konto unerwartete Gebühren in Rechnung gestellt werden.

Wichtig

Wenn Sie rekursive Schleifen verwenden, sollten Sie diese mit Vorsicht behandeln. Implementieren Sie bewährte Leitplanken, um das Risiko von Implementierungsfehlern zu minimieren. Weitere Informationen zu bewährten Methoden für die Verwendung rekursiver Muster finden Sie unter Rekursive Muster, die zu außer Kontrolle geratenen Lambda-Funktionen in Serverless Land führen.

Sie können Funktionen so konfigurieren, dass sie rekursive Schleifen zulassen, indem Sie die Lambda-Konsole, die AWS Command Line Interface (AWS CLI) und die verwenden. PutFunctionRecursionConfigAPI Sie können auch die Einstellung für die Erkennung rekursiver Schleifen einer Funktion in und konfigurieren. AWS SAM AWS CloudFormation

Standardmäßig erkennt und beendet Lambda rekursive Schleifen. Sofern Ihr Design nicht absichtlich eine rekursive Schleife verwendet, empfehlen wir, die Standardkonfiguration Ihrer Funktionen nicht zu ändern.

Beachten Sie, dass die CloudWatch Metrik RecursiveInvocationsDropped nicht ausgegeben wird, wenn Sie eine Funktion so konfigurieren, dass sie rekursive Schleifen zulässt.

Console
Um zu ermöglichen, dass eine Funktion in einer rekursiven Schleife ausgeführt wird (Konsole)
  1. Öffnen Sie die Seite Funktionen der Lambda-Konsole.

  2. Wählen Sie den Namen Ihrer Funktion, um die Funktionsdetailseite zu öffnen.

  3. Wählen Sie die Registerkarte Konfiguration und anschließend Gleichzeitigkeit und Rekursionserkennung.

  4. Wählen Sie neben Rekursive Schleifenerkennung die Option Bearbeiten aus.

  5. Wählen Sie Rekursive Schleifen zulassen aus.

  6. Wählen Sie Save (Speichern) aus.

AWS CLI

Sie können das verwenden PutFunctionRecursionConfigAPI, um zu ermöglichen, dass Ihre Funktion in einer rekursiven Schleife aufgerufen wird. Geben Sie den Allow Parameter für die rekursive Schleife an. Sie können dies beispielsweise API mit dem put-function-recursion-config AWS CLI folgenden Befehl aufrufen:

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

Sie können die Konfiguration Ihrer Funktion auf die Standardeinstellung zurücksetzen, sodass Lambda rekursive Schleifen beendet, wenn es sie erkennt. Bearbeiten Sie die Konfiguration Ihrer Funktion mit der Lambda-Konsole oder der AWS CLI.

Console
Um eine Funktion so zu konfigurieren, dass rekursive Schleifen beendet werden (Konsole)
  1. Öffnen Sie die Seite Funktionen der Lambda-Konsole.

  2. Wählen Sie den Namen Ihrer Funktion, um die Funktionsdetailseite zu öffnen.

  3. Wählen Sie die Registerkarte „Konfiguration“ und anschließend „Gleichzeitigkeit und Rekursionserkennung“.

  4. Wählen Sie neben Rekursive Schleifenerkennung die Option Bearbeiten aus.

  5. Wählen Sie Rekursive Schleifen beenden aus.

  6. Wählen Sie Save (Speichern) aus.

AWS CLI

Sie können die verwenden PutFunctionRecursionConfigAPI, um Ihre Funktion so zu konfigurieren, dass Lambda rekursive Schleifen beendet, wenn es sie erkennt. Geben Sie den Parameter Terminate für die rekursive Schleife an. Sie können dies beispielsweise API mit dem put-function-recursion-config AWS CLI folgenden Befehl aufrufen:

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

Unterstützte Regionen für die rekursive Lambda-Schleifenerkennung

Die rekursive Lambda-Schleifenerkennung wird im Folgenden unterstützt. AWS-Regionen

  • USA Ost (Nord-Virginia)

  • USA Ost (Ohio)

  • USA West (Nordkalifornien)

  • USA West (Oregon)

  • Africa (Cape Town)

  • Asia Pacific (Hong Kong)

  • Asia Pacific (Mumbai)

  • Asia Pacific (Osaka)

  • Asia Pacific (Seoul)

  • Asien-Pazifik (Singapur)

  • Asien-Pazifik (Sydney)

  • Asien-Pazifik (Tokio)

  • Canada (Central)

  • Europe (Frankfurt)

  • Europa (Irland)

  • Europa (London)

  • Europa (Milan)

  • Europe (Paris)

  • Europe (Stockholm)

  • Middle East (Bahrain)

  • Südamerika (São Paulo)