AWS API Gateway连接到Lambda出现随机状态码:502错误。

21

我通过API网关使用代理集成公开了多个Lambda。 时不时会出现状态代码502的奇怪错误。 Lambda Cloud Watch日志中没有任何内容。 下面是我发布的示例请求的API网关日志:

(0cbbd9f5-f1bd-11e7-92c0-4d5d3b7d0380) Received response. Integration latency: 231 ms

(0cbbd9f5-f1bd-11e7-92c0-4d5d3b7d0380) Endpoint response body before transformations:
{
    "Message": "An error occurred and the request cannot be processed.",
    "Type": "Service"
}

(0cbbd9f5-f1bd-11e7-92c0-4d5d3b7d0380) Endpoint response headers: 
{
    Connection=keep-alive, 
    x-amzn-RequestId=0cbc9dee-f1bd-11e7-857b-91f7f814692c, 
    x-amzn-ErrorType=ServiceException, 
    Content-Length=86, 
    Date=Fri, 05 Jan 2018 02:06:32 GMT, 
    Content-Type=application/json
}

(0cbbd9f5-f1bd-11e7-92c0-4d5d3b7d0380) Execution failed due to configuration error: Malformed Lambda proxy response

(0cbbd9f5-f1bd-11e7-92c0-4d5d3b7d0380) Method completed with status: 502

基本上,似乎 API 网关无法访问 Lambda,并且对 Lambda 的调用返回:

(0cbbd9f5-f1bd-11e7-92c0-4d5d3b7d0380) Endpoint response body before transformations:
{
    "Message": "An error occurred and the request cannot be processed.",
    "Type": "Service"
}

还有其他人遇到这些问题吗?我唯一可能的解决办法是编写重试机制,但从我的角度来看,似乎我缺少某些配置,或者这是AWS的故障,他们应该处理。


通常情况下,当函数(代理模式)未处理异常时,AWS API网关会返回HTTP 502(错误网关)。日志中会有一条消息:“由于配置错误而执行失败:格式错误的Lambda代理响应”,这意味着由于某种原因,您的Lambda函数没有按预期格式返回响应。尝试记录Lambda函数的整个执行过程以找出问题所在。 - Tom Melo
@TomMelo 谢谢您的回复,Tom!正如我之前所写的那样,对 lambda 的调用返回了以下内容:“转换之前的终端响应主体: { "Message": "发生错误,无法处理请求。", "Type": "Service" }”,然后被映射为“由 API 网关引起的 Lambda 代理响应格式错误的执行失败”。我已经将整个 lambda 函数包裹在 try/catch 块中,所以它不可能来自我的代码。更重要的是,对于该请求,aws cloud watch 是空的(通常没有开始/完成日志),因此它甚至没有到达 aws lambda。 - Pawel
Lambda 给 API Gateway 返回了该响应。建议是从客户端重试任何 5xx 错误以提高可靠性。解决此问题的最佳方法是在 AWS 中打开支持票证。 - Abhigna Nagaraja
已经完成了。目前还没有回应。https://forums.aws.amazon.com/thread.jspa?messageID=719917 我没有商业支持计划,所以AWS论坛是我唯一尝试的途径。 - Pawel
在过去的一年多时间里,我已经在我们的生产应用程序中看到了许多类似的行为。这是完全随机的。似乎API网关没有从Lambda获取任何响应(或者不是它期望的响应),完全是随机的,并且会出现错误。但是在几秒钟到一分钟的时间内,它将恢复并假装一切正常。 - Joshua
显示剩余8条评论
1个回答

10
我在这里列出了一个可能的原因...
当AWS Lambda配置为在VPC中运行时,它会从VPC中每次执行中获取一个IP。
如果VPC没有太多可用的IP,则您的Lambda将无声地失败:(
我个人遇到过有关IP受限的问题,增加IP解决了该问题。
以下文本来自this链接
您指定的子网应具有足够的可用IP地址以匹配ENI的数量。
我们还建议在Lambda函数配置中至少指定一个可用区中的一个子网。通过在每个可用区中指定子网,如果一个可用区出现故障或IP地址用尽,您的Lambda函数可以在另一个可用区中运行。
注意:如果您的VPC没有足够的ENI或子网IP,则随着请求增加,您的Lambda函数将无法扩展,并且您将看到功能失败的增加。AWS Lambda目前不会记录由于ENI或IP地址不足而导致的CloudWatch日志错误。如果您看到错误增加但没有相应的CloudWatch日志,请同步调用Lambda函数以获取错误响应(例如,在AWS Lambda控制台中测试Lambda函数,因为控制台会同步调用Lambda函数并显示错误)。

1
更新:最近亚马逊宣布了Lambda使用弹性网络接口的非常好的变化,因此这将不再是一个问题:https://aws.amazon.com/es/blogs/compute/announcing-improved-vpc-networking-for-aws-lambda-functions/ - Jorge Valvert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接