根据错误消息重试StepFunction任务

时间:2019-02-08 22:10:00

标签: amazon-web-services aws-step-functions

根据AWS StepFunction文档,可以为每个错误配置重试,但是我想知道是否可以使用错误消息中的详细信息来定义重试策略?

对于我来说,我正在触发Glue ETL作业,该作业可能会因自定义异常NoDataLoadedException而失败,因此我想识别它并且不重试。这是我的任务定义(第一个Retry块永远不会发生):

"ExecuteEtl": {
     "Type": "Task",
     "Resource": "arn:aws:states:::glue:startJobRun.sync",
     "Parameters": {
       "JobName.$": "$.jobName",
        "Arguments.$": "$.jobArguments"
      },
      "Retry" : [{
        "ErrorEquals": [ "NoDataLoadedException" ],
        "MaxAttempts": 0
      },{
        "ErrorEquals": [ "States.Timeout", "States.TaskFailed", "States.Runtime" ],
        "MaxAttempts": 4,
        "IntervalSeconds": 60,
        "BackoffRate": 2
      }],
      "Next": "ExtractGlueJobExecutionId"
}

这是故障输出:

{
  "resourceType": "glue",
  "resource": "startJobRun.sync",
  "error": "{\"AllocatedCapacity\":10,\"Arguments\":{},\"Attempt\":0,\"CompletedOn\":1549662956476,\"ErrorMessage\":\" NoDataLoadedException No data loaded from...",
  "cause": "States.TaskFailed"
}

是否可以使用error.ErrorMessage来确定任务的重试策略?

3 个答案:

答案 0 :(得分:0)

NoDataLoadedException错误添加到Catch block中。在其中,您可以定义Next步骤。这应该起作用:

"ExecuteEtl": {
        "Type": "Task",
        "Resource": "arn:aws:states:::glue:startJobRun.sync",
        "Parameters": {
            "JobName.$": "$.jobName",
            "Arguments.$": "$.jobArguments"
        },
        "Retry" : [{
            "ErrorEquals": [ "States.Timeout", "States.TaskFailed", "States.Runtime" ],
            "MaxAttempts": 4,
            "IntervalSeconds": 60,
            "BackoffRate": 2
        }],
        "Catch": [{
            "ErrorEquals": [ "NoDataLoadedException" ],
            "Next": "NoDataStep"
        }],
        "Next": "ExtractGlueJobExecutionId"
    }

由于NoDataLoadedException不会由Retry块处理,因此它将落入Catch中,您可以在其中进行反应。

答案 1 :(得分:0)

即使是我自己的用例,也需要单独获取errorMessage。找到了解决方法

答案 2 :(得分:0)

我遇到了同样的问题。

如果我的 Glue 作业没有在 S3 中写入任何数据,我想停止 Step Functions 中的工作流程。 我最终做的是在 Glue 作业之后立即创建一个 Lambda,以检查文件是否写入特定时间戳分区下的存储桶中。 Lambda 可以向 Step Functions 返回一个值(真、假;如果有数据或没有数据)并使用类型选择任务更改工作流。

       "If_Data": {
          "Type": "Choice",
          "Choices": [
            {
              "Variable": "$.input",
              "StringEquals": "True",
              "Next": "TableCrawler"
            }
          ],
          "Default": "FinishedNoData"
        },