1) Настройте ресурс шлюза API для использования интеграции с лямбда-прокси , установив флажок «Использовать интеграцию с лямбда-прокси» на экране «Запрос интеграции» определения ресурса шлюза API. (Или определите его в конфигурации cloudformation / terraform / serverless / etc)
2) Измените свой лямбда-код двумя способами
- Обработайте входящий
event
(1-й аргумент функции) соответствующим образом. Это уже не просто полезная нагрузка, она представляет собой весь HTTP-запрос, включая заголовки, строку запроса и тело. Образец ниже. Ключевым моментом является то, что тела JSON будут строками, требующими явного JSON.parse(event.body)
вызова (не забывайте об try/catch
этом). Пример ниже.
- Ответить на вызов обратного вызова с нулевым , тогда объектом ответа , который обеспечивает деталь HTTP , включая
statusCode
, body
и headers
.
body
должен быть строкой, так что делайте по JSON.stringify(payload)
мере необходимости
statusCode
может быть числом
headers
это объект имен заголовков к значениям
Пример аргумента лямбда-события для интеграции прокси
{
"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
}
Образец формы ответа обратного вызова
callback(null, {
statusCode: 409,
body: JSON.stringify(bodyObject),
headers: {
'Content-Type': 'application/json'
}
})
Примечания.
Я считаю, что context
такие методы context.succeed()
устарели. Они больше не документируются, хотя, похоже, все еще работают. Я думаю, что кодирование API обратного вызова будет правильным в будущем.