根据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
来确定任务的重试策略?
答案 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"
},