9

我有一个 Python 3.6 - Flask 应用程序使用Zappa部署到 AWS Lambda 上,其中我有一个使用 @Task 定义的异步任务执行函数,如此处所述

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

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

谁能帮我解决这个问题?

[编辑:lambda 函数也不是任何 VPC 的一部分,并且设置为可从 Internet 访问。]

以下是日志。基本上,倒计时是一个计数到 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 秒

4

2 回答 2

6

您可以在此处查看Zappa 适用于所有 lambda 函数的默认设置,您会看到默认timeout_seconds设置为 30 秒,这将适用于 AWS 控制台中的默认 Lambda 设置,因为默认情况下为 3 秒(您可以在AWS Lambda 常见问题中查看此限制。

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

您可以在 Zappa repo 中查看此问题中公开的更多详细信息。

于 2018-03-08T01:23:47.850 回答
5

timeout_secondsZappa 中的参数具有误导性。也就是说,它确实限制了 Lambda 函数的超时,但请求是通过 CloudFront 提供的,其默认超时为 30 秒。要验证这一点,请尝试降低totimeout_seconds -20它会在 20 秒内正确超时。但是,由于 CloudFront 限制,过去30没有效果。

默认超时为 30 秒。您可以将值更改为 4 到 60 秒。如果您需要超出该范围的超时值,请请求更改限制。

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

我自己没有尝试过,但是您可以通过在 Lambda 前面创建云端分发来达到极限,尽管您似乎仍然受到最大限制。60 秒(除非您通过 AWS 支持请求更多,如上一个链接中所示)。

于 2019-11-05T10:37:05.317 回答