Wie kann ich die Fehler beheben, die ich erhalte, wenn ich API Gateway in eine Lambda-Funktion integriere?

Lesedauer: 6 Minute
0

Ich möchte die Fehler beheben, die ich erhalte, wenn ich Amazon API Gateway in eine AWS Lambda-Funktion integriere.

Lösung

Aktivieren Sie die Protokollierung für Ihre API und Phase

1.    Suchen Sie in der API-Gateway-Konsole nach dem Stage Editor (Phaseneditor) für Ihre API.

2.    Wählen Sie im Bereich Stage Editor (Phaseneditor) die Registerkarte Logs/Tracing (Protokolle/Tracing).

3.    Gehen Sie auf der Registerkarte Logs/Tracing (Protokolle/Tracing) für CloudWatch Settings (Cloudwatch-Einstellungen) wie folgt vor, um die Protokollierung zu aktivieren:
Aktivieren Sie das Kontrollkästchen Enable CloudWatch Logs (CloudWatch-Protokolle aktivieren).
Wählen Sie unter Log level (Protokollebene) die Option INFO aus, um Protokolle für alle Anfragen zu generieren. Oder wählen Sie ERROR (FEHLER), um Protokolle nur für Anfragen an Ihre API zu generieren, die zu einem Fehler führen.
Aktivieren Sie für REST-APIs das Kontrollkästchen Log full requests/responses data (Vollständige Anfragen/Antwortdaten protokollieren). Oder aktivieren Sie für WebSocket-APIs das Kontrollkästchen Log full message data (Vollständige Nachrichtendaten protokollieren).

4.    Gehen Sie unter Custom Access Logging (Benutzerdefinierte Zugriffsprotokollierung) wie folgt vor, um die Zugriffsprotokollierung zu aktivieren:
Aktivieren Sie das Kontrollkästchen Enable Access Logging (Zugriffsprotokollierung aktivieren).
Geben Sie für Access Log Destination ARN den Amazon-Ressourcennamen (ARN) einer CloudWatch-Protokollgruppe oder eines Amazon Kinesis Data Firehose-Streams ein.
Geben Sie ein Log Format (Protokollformat) ein. Wählen Sie zur Orientierung CLF, JSON, XML oder CSV, um ein Beispiel in diesem Format zu sehen.

5.    Wählen Sie Save changes (Änderungen speichern).
**Hinweis:**Die Konsole bestätigt nicht, dass die Einstellungen gespeichert wurden.

Weitere Informationen finden Sie unter Einrichten der CloudWatch-API-Protokollierung mithilfe der API Gateway-Konsole.

Ermitteln Sie die Integrationstypen, überprüfen Sie Fehler und ergreifen Sie die nächsten Schritte

1.    Stellen Sie fest, ob eine Lambda-Proxyintegration oder eine benutzerdefinierte Lambda-Integration in API Gateway eingerichtet ist. Sie können den Integrationstyp überprüfen, indem Sie die Lambda-Funktionsausgabe überprüfen oder den Befehl get-integration ausführen.

2.    Stellen Sie sicher, dass die Fehler in API Gateway den Fehlern in Lambda entsprechen. Führen Sie die folgende CloudWatch Logs Insights-Abfrage aus, um einen Fehlerstatuscode in einem bestimmten Zeitraum zu finden:

parse @message '(*) *' as reqId, message
    | filter message like /Method completed with status: \d\d\d/
    | parse message 'Method completed with status: *' as status
    | filter status != 200
    | sort @timestamp asc
    | limit 50

Führen Sie dann die folgende CloudWatch Logs Insights-Abfrage aus, um im gleichen Zeitraum nach Lambda-Fehlerprotokollen zu suchen:

fields @timestamp, @message
    | filter @message like /(?i)(Exception|error|fail)/
    | sort @timestamp desc
    | limit 20

3.    Wählen Sie je nach Art des Fehlers, den Sie in Ihren Protokollen identifizieren, eine der folgenden Optionen aus:

Wenn die folgende Fehlermeldung angezeigt wird, führen Sie die Schritte im Abschnitt Beheben von Problemen mit der Parallelität aus.

(XXXXX) Lambda invocation failed with status: 429. Lambda request id: XXXXXXXXXX
(XXXXX) Execution failed due to configuration error: Rate Exceeded.
(XXXXX) Method completed with status: 500

Wenn eine der folgenden Fehlermeldungen angezeigt wird, führen Sie die Schritte im Abschnitt Beheben von Timeout-Problemen aus.

Für eine benutzerdefinierte Lambda-Integration:

< 29 sec:
(XXXXX) Method response body after transformations: {"errorMessage":"2019-08-14T02:45:14.133Z xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Task timed out after xx.01 seconds"}
> 29 sec:
(XXXXX) Execution failed due to a timeout error

Für eine Lambda-Proxy-Integration:

< 29 sec:
(XXXXX) Endpoint response body before transformations: {"errorMessage":"2019-08-14T02:50:25.865Z xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Task timed out after xx.01 seconds"}
> 29 sec:
(XXXXX) Execution failed due to a timeout error

Wenn die folgende Fehlermeldung angezeigt wird, führen Sie die Schritte im Abschnitt Beheben von Funktionsfehlern aus.

(XXXXX) Execution failed due to configuration error: Malformed Lambda proxy response
(XXXXX) Method response body after transformations: {"errorMessage": "Syntax error in module 'lambda_function'"}

Beheben von Problemen mit der Parallelität

Ihnen werden die Fehlermeldung 429 Drosselungsfehler oder Fehler 500 angezeigt, wenn zusätzliche Anfragen vom API Gateway schneller eingehen als Ihre Lambda-Funktion skalieren kann.

