Zappa/Async AWS Lambda 函数在 30 秒内超时

Zappa / Async AWS Lambda Function times out in 30s

我有一个 Python 3.6 - Flask 应用程序部署到 AWS Lambda 使用 Zappa, in which I have an asynchronous task execution function defined using @Task as discussed here

但是,我发现函数调用仍然在 30 秒时超时,而 AWS Lambda 对非 API 调用强制执行 5 分钟超时。我什至在我的 Lambda 设置中检查了超时,它被设置为 5 分钟。

我发现这一点的方式是当 lambda 的调试输出在没有请求的情况下开始重复时 - 发生这种情况是因为 lambda 由于错误或超时而被调用了 2 次(根据 AWS Lambda 文档)。

谁能帮我解决这个问题?

[编辑:lambda 函数也不属于任何 VPC,并且设置为可从互联网访问。]

下面是日志。基本上,倒计时是一个计时到 20 秒的睡眠计时器,然后是对 application.reviv_assign_responder 的 @task 调用,但正如我们所见,没有输出超过 'NEAREST RESPONDER' 并且倒计时再次开始,表明函数已超时并已被 (AWS') 设计再次调用。

Log output in Pastebin : https://pastebin.com/VEbdCALg

Second incident - https://pastebin.com/ScNhbMcn

正如我们在第二条日志中看到的那样,它明确指出:

[1515842321866] wait_one_and_notify : 30 : 26 [1515842322867] wait_one_and_notify : 30 : 27 [1515842323868] wait_one_and_notify : 30 : 28 [1515842324865] 2018-01-13T11:18:44.865Z 72a8d34a-f853-11e7-ac2f-dd12a3d35bcb Task timed out after 30.03 seconds

您可以检查 Zappa 应用于所有 lambda 函数的默认设置 here, and you will see that by default timeout_seconds is set-up to 30 seconds, This will apply over the default Lambda setup in AWS Console, because by default this is 3 seconds (you can check this limit in AWS Lambda FAQ

对于您的 @Task,您必须 increase/setup 您的 timeout_seconds 在您的 zappa_settings.(json|yaml) 文件中并重新部署它,您可以放置​​ 5 分钟(5*60==300 秒) ) 但这种增加将适用于在使用 zappa 部署的 virtualenv 中定义的所有函数。

您可以查看公开的更多详细信息in this issue in Zappa repo

Zappa 中的 timeout_seconds 参数具有误导性。也就是说,它 确实 限制了 Lambda 函数的超时,但请求是通过具有 default timeout of 30 seconds 的 CloudFront 提供的。要验证这一点,请尝试 timeout_seconds 降低 20 - 它会在 20 秒内正确超时。然而,过去 30 由于 CloudFront 的限制,没有任何效果。

The default timeout is 30 seconds. You can change the value to be from 4 to 60 seconds. If you need a timeout value outside that range, request a change to the limit.

换句话说,您无法在 Zappa 或 Lambda 中解决此问题,因为问题出在其他地方 (CloudFront)。

我自己还没有尝试过,但您可以通过在 Lambda 前面创建云端分布来提高限制,尽管看起来您仍然受到最大值的限制。 60 秒(除非您通过 AWS 支持请求更多,如 the previous link 中所示)。