3

I accidently einig Java-Code in AWS Lambda eingesetzt, die die folgenden offensichtlich Buggy Getter enthalten:AWS Lambda besorgniserregend Verhalten nach einer versehentlichen Endlosschleife

public String getLocation() { 
    return this.getLocation(); 
} 

Die Lambda-Funktion mit einer Grenze von 15 Sekunden eingestellt ist, und 320 Mo Es wird von einem DynamoDB-Stream ausgelöst. Nach dem Bereitstellen des problematischen Codes habe ich meine DynamoDB-Tabelle um 22:17 Uhr geändert und den Code ausgeführt. Ich habe die Logs ausgecheckt, und wie Sie von der vorherigen Funktion erwarten können, hatte ich einen klassischen StackOverflowError mit einem sehr langen Stack-Trace. Ich war jedoch überrascht zu sehen, dass dies die Funktion nicht stoppte, die weiterhin mehrere Stapelüberlauffehler ausführte und meldete (loggte sich in CloudWatch ein). Ich war noch besorgter, als mir klar wurde, dass die Funktion auch nach 15 Sekunden nicht aufhören würde. Ich konnte keine Möglichkeit finden, es manuell zu stoppen, also löschte ich es einfach um 22:30 Uhr von der Lambda-Konsole, was es schließlich tötete. Die folgende Grafik (von CloudWatch) zeigt die Ausführungsdauer im Laufe der Zeit und Sie können mehrere Tests sehen, die ich vor dem Ausführen des Fehlers durchgeführt habe (Läufe von mehr als 10s), dann die aufeinander folgenden Schnelldurchläufe (etwa 200ms) zwischen 22h17 und 22h30.

enter image description here

Auch ich bin sicher, dass ich nicht meinen DynamoDB Tisch rührte (und sonst niemand Zugriff darauf hat) noch versucht, die Lambda-Funktion in irgendeiner anderen Art und Weise auszuführen. Wie kommt es dazu, dass es mehrere Minuten lang ausgeführt wurde, bis ich es gelöscht habe? Ich hätte auf jeden Fall vorsichtiger sein und ein paar lokale Vortests durchführen sollen, aber soll nicht die Dauerlimite garantieren, dass nichts ausgeführt wird, sobald es erreicht ist?

Vielen Dank für Ihre Hilfe.

+1

Wo liegt der Beweis, dass es für einen Aufruf länger als 15 Sekunden lief? Das Diagramm ist in Millisekunden, also 15 Sekunden = 15000. Es sieht so aus, als würde es weiter ausgeführt, weil es immer aufgerufen wurde, und löschte es mehr Aufrufe. –

+0

Sie haben Recht. Das Problem ist nicht, dass die Funktion für mehr als 15 Sekunden lief, aber wie ich in der Nachricht sagte, beobachtete ich mehrere aufeinanderfolgende schnelle Läufe ohne Grund (die DynamoDB wurde nicht aktualisiert, also sollte nichts in den Stream kommen und ich habe es nicht versucht um die Funktion auf andere Weise auszuführen). –

Antwort

3

Ich habe endlich den Ursprung dieses Verhaltens herausgefunden. In AWS Lambda official documentation wird gesagt, dass:

Abhängig von der Ereignisquelle, AWS Lambda der ausgefallene Lambda Funktion wiederholen kann. Wenn Amazon Kinesis beispielsweise die Ereignisquelle für die Lambda-Funktion ist, wiederholt AWS Lambda die fehlgeschlagene Funktion, bis die Lambda-Funktion erfolgreich ist oder die Datensätze im Stream ablaufen.

DynamoDB Ströme haben einen Ablauf Verzögerung von 24 Stunden, so nur meine Funktion dann gestoppt habe.