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
- Verarbeiten Sie den Eingang
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 expliziten JSON.parse(event.body)
Aufruf erfordern (vergessen Sie try/catch
das nicht). Beispiel ist unten.
- Respond durch den Rückruf mit null dann eine Antwort Objekt aufrufen , die die HTTP - Details einschließlich bietet
statusCode
, body
und headers
.
body
sollte eine Zeichenfolge sein, tun Sie dies JSON.stringify(payload)
nach Bedarf
statusCode
kann eine Zahl sein
headers
ist ein Objekt von Headernamen zu Werten
Beispiel für ein Lambda-Ereignisargument für die Proxy-Integration
{
"resource": "/example-path",
"path": "/example-path",
"httpMethod": "POST",
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"CloudFront-Forwarded-Proto": "https",
"CloudFront-Is-Desktop-Viewer": "true",
"CloudFront-Is-Mobile-Viewer": "false",
"CloudFront-Is-SmartTV-Viewer": "false",
"CloudFront-Is-Tablet-Viewer": "false",
"CloudFront-Viewer-Country": "US",
"Content-Type": "application/json",
"Host": "exampleapiid.execute-api.us-west-2.amazonaws.com",
"User-Agent": "insomnia/4.0.12",
"Via": "1.1 9438b4fa578cbce283b48cf092373802.cloudfront.net (CloudFront)",
"X-Amz-Cf-Id": "oCflC0BzaPQpTF9qVddpN_-v0X57Dnu6oXTbzObgV-uU-PKP5egkFQ==",
"X-Forwarded-For": "73.217.16.234, 216.137.42.129",
"X-Forwarded-Port": "443",
"X-Forwarded-Proto": "https"
},
"queryStringParameters": {
"bar": "BarValue",
"foo": "FooValue"
},
"pathParameters": null,
"stageVariables": null,
"requestContext": {
"accountId": "666",
"resourceId": "xyz",
"stage": "dev",
"requestId": "5944789f-ce00-11e6-b2a2-dfdbdba4a4ee",
"identity": {
"cognitoIdentityPoolId": null,
"accountId": null,
"cognitoIdentityId": null,
"caller": null,
"apiKey": null,
"sourceIp": "73.217.16.234",
"accessKey": null,
"cognitoAuthenticationType": null,
"cognitoAuthenticationProvider": null,
"userArn": null,
"userAgent": "insomnia/4.0.12",
"user": null
},
"resourcePath": "/example-path",
"httpMethod": "POST",
"apiId": "exampleapiid"
},
"body": "{\n \"foo\": \"FOO\",\n \"bar\": \"BAR\",\n \"baz\": \"BAZ\"\n}\n",
"isBase64Encoded": false
}
Beispiel für eine Rückrufantwortform
callback(null, {
statusCode: 409,
body: JSON.stringify(bodyObject),
headers: {
'Content-Type': 'application/json'
}
})
Anmerkungen
- Ich glaube, die Methoden auf context
solche context.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.