最好的解决办法,以重试AWS lambda函数当它得到超时

时间:2019-02-02 19:25:46

标签: amazon-web-services aws-lambda amazon-cloudwatch

我有一个严重的问题,我需要你的帮助。花了很多时间后,我在Internet上找不到任何解决方案。

我做了一个机器人拿到这实在是繁重的任务,因为我需要设置一个刮板,然后经过许多步骤,提取网页数据的数据(登录,注销,点击提交按钮,...)和GOT后结果,它将发布到API进行报告。

我使用Cloudwatch事件使我的lambda函数每天在特定时间运行。

问题是,虽然我在它的最高设置为我设置lambda函数(3GB RAM,15分钟超时,该指标是2019年1月),但有时我的lambda函数在执行时(也许是刮任务花费太很多失败步骤或我尝试抓取的网页不稳定,并且很少失败,我认为只有5%。

但我想知道是否有任何的方法来应对这种情况,我想我的lambda函数可以自动重试,当它失败而不做手工。

2 个答案:

答案 0 :(得分:2)

这是StepFunction的完美示例,您可以通过CloudWatch Event而不是lambda来安排它。

StepFunction可以调用您的lambda并在失败时处理重试逻辑,并在需要时提供可配置的指数补偿。

下面是一个阶跃函数

的一个例子
{
  "Comment": "Call lambda with retry",
  "StartAt": "Scraper",
  "States": {
    "Scraper": {
      "Type": "Task",
      "Resource": "<LAMBDA_ARN>",
      "Retry": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "IntervalSeconds": 20,
          "MaxAttempts": 5,
          "BackoffRate": 2
        }
      ],
      "End": true
    }
  }
}

答案 1 :(得分:1)

您的lambda已被重试,因为cloudwatch事件的触发是异步的。 (请参见下面的文档) 我会为您的lambda设置一个DLQ,然后从那里重新处理。

从文档(aws lambda event sources

  

给定事件源的错误处理取决于Lambda的调用方式。亚马逊的CloudWatch活动异步调用的lambda函数。有关如何重试错误的更多信息,请参阅AWS Lambda重试行为。

     

和:(aws lambda retry behaviour

     

异步调用–异步事件在用于调用Lambda函数之前先排队。如果AWS Lambda无法完全处理事件,它将自动重试两次调用,两次重试之间会有延迟。如果您为函数指定了死信队列,那么失败的事件将发送到指定的Amazon SQS队列或Amazon SNS主题。如果您未指定“死信队列”(DLQ),这不是必需的,而是默认设置,则该事件将被丢弃。有关详细信息,请参阅AWS lambda函数死信队列。