AWS Lambda - 如何在发生故障时停止重试

Ale*_*her 22 amazon-web-services aws-lambda

我知道当一个Lambda函数失败时(例如当有一个超时)时,它会再次尝试再运行该函数3次.有什么方法可以避免这种行为吗?我一直在阅读文档,但没有找到任何关于这个.

谢谢!

das*_*mug 21

当它是未处理的失败(你没有捕获到的错误)或者你是否处理它但仍然告诉Lambda重试时(例如在Node中,当你callback()使用非null的第一个参数调用时)它会重试.

要阻止它重试,您应该确保处理任何错误,并通过返回非错误(或在Node中调用,告诉Lambda您的调用成功完成)callback(null, <any>).

为此,您可以使用try-catch包含处理函数的整个主体.

module.exports.handler(event, context, callback) {
  try {
    // Do you what you want to do.
    return callback(null, 'Success')
  } catch (err) {
    // You probably still want to log it.
    console.error(err)
    // Return happy despite all the hardships you went through.
    return callback(null, 'Still success')
  }
}
Run Code Online (Sandbox Code Playgroud)

对于因超时而导致的故障,您可以做些事情.

如果它超出了你的处理程序,你的代码通常会出现问题(例如,不正确的数据库配置等),你应该看一下.

如果在调用期间它你的处理程序超时,你可以做些什么.

  • 如果它是HTTP请求,您应该将请求的超时设置为短于Lambda的超时,这样它将正常失败并且您可以捕获它.
  • 如果它是数据库连接,您可以使用您正在使用的库设置超时.
  • 如果你的逻辑超时,你可以升级Lambda以使用更高的内存CPU来加快速度.您还可以检查context.getRemainingTimeInMillis()Lambda是否即将超时,以便您可以更早地处理它.

  • 这样做将阻止您将“CloudWatch Metric”用于“AWS/Lambda”“Errors”。如果你对此感到满意,那就去做吧。 (2认同)

Ron*_*yis 16

没有办法禁用Lambda函数的重试行为.

我建议有两种方法可以解决这个问题:

  1. 使您的Lambda能够正确处理重试案例.您可以使用在重试Lambda时相同的context.AwsRequestId(或相应字段).
  2. 将Lambda放入状态机(使用AWS Step Functions).您只能禁用重试.

我写的这篇博文给出了更一般的解释.

  • AWS不更改或不更改此行为的逻辑是可配置的并且可以被禁用的逻辑是什么?除了赚钱。大声笑 (6认同)

Fra*_*olo 9

如果异步调用该函数,在Console、 下Function configuration,可以修改Retry attempts

在此处输入图片说明


Mat*_*oli 8

201911 月起,可以将重试次数设置为 0。

这意味着 lambda 不会在出错时重试。


A. *_*ali 8

如前所述,此功能是最近添加的。要使用以下方法实现此行为,cloudformation您将需要AWS::Lambda::VersionAWS::Lambda::EventInvokeConfig

  MyLambda:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: my-lambda-dev
      ...

  MyLambdaVersion:
    Type: AWS::Lambda::Version
    Properties:
      FunctionName: !Ref MyLambda

  MyLambdaAsyncConfig:
    Type: AWS::Lambda::EventInvokeConfig
    Properties:
      FunctionName: !Ref MyLambda
      MaximumRetryAttempts: 0
      Qualifier: !GetAtt MyLambdaVersion.Version
Run Code Online (Sandbox Code Playgroud)