Zum Beispiel, wenn ich einen bestimmten 400-Fehler für ungültige Parameter oder vielleicht einen 201-Fehler zurückgeben möchte, wenn der Lambda-Funktionsaufruf zu einer Erstellung führte.
Ich hätte gerne verschiedene http-Statuscodes, aber es sieht so aus, als ob das API-Gateway immer einen 200-Statuscode zurückgibt, selbst wenn die Lambda-Funktion einen Fehler zurückgibt.
amazon-web-services
aws-lambda
aws-api-gateway
MonkeyBonkey
quelle
quelle
Antworten:
Update per 20-9-2016
Amazon hat dies mithilfe der Lambda Proxy-Integration endlich einfach gemacht . Dadurch kann Ihre Lambda-Funktion die richtigen HTTP-Codes und -Header zurückgeben:
Verabschieden Sie sich von der Anforderungs- / Antwortzuordnung im API-Gateway!
Option 2
Integrieren Sie eine vorhandene Express-App mit aws-serverless-express in Lambda / API Gateway .
quelle
callback
Stil erreicht werden. Tu es einfachcallback(null, {statusCode: 200, body: 'whatever'})
.return { "isBase64Encoded": True, "statusCode": 200, "headers": { }, "body": "" }
Hier ist der schnellste Weg, um benutzerdefinierte HTTP-Statuscodes und einen benutzerdefinierten zurückzugeben
errorMessage
:Gehen Sie im API Gateway-Dashboard wie folgt vor:
Fügen Sie für jeden zuvor erstellten HTTP- Statuscode eine Integrationsantwort hinzu . Stellen Sie sicher, dass die Eingabe-Passthrough aktiviert ist. Verwenden Sie den Lambda-Fehler-Regex , um zu ermitteln, welcher Statuscode verwendet werden soll, wenn Sie eine Fehlermeldung von Ihrer Lambda-Funktion zurückgeben. Beispielsweise:
Ihre API-Gateway-Route sollte Folgendes zurückgeben:
Ich sehe keine Möglichkeit, diese Einstellungen zu kopieren und für verschiedene Methoden wiederzuverwenden, daher müssen wir viel nervige redundante manuelle Eingaben vornehmen!
Meine Integrationsantworten sehen folgendermaßen aus:
quelle
return context.fail(new Error('bad one'))
Um ein benutzerdefiniertes Fehlerobjekt als JSON zurückgeben zu können, müssen Sie durch einige Rahmen springen.
Zuerst müssen Sie das Lambda nicht bestehen und ihm ein stringifiziertes JSON-Objekt übergeben:
Als Nächstes richten Sie die Regex-Zuordnung für jeden Statuscode ein, den Sie zurückgeben möchten. Mit dem oben definierten Objekt würden Sie diesen regulären Ausdruck für 400 einrichten:
. * "Status": 400. *
Schließlich richten Sie eine Zuordnungsvorlage ein, um die JSON-Antwort aus der von Lambda zurückgegebenen errorMessage-Eigenschaft zu extrahieren. Die Zuordnungsvorlage sieht folgendermaßen aus:
$ input.path ('$. errorMessage')
Ich habe einen Artikel dazu geschrieben, der detaillierter geht und den Antwortfluss von Lambda zum API-Gateway hier erklärt: http://kennbrodhagen.net/2016/03/09/how-to-return-a-custom-error-object -und-Status-Code-vom-API-Gateway-mit-Lambda /
quelle
1) Konfigurieren Sie Ihre API-Gateway-Ressource für die Verwendung der Lambda-Proxy-Integration, indem Sie das Kontrollkästchen "Lambda-Proxy-Integration verwenden" im Bildschirm "Integrationsanforderung" der API-Gateway-Ressourcendefinition aktivieren. (Oder definieren Sie es in Ihrer Cloudformation / Terraform / Serverless / etc-Konfiguration)
2) Ändern Sie Ihren Lambda-Code auf zwei Arten
event
(1. Funktionsargument) entsprechend. Es ist nicht mehr nur die bloße Nutzlast, sondern stellt die gesamte HTTP-Anforderung dar, einschließlich Header, Abfragezeichenfolge und Text. Beispiel unten. Der entscheidende Punkt ist, dass JSON-Körper Zeichenfolgen sind, die einen explizitenJSON.parse(event.body)
Aufruf erfordern (vergessen Sietry/catch
das nicht). Beispiel ist unten.statusCode
,body
undheaders
.body
sollte eine Zeichenfolge sein, tun Sie diesJSON.stringify(payload)
nach BedarfstatusCode
kann eine Zahl seinheaders
ist ein Objekt von Headernamen zu WertenBeispiel für ein Lambda-Ereignisargument für die Proxy-Integration
Beispiel für eine Rückrufantwortform
Anmerkungen - Ich glaube, die Methoden auf
context
solchecontext.succeed()
sind veraltet. Sie sind nicht mehr dokumentiert, obwohl sie noch zu funktionieren scheinen. Ich denke, dass das Codieren in die Callback-API die richtige Sache für die Zukunft ist.quelle
Ich wollte, dass ein Fehler von Lambda richtig ist. 500 Fehler, nachdem ich viel recherchiert hatte, fand ich das Folgende, das funktioniert:
Auf LAMBDA
Für eine gute Antwort kehre ich wie folgt zurück:
Für eine schlechte Antwort kehren Sie wie folgt zurück
Auf dem API-Gateway
Sagen Sie für eine GET-METHODE GET von / res1 / service1:
Dann,
Veröffentlichen Sie nun / res1 / service1 und klicken Sie auf die veröffentlichte URL, die mit dem obigen Lambda verbunden ist
Wenn Sie das Chrome-Plugin des Advanced REST-Clients (oder Postman) verwenden, werden anstelle aller 200 http-Antwortcodes für alle Anforderungen, die in "httpStatusCode" angegeben wurden, die richtigen http-Codes wie Serverfehler (500) oder 400 angezeigt.
Im 'Dashboard' der API im API-Gateway können Sie die folgenden http-Statuscodes sehen:
quelle
Der einfachste Weg, dies zu tun, ist die Verwendung der LAMBDA_PROXY-Integration . Mit dieser Methode müssen keine speziellen Transformationen in die API-Gateway-Pipeline festgelegt werden.
Ihr Rückgabeobjekt muss dem folgenden Snippet ähnlich sein:
Es hat einige Nachteile: Sie müssen besonders vorsichtig mit der Fehlerbehandlung umgehen und Ihre Lambda-Funktion an den API-Gateway-Endpunkt koppeln. Das heißt, wenn Sie es nicht wirklich irgendwo anders verwenden würden, ist es kein so großes Problem.
quelle
Für diejenigen, die alles versucht haben, was mit dieser Frage zu tun hat, und diese Arbeit nicht zum Laufen bringen konnten (wie ich), lesen Sie den Kommentar zu diesem Beitrag (rettete meinen Tag):
https://forums.aws.amazon.com/thread.jspa?threadID=192918
Wiedergabe ganz unten:
quelle
So wird es in einem AWS Compute-Blog empfohlen, wenn Sie API Gateway verwenden. Überprüfen Sie, ob die Integration mit dem direkten Lambda-Aufruf funktioniert.
Für direkte Lambda-Aufrufe scheint dies die beste Lösung zu sein, die auf der Clientseite analysiert wird.
quelle
Ich verwende serverless 0.5. So funktioniert es in meinem Fall
s-function.json:
handler.js:
quelle
Wenn Sie keinen Proxy verwenden möchten, können Sie diese Vorlage verwenden:
quelle