Ruby编写的AWS Lambda经ALB返回二进制内容时报502 Bad Gateway
问题成因
- 核心原因是Ruby标准库中
Base64.encode64方法的输出格式不符合AWS应用负载均衡器(ALB)的要求:该方法会默认每60个字符插入一个换行符\n,而ALB校验Lambda返回的base64编码body时,不允许内容中存在换行符,校验失败就会抛出LambdaInvalidResponse错误,返回502状态码。 - 直接调用
aws lambda invoke时,AWS Lambda服务端不会对base64格式做严格校验,所以可以正常返回结果。
解决方法
将代码中的Base64.encode64替换为Base64.strict_encode64即可,后者生成的base64字符串不会插入任何换行符,完全符合ALB的格式规范。
修改后的代码示例:
{ statusCode: 200, headers: { 'Content-Type' => 'image/x-icon' }, isBase64Encoded: true, body: Base64.strict_encode64(IO.binread("favicon.ico")) }
额外排查点
如果修改后仍存在问题,可以确认两个配置:
- 返回结构中的
isBase64Encoded为布尔值类型,不要写成字符串形式的"true" statusCode为整数类型的标准HTTP状态码,不要使用字符串类型的状态码
内容的提问来源于stack exchange,提问作者terrywb
相关产品推荐
相关产品推荐

