Ruby AWS Lambda - 返回二进制内容时来自 Application Load Balancer 的 502 Bad Gateway
Ruby AWS Lambda - 502 Bad Gateway from Application Load Balancer when returning binary content
我有一个用作 Web 服务器的 AWS lambda(用 Ruby 编写)。我通过应用程序负载均衡器访问 lambda。以下代码适用于 html、javascript 和 css 文件。
{
statusCode: 200,
headers: {
'Content-Type' => "text/html"
},
body: File.open("index.html").read
}
我添加了尝试从 Lambda return 二进制数据的代码。
{
statusCode: 200,
headers: {
'Content-Type' => 'image/x-icon'
},
isBase64Encoded: true,
body: Base64.encode64(IO.binread("favicon.ico"))
}
如果我通过负载均衡器调用 lambda,我会收到来自负载均衡器的“502 Bad Gateway”响应。负载平衡器日志显示如下。
"error_reason"="LambdaInvalidResponse"
如果我使用 aws lambda invoke
从命令行调用 lambda,我会看到我的 200 响应和预期的响应数据。
使用 Base64.strict_encode64
而不是 Base64.encode64
。
为了找到问题所在,我启动了一个 Python lambda 并将其设为 return 完全相同的文件。我验证了它可以与 ALB 一起使用,而 Ruby 版本没有。然后我使用 cli 调用每一个(二进制输出很棘手),并进行比较。
Python 的默认 base64 编码器输出没有换行符的整个块,而 Ruby 的嵌入换行符。
根据 Ruby docs:
strict_encode64
“符合 RFC 4648。未添加换行符。”
encode64
“符合 RFC 2045。每 60 个编码字符添加换行符。”
我猜 ALB 对其 Base-64 编码非常挑剔!
我有一个用作 Web 服务器的 AWS lambda(用 Ruby 编写)。我通过应用程序负载均衡器访问 lambda。以下代码适用于 html、javascript 和 css 文件。
{
statusCode: 200,
headers: {
'Content-Type' => "text/html"
},
body: File.open("index.html").read
}
我添加了尝试从 Lambda return 二进制数据的代码。
{
statusCode: 200,
headers: {
'Content-Type' => 'image/x-icon'
},
isBase64Encoded: true,
body: Base64.encode64(IO.binread("favicon.ico"))
}
如果我通过负载均衡器调用 lambda,我会收到来自负载均衡器的“502 Bad Gateway”响应。负载平衡器日志显示如下。
"error_reason"="LambdaInvalidResponse"
如果我使用 aws lambda invoke
从命令行调用 lambda,我会看到我的 200 响应和预期的响应数据。
使用 Base64.strict_encode64
而不是 Base64.encode64
。
为了找到问题所在,我启动了一个 Python lambda 并将其设为 return 完全相同的文件。我验证了它可以与 ALB 一起使用,而 Ruby 版本没有。然后我使用 cli 调用每一个(二进制输出很棘手),并进行比较。
Python 的默认 base64 编码器输出没有换行符的整个块,而 Ruby 的嵌入换行符。
根据 Ruby docs:
strict_encode64
“符合 RFC 4648。未添加换行符。”encode64
“符合 RFC 2045。每 60 个编码字符添加换行符。”
我猜 ALB 对其 Base-64 编码非常挑剔!