ALB没有正确传播响应头

时间:2019-04-06 04:52:35

标签: amazon-web-services aws-lambda aws-alb

我在ALB后面有一个lambda目标。我的lambda是python lambda。

def handler(event, context):
response = {
    "statusCode": 200,
    "statusDescription": "200 OK",
    "isBase64Encoded": False,
    "headers": {
        "Content-Type": "text/html; charset=utf-8"
    }
}

使用curl击中我的网址时,我会收到

< HTTP/1.1 200 OK
< Server: awselb/2.0
< Date: Sat, 06 Apr 2019 04:46:50 GMT
< Content-Type: application/octet-stream
< Content-Length: 0
< Connection: keep-alive

注释Content-Type是一个八位字节流,它使浏览器将响应下载为文件而不是显示。我尝试将其他标头"Foo":"Bar"添加到响应中,但它们未显示在curl响应中。 ALB似乎正在吃我的lambda提供的标题。我该如何解决?

2 个答案:

答案 0 :(得分:0)

AWS Application Load Balancer将所有响应标头转换为小写,您需要仔细检查标头。不幸的是,您不能更改或修改标头是由ALB操纵的。您可以在下面的链接中获取HTTP标头:

https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/x-forwarded-headers.html

用于应用程序负载均衡器的请求跟踪:

https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-request-tracing.html

此外,您需要检查负载均衡器的限制:

  • 负载均衡器在收到传入请求时更新标头,而不是在收到响应时更新标头。

  • 如果HTTP标头大于7 KB,则负载平衡器将使用Root字段重写X-Amzn-Trace-Id标头。

  • 使用WebSockets,您只能跟踪直到升级请求成功为止。

答案 1 :(得分:0)

结果是我为目标组打开了多值标头。启用该设置后,我的Lambda需要返回设置了字段multiValueHeaders而不是headers的响应。所以我的lambda代码必须是:

def handler(event, context):
response = {
    "statusCode": 200,
    "statusDescription": "200 OK",
    "isBase64Encoded": False,
    "multiValueHeaders": {
        ["Content-Type": "text/html; charset=utf-8"]
    }
}

更多信息here