Um diese Fehler zu beheben, analysieren Sie die Metriken Count (Anzahl) (API Gateway), Throttles (Drosselungen) (Lambda) und ConcurrentExecutions (Gleichzeitige Ausführungen) (Lambda) in CloudWatch. Beachten Sie Folgendes:

  • Count (Anzahl) (API Gateway) ist die Gesamtzahl der API-Anfragen in einem bestimmten Zeitraum.
  • Throttles (Drosselungen) (Lambda) sind die Anzahl der Aufrufanfragen, die gedrosselt werden. Wenn alle Funktions-Instances Anfragen verarbeiten und keine Parallelität zur Skalierung verfügbar ist, lehnt Lambda weitere Anfragen mit dem Fehler TooManyRequestsException ab. Gedrosselte Anfragen und andere Aufruffehler gelten nicht als Aufrufe oder Fehler.
  • ConcurrentExecutions (Gleichzeitige Ausführungen) (Lambda) ist die Anzahl der Funktions-Instances, die Ereignisse verarbeiten. Wenn diese Zahl Ihr Kontingent für gleichzeitige Ausführungen für die AWS-Region erreicht, werden zusätzliche Aufrufanfragen gedrosselt. Aufrufanfragen werden ebenfalls gedrosselt, wenn die Anzahl der Funktions-Instances die reservierte Parallelitätsgrenze erreicht, die Sie für die Funktion konfiguriert haben.

**Hinweis:**Weitere Informationen finden Sie unter API-Gateway-Metriken und Arbeiten mit Lambda-Funktionsmetriken.

Wenn Sie die Reserve-Parallelität in Ihrer Lambda-Funktion festlegen, legen Sie einen höheren Reserve-Parallelitätswert für die Lambda-Funktion fest. Oder entfernen Sie den Wert für umgekehrte Parallelität aus der Lambda-Funktion. Die Funktion greift dann auf den Pool der vorbehaltlosen gleichzeitigen Ausführungen zurück.

Wenn Sie in der Lambda-Funktion die Reserve-Parallelität nicht festlegen, überprüfen Sie die Verwendung der Metrik ConcurrentExecutions (Gleichzeitige Ausführungen). Weitere Informationen finden Sie unter Lambda-Kontingente.

Beheben von Problemen mit dem Timeout

Das Integrations-Timeout beträgt 29 Sekunden (ein festes Limit) für alle API Gateway-Integrationen. Beim Erstellen einer API Gateway-API mit Lambda-Integration können zwei Szenarien auftreten. Die Szenarien liegen vor, wenn das Timeout weniger als 29 Sekunden oder mehr als 29 Sekunden beträgt.

Wenn das Timeout Ihrer Lambda-Funktion weniger als 29 Sekunden beträgt, überprüfen Sie Ihre Lambda-Protokolle, um dieses Problem zu untersuchen. Wenn Ihre Lambda-Funktion nach 29 Sekunden ausgeführt werden muss, sollten Sie erwägen, die Lambda-Funktion asynchron aufzurufen.

Führen Sie für die benutzerdefinierte Lambda-Integration die folgenden Schritte aus:

1.    Öffnen Sie die API Gateway-Konsole.

2.    Wählen Sie im Navigationsbereich APIs und dann Ihre API aus.

3.    Wählen Sie Resources (Ressourcen) und dann Ihre Methode aus.

4.    Wählen Sie Integration Request (Integrationsanfrage).

5.    Wählen Sie Method Request (Methodenanfrage).

6.    Erweitern Sie HTTP Request Headers (HTTP-Anfragenheader).

7.    Wählen Sie Add header (Header hinzufügen).

8.    Geben Sie unter Name einen Namen für Ihren Header ein. Zum Beispiel: X-Amz-Aufruftyp

**Wichtig:**Sie müssen Ihrem Header 'Event' zuordnen (einfache Anführungszeichen sind erforderlich).

Für die Lambda-Proxy-Integration:

Verwenden Sie zwei Lambda-Funktionen: Funktion A und Funktion B. API Gateway ruft Funktion A zunächst synchron auf. Dann ruft Funktion A asynchron Funktion B auf. Funktion A kann eine erfolgreiche Antwort an API Gateway zurückgeben, wenn Funktion B asynchron aufgerufen wird.

Wenn Sie die Lambda-Proxy-Integration verwenden, sollten Sie erwägen, sie auf eine benutzerdefinierte Integration umzustellen. Sie müssen jedoch die Zuordnungsvorlagen konfigurieren, um die Anfrage/Antwort in das gewünschte Format umzuwandeln. Weitere Informationen finden Sie unter Einrichten des asynchronen Aufrufs der Backend-Lambda-Funktion.

Hinweis: Da eine asynchrone Lambda-Funktion im Hintergrund ausgeführt wird, kann Ihr Client keine Daten direkt von einer Lambda-Funktion empfangen. Sie benötigen eine Zwischendatenbank, um persistente Daten zu speichern.

Beheben von Funktionsfehlern

Wenn Sie beim Aufrufen Ihrer API einen Funktionsfehler erhalten, überprüfen Sie Ihre Lambda-Funktion auf Syntaxfehler. Dieser Fehler tritt auch auf, wenn Ihre Lambda-Funktion kein gültiges JSON-Objekt zurückgibt, das API Gateway für Proxy-Integrationen erwartet.

Um diesen Fehler zu beheben, führen Sie die Schritte im Abschnitt Aktivieren der Protokollierung für Ihre API und Phase durch.


Verwandte Informationen

Behandeln von Standard-Lambda-Fehlern in API Gateway

Behandeln von benutzerdefinierten Lambda-Fehlern in API Gateway

AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr