Согласно документации по интеграции Lambda API Gateway , API-шлюз ожидает, что ответы Lambda-прокси будут выглядеть следующим образом:
{
"statusCode": 200,
"headers": {},
"body": "body as a string",
"isBase64Encoded": false
}
В моей функции Lambda я возвращаю такие данные,и он отлично работает для обычных данных, отличных от base64:
HTTP/2 200
content-type: application/json
content-length: 784
date: Thu, 31 Oct 2019 21:42:07 GMT
x-amzn-requestid: 115f5376-1f8f-4871-b675-8d444d1a37f3
x-amz-apigw-id: Cco_WE7UoAMFueQ=
x-amzn-trace-id: Root=1-5dbb552e-f466c3124d69537cd845d7b4;Sampled=0
x-cache: Miss from cloudfront
via: 1.1 352640e22fb9eaa800f19cb44307f5a5.cloudfront.net (CloudFront)
x-amz-cf-pop: DFW50-C1
x-amz-cf-id: jty7c6geABxhxCVQkMh91SGmv_4cUjpnNW96SEgyCJ5ne_lkGmqdxA==
{
"headers": {
"Host": "api.naftuli.wtf",
"CloudFront-Is-Mobile-Viewer": "false",
"CloudFront-Is-SmartTV-Viewer": "false",
"X-Amzn-Trace-Id": "Root=1-5dbb552e-f466c3124d69537cd845d7b4",
"CloudFront-Viewer-Country": "US",
"X-Forwarded-Port": "443",
"X-Forwarded-For": "4.78.206.126, 70.132.39.74",
"Accept": "*/*",
"CloudFront-Is-Desktop-Viewer": "true",
"CloudFront-Forwarded-Proto": "https",
"CloudFront-Is-Tablet-Viewer": "false",
"X-Forwarded-Proto": "https",
"X-Amz-Cf-Id": "THiXNNXOj7ZW8hDLyJVQM8X_hShGQ6cV-jc8GALkxVtolXaOzFhOlg==",
"Via": "2.0 352640e22fb9eaa800f19cb44307f5a5.cloudfront.net (CloudFront)",
"User-Agent": "curl/7.58.0"
},
"body": null,
"path": "/echo.json",
"query": null,
"method": "GET"
}
Однако, когда я пытаюсь вернуть двоичные данные в кодировке base64, API-шлюз не пытается декодировать тело как данные base64:
HTTP/2 200
content-type: image/x-icon
content-length: 20116
date: Thu, 31 Oct 2019 21:43:36 GMT
x-amzn-requestid: 1fccae1e-27ac-466c-bf26-b4d0562e9354
x-amz-apigw-id: CcpNSHwboAMFzIw=
x-amzn-trace-id: Root=1-5dbb5588-206766e19d90395907d75c98;Sampled=0
x-cache: Miss from cloudfront
via: 1.1 8ab495d5c70152d495ba77099660f1e7.cloudfront.net (CloudFront)
x-amz-cf-pop: LAX3-C3
x-amz-cf-id: HFqwNrnVDQZNkh0TjTg804ubOcuF1hSn0NP8BGQGUl5BtTTGEmkQsQ==
AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAAAwMAAAAQAgAKglAABGFQAAKAAAABAAAAAgAAAAAQAgAAAAAAAABAAA1w0AANcNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJmZmQCfn58VmZmZO3BwcIJoaGiRaGhokXBwcIKZmZk7n5+fFZmZmQAAAAAAAAAAAAAAAAD///8A////ACIiIgCBgYFBXl5elzk
В моем журнале я повторяю точное значение JSON, возвращаемое в API-шлюз, и оно выглядит так, как вы ожидаете:
{
"statusCode": 200,
"headers": {
"Content-Type": "image/x-icon"
},
"isBase64Encoded": true,
"body: "AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAAAwMAAAAQAgAKglAABGFQAAKAAAABAAAAAgAAAAAQAgAAAAAAAABAAA1w0AANcNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJmZmQCfn58VmZmZO3BwcIJoaGiRaGhokXBwcIKZmZk7n5+fFZmZmQAAAAAAAAAAAAAAAAD///8A////ACIiIgCBgYFBXl5elzk"
}
Видимо API-шлюзне декодирует мою base64 в двоичную полезную нагрузку, как это должно быть.
Моя конфигурация шлюза API и Lambda в Terraform:
resource "aws_api_gateway_resource" "catchall" {
path_part = "{path+}"
parent_id = "${aws_api_gateway_rest_api.default.root_resource_id}"
rest_api_id = "${aws_api_gateway_rest_api.default.id}"
}
resource "aws_api_gateway_method" "catchall" {
http_method = "ANY"
resource_id = "${aws_api_gateway_resource.catchall.id}"
rest_api_id = "${aws_api_gateway_rest_api.default.id}"
# do all authorization in Lambda
authorization = "NONE"
}
resource "aws_api_gateway_integration" "catchall" {
type = "AWS_PROXY"
http_method = "${aws_api_gateway_method.catchall.http_method}"
integration_http_method = "POST"
resource_id = "${aws_api_gateway_resource.catchall.id}"
rest_api_id = "${aws_api_gateway_rest_api.default.id}"
uri = "${aws_lambda_function.default.invoke_arn}"
}
По крайней мере, очевидно, что интеграция шлюза API и Lambdaнастроен и работает, и я могу делать все, что захочу, с моими запросами и ответами, но почему он не учитывает двоичные форматы?