Ответы прокси-сервера шлюза Lambda API не соответствуют кодировке Base-64 - PullRequest
0 голосов
/ 01 ноября 2019

Согласно документации по интеграции 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настроен и работает, и я могу делать все, что захочу, с моими запросами и ответами, но почему он не учитывает двоичные форматы?

...