AWS Lambda 任务在 6.00 秒后超时

Posted

技术标签:

【中文标题】AWS Lambda 任务在 6.00 秒后超时【英文标题】:AWS Lambda Task timed out after 6.00 seconds 【发布时间】:2018-05-15 14:31:05 【问题描述】:

我正在使用无服务器框架。我的 Lambda 函数连接到 DynamoDB 表以更新表中的项目。表的读写容量单位为 5,并且禁用了 auto_scaling。 AWS Lambda 函数分配了 128MB 内存。

我使用 Jmeter 进行性能测试。我同时发送了 1000 个请求,一些响应给了我完美的输出,而另一些则给了内部服务器错误(502 Bad Gateway)。我还分析了 cloudwatch 的日志,只得到任务超时错误。谁能建议我为什么会收到此错误以及如何解决?

【问题讨论】:

您的池中有多少个连接?也许池没有足够的连接并且某些任务正在超时? @Mike Dinescu 有一个非常彻底的答案,但以防万一,您使用的是什么运行时?如果在节点中,您可能需要设置context.callbackWaitsForEmptyEventLoop = false docs.aws.amazon.com/lambda/latest/dg/… 是的 @JustinKruse 我正在使用 nodejs 你能解决这个问题吗?我们必须设置context.callbackWaitsForEmptyEventLoop,所以我们没有等待网络事件或数据库连接等事情在返回之前被清理,否则我们总是会达到这个 6 秒超时 是的 @JustinKruse 我已经通过增加 DynamoDB 的读写容量单位解决了这个问题。 【参考方案1】:

使用无服务器框架时 AWS Lambda 函数的默认超时时间为 6 秒。只需将其更改为 documentation 中所述的更高值:

functions:
  hello:
    ...
    timeout: 10 # optional, in seconds, default is 6

【讨论】:

这仅解决(或回避)部分问题 - Mike Dinescu 的回答更彻底:***.com/a/47605576/1357094 @Dunedan,谢谢!我为此苦苦挣扎。【参考方案2】:

由于您提到您的 DynamoDB 表只配置了 5 个 WCU,这意味着每秒只允许 5 次写入。

DynamoDB 确实提供突增容量,允许您使用 300 秒的累积容量(在 5 个 WCU 上相当于 1500 个总写入请求),但一旦这些容量用完,它就会开始节流。

DynamoDB 客户端具有内置的自动重试功能,具有指数回退功能,并且它足够智能,可以识别限制,因此它会减慢重试速度,以至于如果重复写入,单次写入很容易需要几秒钟才能成功完成节流。

您的 Lambda 函数很可能在 6 秒时超时,因为该函数正在等待 Dynamo 重试。

因此,在进行负载测试时,请确保您的依赖项都已适当扩展。在每秒 1000 个请求时,您应该确保相应地扩展 DynamoDB 表和/或索引的读/写容量分配。

【讨论】:

以上是关于AWS Lambda 任务在 6.00 秒后超时的主要内容,如果未能解决你的问题,请参考以下文章

在将 aws lambda 与 redis 连接时,任务在 23.02 秒后超时错误

AWS Lambda Task在3.00秒后超时

将 AWS Lambda 连接到 Redshift - 60 秒后超时

约 30 秒后 AWS API 网关超时

AWS Lambda:任务超时

如何在 aws lambda 超时时释放 resdhift 资源?