当步骤函数中某些事情失败时重试逻辑 python

Retry Logic when some things fails in step function python

我有一个场景需要重新运行函数,我该怎么做。

def test_cpbucket():

    res = s3.copy_object(
       Bucket = 'bucket-name',
       CopySource: 'bucket-name/hello/21-01-2020-12-23-00/testing.ddl',
       Key: 'hello/21-01-2020-12-23-00/testing.ddl',
       ACL: 'public-read' 
    )

在上面的示例中,我将对象复制到同一位置,以便它可以触发我的 lambda 函数。

当 lambda 函数失败时,我需要重新运行 复制 s3 的这个函数。我该怎么做?

您可以尝试类似以下步骤的功能。 step function definition

步骤:

  1. 从执行 lambda 的 s3-copy-task 开始。
  2. s3-copy-task-choice - 做出选择 - 重新运行,成功,失败。它根据 LastEvaluatedKey 和从步骤 1 中的 lambda 函数返回的异常变量做出决定。
  3. s3-copy-task-fail - 如果整个过程失败,可以在此处执行某些 post 处理或清理任务。
  4. s3-copy-task-success - 如果整个过程成功,可以在此处执行一些 post 处理或清理任务。

步骤函数代码如下,

{
  "StartAt": "s3-copy-task",
  "States": {
    "s3-copy-task": {
      "Next": "s3-copy-task-choice",
      "Retry": [
        {
          "ErrorEquals": [
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException"
          ],
          "IntervalSeconds": 2,
          "MaxAttempts": 6,
          "BackoffRate": 2
        }
      ],
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "arn:aws:lambda:eu-west-1:474496007096:function:ph_offer-synchronization-dev-query-dynamodb-fn",
        "Payload.$": "$"
      }
    },
    "s3-copy-task-choice": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.Payload.exception",
          "StringEquals": "true",
          "Next": "s3-copy-task-fail"
        },
        {
          "Variable": "$.Payload.LastEvaluatedKey",
          "StringEquals": "EMPTY",
          "Next": "s3-copy-task-success"
        }
      ],
      "Default": "s3-copy-task"
    },
    "s3-copy-task-fail": {
      "Type": "Fail",
      "Cause": "Error during lambda processing"
    },
    "s3-copy-task-success": {
      "Type": "Succeed"
    }
  }
}