AWS Lambda-Funktionsfehler in Python - 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.

AWS Lambda-Funktionsfehler in Python

Wenn Ihr Code einen Fehler auslöst, generiert Lambda eine JSON-Darstellung des Fehlers. Dieses Fehlerdokument wird im Aufrufprotokoll und im Fall eines synchronen Aufrufs in der Ausgabe angezeigt.

Auf dieser Seite wird beschrieben, wie Lambda Funktionsaufruffehler für die Laufzeit Python mithilfe der Lambda-Konsole und AWS CLI angezeigt werden.

Funktionsweise

Wenn Sie eine Lambda-Funktion aufrufen, erhält Lambda die Aufrufanfrage und validiert die Berechtigungen in Ihrer Ausführungsrolle, überprüft, ob das Ereignisdokument ein gültiges JSON-Dokument ist, und prüft Parameterwerte.

Wenn die Anforderung die Validierung besteht, sendet Lambda die Anfrage an eine Funktions-Instance. Die Lambda-Laufzeitumgebung wandelt das Ereignisdokument in ein Objekt um und leitet es an Ihren Funktions-Handler weiter.

Wenn Lambda auf einen Fehler stößt, gibt er einen Ausnahmetyp, eine Meldung und einen HTTP-Statuscode zurück, der die Ursache des Fehlers angibt. Der Client oder Service, der die Lambda-Funktion aufgerufen hat, kann den Fehler behandeln oder ihn an einen Endbenutzer weitergeben. Das korrekte Fehlerbehandlungsverhalten hängt von der Art der Anwendung, der Zielgruppe und der Fehlerquelle ab.

Die folgende Liste beschreibt den Bereich der Statuscodes, die Sie von Lambda erhalten können.

2xx

Ein 2xx-Serienfehler mit einem X-Amz-Function-Error-Header in der Antwort weist auf einen Lambda-Laufzeit- oder -Funktionsfehler hin. Ein 2xx-Serienstatuscode zeigt an, dass Lambda die Anfrage akzeptiert hat, aber anstelle eines Fehlercodes zeigt Lambda den Fehler an, indem der X-Amz-Function-Error-Header in die Antwort aufgenommen wird.

4xx

Ein 4xx-Serienfehler weist auf einen Fehler hin, den der aufrufende Client oder Dienst beheben kann, indem er die Anfrage ändert, eine Berechtigung beantragt oder die Anfrage wiederholt. 4xx-Serienfehler, abgesehen von 429, weisen allgemein auf einen Fehler bei der Anfrage hin.

5xx

Ein 5xx-Serienfehler weist auf ein Problem mit Lambda oder ein Problem mit der Konfiguration oder Ressourcen der Funktion hin. 5xx-Serienfehler können auf einen temporären Zustand hinweisen, der ohne Eingreifen des Benutzers behoben werden kann. Diese Probleme können vom aufrufenden Client oder Service nicht behoben werden, aber der Eigentümer einer Lambda-Funktion kann das Problem möglicherweise beheben.

Eine vollständige Liste der Aufruffehler finden Sie unter InvokeFunction Fehler .

Verwenden von Lambda-Konsole

Sie können Ihre Funktion auf der Lambda-Konsole aufrufen, indem Sie ein Testereignis konfigurieren und die Ausgabe anzeigen. Die Fehlerausgabe wird in den Ausführungsprotokollen der Funktion erfasst und, wenn die aktives Tracing in AWS X-Ray aktiviert ist.

So rufen Sie eine Funktion in der Lambda-Konsole auf
  1. Öffnen Sie die Seite Funktionen der Lambda-Konsole.

  2. Wählen Sie die zu testende Funktion aus und wählen Sie Test.

  3. Wählen Sie unter Testereignis die Option Neues Ereignis aus.

  4. Wählen Sie eine Vorlage aus.

  5. Geben Sie für Name einen Namen für den Test ein. Geben Sie im Texteingabefeld das JSON-Testereignis ein.

  6. Wählen Sie Änderungen speichern aus.

  7. Wählen Sie Test aus.

Die Lambda-Konsole ruft Ihre Funktion synchron auf und zeigt das Ergebnis an. Um die Antwort, Protokolle und andere Informationen anzuzeigen, erweitern Sie den Abschnitt Details .

Verwenden von AWS Command Line Interface (AWS CLI)

Die AWS CLI ist ein Open-Source-Tool, mit dem Sie über Befehle in Ihrer Befehlszeilen-Shell mit den AWS-Services interagieren können. Zur Durchführung der Schritte in diesem Abschnitt benötigen Sie Folgendes:

Wenn Sie eine Lambda-Funktion in AWS CLI aufrufen, teilt AWS CLI die Antwort in zwei Dokumente auf. Die AWS CLI-Antwort wird in Ihrer Eingabeaufforderung angezeigt. Wenn ein Fehler aufgetreten ist, enthält die Antwort ein FunctionError-Feld. Die Aurufantwort oder der Fehler, die bzw. der von der Funktion zurückgegeben wird, wird in die Ausgabedatei geschrieben. Beispiel: output.json oder output.txt.

Das folgende Beispiel für den Befehl invoke zeigt, wie Sie eine Funktion aufrufen und die Aufrufantwort in eine output.txt-Datei schreiben.

aws lambda invoke \ --function-name my-function \ --cli-binary-format raw-in-base64-out \ --payload '{"key1": "value1", "key2": "value2", "key3": "value3"}' output.txt

Die cli-binary-format-Option ist erforderlich, wenn Sie AWS CLI Version 2 verwenden. Um dies zur Standardeinstellung zu machen, führen Sie aws configure set cli-binary-format raw-in-base64-out aus. Weitere Informationen finden Sie unter Von AWS CLI unterstützte globale Befehlszeilenoptionen im AWS Command Line Interface-Benutzerhandbuch für Version 2.

