【问题标题】:Zappa / Async AWS Lambda Function times out in 30sZappa / Async AWS Lambda 函数在 30 秒内超时
【发布时间】:2018-06-22 06:30:51
【问题描述】:

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

但是,我发现函数调用仍会在 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 任务在 30.03 后超时 秒

【问题讨论】:

  • 任何人?????????

标签: python-3.x flask aws-lambda zappa


【解决方案1】:

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

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

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

【讨论】:

  • 嗨,我试过了,但它似乎不起作用。我的 lambda 在 30 秒时遇到了死胡同。这很可能是因为请求是通过 API 网关路由的,它的硬限制为 30,而这是由 lambda 继承的。
  • { "dev": { "app_function": "application.application", "aws_region": "ap-southeast-1", "profile_name": "default", "project_name": "aws ”,“运行时”:“python3.6”,“s3_bucket”:“zappa-xxxxxxx”,“route53_enabled”:“假”,“域”:“alpha.reviv.in”,“timeout_seconds”:90,“certificate_arn " : "arn:aws:acm:us-east-1:xxxx:certificate/xx-xx-xx-xx-xxxx" } }
  • @kilokahn 您是否正在调用附加到 API 网关的 lambda 函数?如果不需要,您可以将其解耦。
  • 嗨,不幸的是,我需要在我的 API 中根据事件触发器(例如特定的 API 调用)触发这个 lambda - zappa 的 @task 允许我在我的应用程序中执行此操作( @task_sns 有一个尚未修复的错误)。我故意将其设置为这样,因为我想控制谁调用 lambda 以及何时调用。
【解决方案2】:

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

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

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

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

【讨论】:

  • 感谢@Johndodo 的回答,但是对于那些不知道如何(包括我自己)的人,您能否也分享一下细节(或资源链接),以展示如何在lambda 前面 - 我让 zappa 为我完成所有繁重的工作,但我不知道如何做到这一点。
  • 我很想帮助你,但我自己并没有那样做。更重要的是,您没有遇到 Lambda 的限制,而是 CloudFront,因此需要在那里解决(或者,理想情况下,您应该避免如此长的响应时间 - 如果可以的话)。我已经编辑了答案以澄清这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 2019-10-04
  • 2017-07-22
  • 1970-01-01
相关资源
最近更新 更多