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. Ein Beispiel wäre etwa eine Lambda-Funktion, die eine Nachricht in eine Amazon Simple Queue Service (Amazon SQS)-Warteschlange schreibt, die wiederum die gleiche 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 verringern, erkennt Lambda bestimmte Arten von rekursiven Schleifen kurz nach ihrem Auftreten.
Wenn Lambda eine rekursive Schleife erkennt, wird der Aufruf Ihrer Funktion standardmäßig gestoppt und Sie werden benachrichtigt. Wenn Ihr Entwurf 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.
Sections
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. Ein Beispiel wäre etwa das Hinzufügen eines Elements zu einer Amazon-SQS-Warteschlange oder zu einem Amazon Simple Notification Service (Amazon SNS)-Thema. Ereignisse werden von Lambda als JSON-Objekte mit Informationen zur Änderung des Systemstatus an Ihre Funktion übergeben. 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 in ein anderes Ereignis schreibt, das AWS-Service mithilfe einer unterstützten Version eines AWS SDK unterstützt wird, werden diese Metadaten aktualisiert. In den aktualisierten Metadaten ist angegeben, wie oft das Ereignis die Funktion aufgerufen hat.
Anmerkung
Sie müssen das X-Ray aktive Tracing nicht aktivieren, damit diese Funktion funktioniert. 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. Ein Beispiel: Angenommen, eine Amazon-SQS-Warteschlange ruft Ihre Lambda-Funktion auf. Anschließend sendet Ihre Lambda-Funktion das verarbeitete Ereignis an die gleiche Amazon-SQS-Warteschlange zurück und diese ruft wiederum erneut Ihre Funktion auf. In diesem Beispiel gehört jeder Aufruf Ihrer Funktion zur gleichen Kette von Anforderungen.
Wenn Ihre Funktion ungefähr 16-mal in der gleichen Kette von Anforderungen aufgerufen wird, beendet 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 receiveCount-Wert in der Nachricht erhöht. Lambda versucht weiterhin, die Nachricht zu wiederholen, und blockiert weiterhin Funktionsaufrufe, bis Amazon SQS feststellt, dass das maxReceiveCount überschritten wurde, und die Nachricht an die konfigurierte Warteschlange für unzustellbare Nachrichten 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. Wenn Sie für Ihre Funktion ein Ziel oder eine Warteschlange für unzustellbare Nachrichten konfigurieren, achten Sie darauf, keinen Ereignisauslöser und keine Zuordnung von Ereignisquellen zu verwenden, die Ihre Funktion auch verwendet. Wenn Sie Ereignisse an dieselbe Ressource senden, die Ihre Funktion aufruft, können Sie eine weitere rekursive Schleife erstellen, und diese Schleife wird ebenfalls beendet. Wenn Sie die Erkennung von Rekursionsschleifen deaktivieren, wird diese Schleife nicht beendet.
Unterstützt AWS-Services und SDKs
Lambda kann nur rekursive Schleifen erkennen, die bestimmte unterstützte Schleifen enthalten. AWS-Services Damit rekursive Schleifen erkannt werden können, muss Ihre Funktion auch eines der unterstützten SDKs verwenden. AWS
Unterstützt AWS-Services
Lambda erkennt derzeit rekursive Schleifen zwischen Funktionen, Amazon SQS, Amazon S3 und Amazon SNS. Lambda erkennt auch Schleifen, die nur aus Lambda-Funktionen bestehen, die sich gegenseitig synchron oder asynchron aufrufen können. Die folgenden Diagramme zeigen einige Beispiele für Schleifen, die von Lambda erkannt werden:
Wenn eine andere Schleife AWS-Service wie Amazon DynamoDB Teil der Schleife ist, kann Lambda sie derzeit nicht erkennen und stoppen.
Da Lambda derzeit nur rekursive Schleifen erkennt, an denen Amazon SQS, Amazon S3 und Amazon SNS beteiligt sind, ist es immer noch möglich, dass Schleifen, an denen andere beteiligt sind, zur unbeabsichtigten Nutzung Ihrer AWS-Services Lambda-Funktionen führen können.
Um zu verhindern, dass Ihnen unerwartete Gebühren in Rechnung gestellt werden, empfehlen wir Ihnen AWS-Konto, CloudWatch Amazon-Alarme so zu konfigurieren, dass Sie auf ungewöhnliche Nutzungsmuster aufmerksam gemacht werden. Sie können beispielsweise so konfigurieren CloudWatch , dass Sie über Spitzen bei der Parallelität oder bei Aufrufen von Lambda-Funktionen informiert 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 erkennt, muss Ihre Funktion eine der folgenden SDK-Mindestversionen verwenden:
| Laufzeit | AWS Erforderliche SDK-Mindestversion |
|---|---|
|
Node.js |
2.1147.0 (SDK-Version 2) 3.105.0 (SDK-Version 3) |
|
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 |
V2 SDK 1.57.0 |
Einige Lambda-Laufzeiten wie Python Node.js enthalten eine Version des SDK. AWS Wenn die in der Laufzeit Ihrer Funktion enthaltene SDK-Version kleiner ist als die erforderliche Mindestversion, können Sie dem Bereitstellungspaket Ihrer Funktion eine unterstützte Version des SDK hinzufügen. Sie können auch eine Lambda-Ebene verwenden, um Ihrer Funktion eine unterstützte SDK-Version hinzuzufügen. Eine Liste der SDKs, die in der jeweiligen Lambda-Laufzeitumgebung enthalten sind, finden Sie unter Lambda-Laufzeiten.
Benachrichtigungen zu rekursiven Schleifen
Wenn Lambda eine rekursive Schleife beendet, erhalten Sie Benachrichtigungen über das Health Dashboard
Health Dashboard Benachrichtigungen
Wenn Lambda einen rekursiven Aufruf stoppt, wird auf der Seite „Ihr Kontostatus“ unter Öffnen und aktuelle Probleme eine Benachrichtigung Health Dashboard angezeigt. https://health.aws.amazon.com/health/home#/account/dashboard/open-issues
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 3,5 Stunden dauern kann, bis Sie diese E-Mail-Benachrichtigung erhalten.
Lambda sendet rekursive E-Mail-Benachrichtigungen an Ihren AWS-Konto primären Kontokontakt und den alternativen Ansprechpartner für den Betrieb. Informationen zum Anzeigen oder Aktualisieren der E-Mail-Adressen in Ihrem Konto finden Sie in der allgemeinen AWS -Referenz unter Updating contact information.
Amazon-Metriken CloudWatch
Die CloudWatch Metrik RecursiveInvocationsDropped zeichnet die Anzahl der Funktionsaufrufe auf, die Lambda gestoppt hat, weil Ihre Funktion in einer einzigen Kette von Anfragen mehr als ungefähr 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 etwa mehr als 16-mal durch das gleiche auslösende Ereignis aufgerufen wird, beendet 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 die Ereignisquelle für Ihre Lambda-Funktion eine Amazon-SQS-Warteschlange ist, empfiehlt es sich außerdem gegebenenfalls, für die Quellwarteschlange eine Warteschlange für unzustellbare Nachrichten 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 Amazon-SNS-Thema handelt, empfiehlt es sich gegebenenfalls, für Ihre Funktion ein Ziel bei Ausfall hinzuzufügen.
So reduzieren Sie die verfügbare Parallelität Ihrer Funktion auf Null (Konsole)
Öffnen Sie die Seite Funktionen
der Lambda-Konsole. -
Wählen Sie den Namen Ihrer Funktion aus.
-
Wählen Sie Drosseln aus.
-
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)
Öffnen Sie die Seite Funktionen
der Lambda-Konsole. -
Wählen Sie den Namen Ihrer Funktion aus.
-
Wählen Sie die Registerkarte Konfiguration und anschließend Auslöser aus.
-
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.
-
Wählen Sie im Dialogfeld Auslöser löschen die Option Löschen aus.
Um eine Ereignisquellenzuordnung für Ihre Funktion zu deaktivieren (AWS CLI)
-
Um die UUID für das Eventquellen-Mapping zu finden, das Sie deaktivieren möchten, führen Sie den Befehl AWS Command Line Interface (AWS CLI) https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/list-event-source-mappings.html
list-event-source-mappings aus. aws lambda list-event-source-mappings -
Um die Ereignisquellenzuordnung zu deaktivieren, führen Sie den folgenden Befehl update-event-source-mapping aus. AWS CLI https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-event-source-mapping.html
aws lambda update-event-source-mapping --function-nameMyFunction\ --uuida1b2c3d4-5678-90ab-cdef-EXAMPLE11111--no-enabled
Zulassen, dass eine Lambda-Funktion in einer rekursiven Schleife ausgeführt wird
Wenn Ihr Entwurf absichtlich eine rekursive Schleife verwendet, können Sie eine Lambda-Funktion so konfigurieren, dass sie rekursiv aufgerufen werden kann. Wir empfehlen, dass Sie rekursive Schleifen in Ihrem Entwurf vermeiden. Implementierungsfehler können zu rekursiven Aufrufen führen, bei denen Ihre gesamte verfügbare Parallelität genutzt wird, und dazu, AWS-Konto dass Ihrem 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 bei Serverless Land unter Recursive patterns that cause run-away Lambda functions
Mithilfe der Lambda-Konsole, der () und der API können Sie Funktionen so konfigurieren, dass rekursive Schleifen zugelassen werden. AWS Command Line Interface AWS CLI PutFunctionRecursionConfig Sie können auch die Einstellung für die Erkennung rekursiver Schleifen einer Funktion in und konfigurieren. AWS SAM CloudFormation
Standardmäßig erkennt und beendet Lambda rekursive Schleifen. Sofern Ihr Entwurf nicht bewusst eine rekursive Schleife verwendet, empfehlen wir Ihnen, 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.
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 dem AWS CLI.
Unterstützte Regionen für die Erkennung rekursiver Lambda-Schleifen
Die Lambda-Rekursivschleifenerkennung wird in allen Handelsregionen außer Mexiko (Zentral) und Asien-Pazifik (Neuseeland) unterstützt.