Sie sollten die AWS CLI-Antwort in Ihrer Eingabeaufforderung sehen:

{ "StatusCode": 200, "FunctionError": "Unhandled", "ExecutedVersion": "$LATEST" }

Sie sollten die Antwort auf den Funktionsaufruf in der output.txt-Datei sehen. In derselben Eingabeaufforderung können Sie die Ausgabe auch in Ihrer Eingabeaufforderung anzeigen mit:

cat output.txt

Sie sollten die Aufrufantwort in Ihrer Eingabeaufforderung sehen.

{"errorMessage": "'action'", "errorType": "KeyError", "stackTrace": [" File \"/var/task/lambda_function.py\", line 36, in lambda_handler\n result = ACTIONS[event['action']](event['number'])\n"]}

Lambda zeichnet auch bis zu 256 KB des Fehlerobjekts in den Protokollen der Funktion auf. Weitere Informationen finden Sie unter AWS Lambda-Funktionsprotokollierung in Python.

Fehlerbehandlung in anderen AWS-Services

Wenn ein anderer AWS-Service Ihre Funktion aufruft, wählt der Service den Aufruftyp und das Wiederholungsverhalten aus. AWS-Services können Ihre Funktion nach einem Zeitplan aufrufen, als Reaktion auf ein Lebenszyklusereignis auf einer Ressource oder um eine Anfrage von einem Benutzer zu bedienen. Einige Services rufen Funktionen asynchron auf und lassen Fehler von Lambda verarbeiten, während es bei anderen Fehlern erneut versucht wird, oder sie an den Benutzer zurückgeben werden.

API Gateway behandelt beispielsweise alle Aufruf- und Funktionsfehler als interne Fehler. Wenn die Lambda-API die Aufruf-Anforderung ablehnt, gibt API Gateway einen 500-Fehlercode zurück. Wenn die Funktion ausgeführt wird, aber einen Fehler oder eine Antwort im falschen Format zurückgibt, gibt API Gateway den Fehlercode 502 zurück. Um die Fehlerantwort anzupassen, müssen Sie Fehler im Code abfangen und eine Antwort im erforderlichen Format formatieren.

Wir empfehlen die Verwendung von AWS X-Ray, um die Fehlerquelle und deren Ursache zu ermitteln. Mit X-Ray können Sie herausfinden, bei welcher Komponente ein Fehler aufgetreten ist, und Details zu den Fehlern anzeigen. Das folgende Beispiel zeigt einen Funktionsfehler, der zu einer 502-Antwort von API Gateway führte.


          Ablaufverflogungszuweisung für einen Funktionsfehler mit API Gateway.

Weitere Informationen finden Sie unter Instrumentieren von Python-Code in AWS Lambda.

Beispiele für Fehler

Der folgende Abschnitt zeigt häufige Fehler, die Sie beim Erstellen, Aktualisieren oder Aufrufen Ihrer Funktion mit Python erhalte Lambda-Laufzeiten.

Beispiel Laufzeitausnahme – ImportError
{ "errorMessage": "Unable to import module 'lambda_function': Cannot import name '_imaging' from 'PIL' (/var/task/PIL/__init__.py)", "errorType": "Runtime.ImportModuleError" }

Dieser Fehler ist das Ergebnis der Verwendung von AWS Command Line Interface (AWS CLI) zum Hochladen eines Bereitstellungspakets, das eine C- oder C++-Bibliothek enthält. Zum Beispiel die Pillow (PIL)-, Numpy-oder Pandas-Bibliothek.

Wir empfehlen die Verwendung des Befehls AWS SAMCLI sam build mit der --use-container-Option zum Erstellen Ihres Bereitstellungspakets. Wenn Sie die AWS SAM CLI mit dieser Option verwenden, wird ein Docker-Container mit einer Lambda-ähnlichen Umgebung erstellt, die mit Lambda kompatibel ist.

Beispiel JSON-Serialisierungsfehler – Laufzeit.MarshalError
{ "errorMessage": "Unable to marshal response: Object of type AttributeError is not JSON serializable", "errorType": "Runtime.MarshalError" }

Dieser Fehler kann das Ergebnis des Base64-Codierungsmechanismus sein, den Sie in Ihrem Funktionscode verwenden. Zum Beispiel:

import base64 encrypted_data = base64.b64encode(payload_enc).decode("utf-8")

Dieser Fehler kann auch darauf zurückzuführen sein, dass Ihre ZIP-Datei nicht als Binärdatei angegeben wird, wenn Sie Ihre Funktion erstellt oder aktualisiert haben. Wir empfehlen die Verwendung der Befehlsoption fileb:// zum Hochladen Ihres Bereitstellungspakets (.zip-Datei).

aws lambda create-function --function-name my-function --zip-file fileb://my-deployment-package.zip --handler lambda_function.lambda_handler --runtime python3.8 --role arn:aws:iam::your-account-id:role/lambda-ex

Beispielanwendungen

Das GitHub Repository für dieses Handbuch enthält Beispielanwendungen, die die Verwendung der Fehler demonstrieren. Jede Beispielanwendung enthält Skripts für die einfache Bereitstellung und Bereinigung, eine AWS Serverless Application Model (AWS SAM)-Vorlage und unterstützende Ressourcen.

Lambda-Beispielanwendungen in Python
  • blank-python AWS X-Ray Eine Python-Funktion, die die Verwendung von Protokollierung, Umgebungsvariablen, AWS-Ablaufverfolgung, Ebenen, Einheitentests und des SDK aufzeigt.

Als nächstes