Wie sorge ich für die korrekte Zusammenarbeit zwischen meiner Lambda-Funktion und meiner Amazon EC2 Instance oder dem AWS Instance Scheduler?

Letzte Aktualisierung: 08.09.2021

Ich verwende eine Amazon Elastic Compute Cloud (Amazon EC2)-Instance oder den AWS Instance Scheduler mit einer AWS Lambda-Funktion. Meine Lambda-Funktion läuft jedoch ab, wird nicht aufgerufen oder gibt Fehler aus.

Kurzbeschreibung

Der AWS Instance Scheduler kann aus folgenden Gründen dazu führen, dass Ihre Lambda-Funktion inkorrekt arbeitet:

  • Sie erhalten ein SDK-Timeout. Um dieses Problem zu beheben, führen Sie die Schritte im Abschnitt SDK-Timeouts beheben aus.
  • Sie erhalten ein Funktions-Timeout. Um dieses Problem zu beheben, führen Sie die Schritte im Abschnitt Funktions-Timeouts verhindern aus.
  • Eine Amazon CloudWatch Events-Regel wurde nicht ausgelöst. Um dieses Problem zu beheben, führen Sie die Schritte im Abschnitt Überprüfen, ob Ihre geplante Regel aufgerufen wurde aus.
  • Ihre Funktion drosselt. Um dieses Problem zu beheben, führen Sie die Schritte im Abschnitt Funktionseindrosselung verhindern aus.
  • Sie erhalten doppelte Lambda-Aufrufe. Um dieses Problem zu beheben, führen Sie die Schritte im Abschnitt Fehler mithilfe von Idempotenz verhindern aus.

Hinweis: Der AWS Instance Scheduler führt Lambda-Funktionen in festgelegten Intervallen mithilfe einer CloudWatch Events-Regel aus, um die Lambda-Funktion zu planen. Dies führt zu einem asynchronen Aufruf der Lambda-Funktion, was sich darauf auswirkt, wie Funktionsfehler behandelt werden. Wenn die Funktion aufgrund eines Fehlers bei der Ausführung fehlschlägt, wird das Ereignis standardmäßig bis zu zwei Mal wiederholt. Danach wird das Ereignis verworfen. Bei Drosseln kann das Ereignis bis zu sechs Stunden lang in die Warteschlange gestellt werden, bevor das Ereignis verworfen wird.

Auflösung

SDK-Timeouts beheben

Das standardmäßige SDK-Timeout wird in früheren Versionen des AWS Instance Scheduler nicht überschrieben. Wenn der API-Aufruf zum Starten oder Stoppen einer Instance in den früheren Versionen länger als 60 Sekunden für eine Antwort benötigt, läuft die Anforderung ab.

Um dieses Problem zu beheben, rufen Sie die neueste Version des AWS Instance Scheduler auf oder ändern Sie den read_timeout-Wert Ihres Boto3-Konfigurationsobjekts (auf der Boto3-Website). Beispiel:

import boto3
from botocore.config import Config

client_config = Config(read_timeout=890)

ec2 = boto3.client('ec2', config=client_config)

Funktions-Timeouts verhindern

Wenn Ihre Lambda-Funktion eine Zeitüberschreitung abläuft, prüfen Sie, ob die Funktion darauf wartet, zu überprüfen, ob die EC2-Instance gestartet wurde. Weitere Informationen finden Sie unter Warum kann ich meine EC2-Instance nicht starten oder launchen?

Instances benötigen möglicherweise einige Minuten, um den Status RUNNING zu erreichen. Ihre Funktion kann eine Zeitüberschreitung aufweisen, wenn die Zeit bis zum Erreichen des Status RUNNING länger ist als das konfigurierte Timeout für die Funktion beträgt. Um dieses Problem zu beheben, erhöhen Sie das Timeout für Ihre Funktion, indem Sie den Timeout-Wert von 300 (5 Minuten) in Ihrer AWS CloudFormation-Vorlage ändern. Legen Sie eine ausreichende Zeitspanne fest, damit die Instance gestartet werden kann, bevor die Funktion abläuft. Beispiel:

"Runtime": "python3.7",
"Timeout": 300,
"TracingConfig": {
    "Mode": "Active"
}

Hinweis: Lambda-Funktionen haben einen maximal konfigurierbaren Timeout-Wert von 15 Minuten.

Wenn sich Ihre Funktion in einer Virtual Private Cloud befindet, müssen Sie Ihrer Funktion erlauben, auf das Internet zuzugreifen, um die Amazon EC2-API aufzurufen.

Vergewissern Sie sich, dass Ihre geplante Regel aufgerufen wurde

Informationen zur Fehlerbehebung bei einer Lambda-Funktion, die nicht von CloudWatch Events aufgerufen wird, finden Sie unter Warum wurde meine Lambda-Funktion nicht durch meine CloudWatch-Events-Regel ausgelöst?

Funktionseindrosselung verhindern

Wie behebe ich Fehler bei der Drosselung von Lambda-Funktionen mit den Fehlern „Rate exceeded“ (Rate überschritten) und 429 „TooManyRequestsException“ (Ausnahme – zu viele Anfragen)?

Bei asynchronen Aufrufen können Lambda-Drosselungen auf Ihrem Konto den Aufruf Ihrer Funktion beeinträchtigen. Alle asynchronen Aufrufe werden an eine Ereigniswarteschlange gesendet, bevor sie aufgerufen werden. Wenn eine andere Funktion auch eine hohe Anzahl von asynchronen Aufrufen erhalten hat, kann Ihre Ereigniswarteschlange in Rückstand geraten. Dieser Rückstand bedeutet nicht, dass Ihre Funktion nicht aufgerufen wurde. Dieser Rückstand bedeutet, dass sich das Ereignis verzögert hat. Sie sehen möglicherweise mehrere Aufrufe, nachdem der Rückstand der Ereigniswarteschlange behoben wurde. Standardmäßig bleiben Ereignisse in Ihrer asynchronen Ereigniswarteschlange bis zu sechs Stunden in der asynchronen Ereigniswarteschlange.

Fehler mithilfe von Idempotenz verhindern

Um Fehler durch doppelte Aufrufe zu vermeiden, machen Sie Ihre Lambda-Funktion idempotent, wenn sie mit einem asynchronen Aufruf konfiguriert ist.

Beachten Sie, dass asynchrone Lambda-Aufrufe aufgrund der letztendlichen Konsistenz mit der Ereigniswarteschlange mehr als einmal auftreten können.


War dieser Artikel hilfreich?


Benötigen Sie Hilfe zur Fakturierung oder technischen Support?