【问题标题】:AWS Lambda + API-gateway return 502 error when the lambda is throttled限制 lambda 时,AWS Lambda + API-gateway 返回 502 错误
【发布时间】:2018-11-28 12:06:26
【问题描述】:

同步调用:如果函数被同步调用并且 受到限制,Lambda 返回 429 错误,调用服务为 负责重试。 ThrottledReason 错误代码说明 您是否遇到了功能级别的节流阀(如果指定)或 帐户级别限制(请参阅下面的注释)。每个服务可能有自己的 重试策略。例如,CloudWatch Logs 重试失败的批处理 到五次,重试之间有延迟。对于事件源列表 及其调用类型,请参阅支持的事件源。

Reference

我不确定我对上面这句话的理解是否正确,如果我错了,请纠正我。

  1. 当 lambda 受到限制时,它会将 429 Error 返回到 API 网关。
  2. 调用服务(此处为 API 网关)重试请求。

但是,它没有按预期工作。以下是限制 lambda 时来自 cloudWatch 的 API 网关日志。

API-Gateway-Execution-Logs_3f1frvtwe4/sam-sm-test 2a38a4a9316c49e5a833517c45d31070 (bededbf0-73ae-11e8-87a2-f51933ef104f) Endpoint response body before transformations: {"Reason":"ReservedFunctionConcurrentInvocationLimitExceeded","Type":"User","message":"Rate Exceeded."}
API-Gateway-Execution-Logs_3f1frvtwe4/sam-sm-test 2a38a4a9316c49e5a833517c45d31070 (bededbf0-73ae-11e8-87a2-f51933ef104f) Endpoint response headers: {Connection=keep-alive, x-amzn-RequestId=bedfc624-73ae-11e8-bd28-6345cb3606c4, x-amzn-ErrorType=TooManyRequestsException, Content-Length=104, Date=Tue, 19 Jun 2018 10:51:39 GMT, Content-Type=application/json}
API-Gateway-Execution-Logs_3f1frvtwe4/sam-sm-test 2a38a4a9316c49e5a833517c45d31070 (bededbf0-73ae-11e8-87a2-f51933ef104f) Execution failed due to configuration error: Malformed Lambda proxy response

实际上,Lambda 返回 {"Reason":"ReservedFunctionConcurrentInvocationLimitExceeded","Type":"User","message":"Rate Exceeded."},这是 API-gateway(代理集成)的错误格式,然后,API-gateway 返回 502 Error 给调用 API 的客户端。

我希望重试失败的请求。我该怎么办?

【问题讨论】:

  • 服务可能会重试请求,具体取决于该特定服务的重试策略。您正在对我认为不正确的 API 网关重试策略做出假设。

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


【解决方案1】:

每个服务可能有自己的重试策略。

API Gateway 不会重试失败的 Lambda 调用。如果要处理重试,则必须在调用 API 网关的客户端中完成。

按照您的建议,API 网关在收到格式错误的 Lambda 代理响应时会返回 502 错误(请参阅https://aws.amazon.com/premiumsupport/knowledge-center/malformed-502-api-gateway/)。

【讨论】:

  • 感谢您的回答!!。还有一个问题,即使 API-gateway 不处理重试,为什么 lambda 不返回 429Error?查看 API-gateway 日志,lambda 似乎只是返回不包含 statusCode 的 JSON 字符串。
  • @SangminKi​​m 这只是 lambda 代理集成的痛苦之一。 API Gateway 期望 lambda 以非常特定的格式做出响应(请参阅docs.aws.amazon.com/apigateway/latest/developerguide/…)。除非在 lambda 响应中说明,否则 API 网关不会捕获(或至少可见)实际的 http 状态。 429 错误不会以这种格式返回响应。
  • @KMo Lambda DLQ 不适用于同步 Lambda 调用。调用者始终负责重试 429 错误。只有在 Lambda 最初接受调用请求后重复的异步失败才会导致事件进入 DLQ。
  • @Michael - 删除了对 DLQ 的 sqlbot 引用
  • @KMo 您是否有“API 网关不会重试失败的 Lambda 调用”文档的链接?我想了解更多关于这方面的内容。
猜你喜欢
  • 2017-10-04
  • 1970-01-01
  • 2019-09-15
  • 2017-07-07
  • 2021-03-30
  • 2015-10-23
  • 2017-09-07
  • 2016-06-02
  • 2020-11-02
相关资源
最近更新 更多