我正在尝试将压缩后的 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 出了点问题。