首页 > 解决方案 > 根据错误消息重试 StepFunction 任务

问题描述

根据 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用来识别任务的重试策略?

标签: amazon-web-servicesaws-step-functions

解决方案


我遇到过同样的问题。

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

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

推荐阅读