【问题标题】:Ruby AWS Lambda - 502 Bad Gateway from Application Load Balancer when returning binary contentRuby AWS Lambda - 返回二进制内容时来自 Application Load Balancer 的 502 Bad Gateway
【发布时间】:2021-11-05 16:14:00
【问题描述】:

我有一个用作 Web 服务器的 AWS lambda(用 Ruby 编写)。我通过应用程序负载均衡器访问 lambda。以下代码适用于 html、javascript 和 css 文件。

{ 
  statusCode: 200, 
  headers: {
    'Content-Type' => "text/html"
  },
  body: File.open("index.html").read
}

我添加了尝试从 Lambda 返回二进制数据的代码。

{
  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 响应和预期的响应数据。

【问题讨论】:

    标签: ruby aws-lambda base64 aws-application-load-balancer


    【解决方案1】:

    使用Base64.strict_encode64 而不是Base64.encode64

    为了找到问题,我创建了一个 Python lambda 并让它返回完全相同的文件。我验证了它与 ALB 一起工作,而 Ruby 版本没有。然后我使用 cli 调用每一个(二进制输出很棘手),并进行比较。

    Python 的默认 base64 编码器输出整个块,不带换行符,而 Ruby 的嵌入式换行符。

    根据Ruby docs

    • strict_encode64 “符合 RFC 4648。不添加换行符。”
    • encode64 "符合 RFC 2045。每 60 个编码字符添加换行符。"

    我猜 ALB 对其 Base-64 编码非常挑剔!

    【讨论】:

      猜你喜欢
      • 2019-12-16
      • 2019-09-15
      • 2020-11-02
      • 2019-08-24
      • 2018-11-28
      • 1970-01-01
      • 2019-01-25
      • 2020-06-14
      • 2021-02-24
      相关资源
      最近更新 更多