9

我在 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

NoteContent-Type是一个八位字节流,它会导致浏览器将响应下载为文件而不是显示它。我尝试在响应中添加额外的标头"Foo":"Bar",但它们没有出现在 curl 响应中。ALB 似乎正在吃我的 lambda 提供的标头。我怎样才能解决这个问题?

4

2 回答 2

9

原来我为我的目标组打开了多值标题。启用该设置后,我的 lambdas 需要返回带有字段multiValueHeaders集而不是headers. 所以我的 lambda 代码需要是:

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

有关AWS 发布博客文章的更多信息。

于 2019-05-04T05:45:39.647 回答
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,您只能在升级请求成功之前进行跟踪。

于 2019-04-06T09:07:49.263 回答