1

我正在尝试将压缩后的 json 作为 POST 请求正文发送到调用 AWS Lambda 的 AWS Application Load Balancer。

当我将内容类型请求标头设置为 application/json 时,我收到502 Bad Gateway错误作为响应并且 AWS Lambda 没有被调用。

我正在使用以下 curl 命令。

curl -v -s --data-binary @samples/small-batch.json.gz -H "Content-Encoding: gzip" -H "Content-Type: application/json" -X POST https://sub.domain.com/batch

我是否发送了无效的请求标头?

我的 AWS Lambda 代码:

import json

def lambda_handler(event, context):
    print("event = ", event)
    return {
            'statusCode': 200,
            'body': json.dumps({ 'success': True }),
            'headers': {
                'Content-Type': 'application/json'
            }
        }

更新

如果我使用空内容类型发出请求,则 Lambda 会被成功调用。

curl -v --data-binary @samples/small-batch.json.gz -H "Content-Type: " -H "Content-encoding: gzip" -X POST https://sub.domain.com/batch

如果我使用内容类型发出请求,application/gzip则 Lambda 会被成功调用。

curl -v --data-binary @samples/small-batch.json.gz -H "Content-Type: application/gzip" -H "Content-encoding: gzip" -X POST https://sub.domain.com/batch

仅当我使用 Content Encoding asgzip和 Content Type as请求时,才会发生 502 错误application/json。但据我了解,这些是有效的标题。

更新 2

从我在https://docs.aws.amazon.com/elasticloadbalancing/latest/application/lambda-functions.html找到的文档中

如果内容类型是以下类型之一,则负载均衡器将正文按原样发送到 Lambda 函数并将 isBase64Encoded 设置为 false:text/*、application/json、application/javascript 和 application/xml。对于所有其他类型,负载均衡器 Base64 对主体进行编码并将 isBase64Encoded 设置为 true。

我认为正因为如此, headerContent-Encoding: gzip不能与 header 耦合Content-Type: application/json。我认为调用 Lambda 时 ALB 出了点问题。

4

0 回答 0