【问题标题】:Random status code: 502 errors on AWS api gateway connected to lambda随机状态码:连接到 lambda 的 AWS api 网关上出现 502 错误
【发布时间】:2018-06-15 03:40:22
【问题描述】:

我有多个使用代理集成的 api 网关公开的 lambda。我不时收到状态码 502 的奇怪错误。 lambda 云监视日志中没有任何内容。下面我发布了示例请求的 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(坏网关)。日志中有一条消息:“Execution failed due to configuration error: Malformed Lambda proxy response”,这意味着由于某种原因您的 Lambda 函数没有以预期格式返回响应。尝试记录 lambda 函数的整个执行过程以找出问题所在。
  • @TomMelo 感谢您的回复,汤姆!正如我在上面写的对 lambda 的调用返回:“转换前的端点响应正文:{“消息”:“发生错误,无法处理请求。”,“类型”:“服务”}”后来映射到“执行”由于配置错误而失败:API 网关的 Lambda 代理响应格式错误”。我有整个 lambda 函数被 try/catch 块包围,所以它不可能来自我的代码。更重要的是,该请求的 aws cloud watch 是空的(没有像往常一样的开始/完成日志),因此它甚至没有达到 aws lambda。
  • 该响应是从 Lambda 到 API Gateway。建议从客户端重试任何 5xx 错误以提高可靠性。解决此问题的最佳办法是向 AWS 开具支持票。
  • 已经这样做了。到目前为止没有回复 forums.aws.amazon.com/thread.jspa?messageID=719917 我没有商业支持计划,所以我只能尝试 aws 论坛。
  • 在过去 1 年中,我们的生产应用程序在多个实例中都看到了相同的行为。这完全是随机的。似乎 API Gateway 没有从 Lambda 得到任何响应(或者不是它所期望的响应),完全是随机的,而且很糟糕。但几秒钟到一分钟后,它会恢复并假装一切正常。

标签: amazon-web-services aws-lambda aws-api-gateway


【解决方案1】:

我在这里列出一个可能的原因...

当 AWS Lambda 配置为在 VPC 中运行时。每次从 VPC 执行需要一个 IP。

如果 VPC 没有多少免费 IP,那么您的 lambda 将默默地失败:(

我个人遇到过 IP 受限的问题,增加 IP 解决了这个问题。

下面的文字来自this链接

您指定的子网应该有足够的可用 IP 地址 以匹配 ENI 的数量。

我们还建议您在每个子网中至少指定一个子网 Lambda 函数配置中的可用区。通过指定 每个可用区中的子网,您的 Lambda 函数可以 如果一个可用区出现故障或 IP 用完,则在另一个可用区中运行 地址。

注意

如果您的 VPC 没有足够的 ENI 或子网 IP,您的 Lambda 函数不会随着请求的增加而扩展,你会看到一个 功能故障增加。 AWS Lambda 当前不记录 由 ENI 或 IP 不足导致的 CloudWatch Logs 错误 地址。 如果您发现错误增加而没有相应的 CloudWatch Logs,您可以同步调用 Lambda 函数 获取错误响应(例如,在 AWS Lambda 控制台,因为该控制台调用您的 Lambda 函数 同步并显示错误)。

【讨论】:

  • 更新:这似乎不再是一个问题,因为最近亚马逊宣布对 lambda 使用弹性网络接口的方式进行了非常好的更改:aws.amazon.com/es/blogs/compute/…
猜你喜欢
  • 2018-09-23
  • 1970-01-01
  • 2021-05-28
  • 2022-12-14
  • 1970-01-01
  • 2017-09-09
  • 2019-12-17
  • 2020-11-29
  • 2017-04-27
相关资源
最近更新 更多