AWS Step Functionsでリトライ回数を変数として保持し、それを別のChoiceステートで条件分岐に使う方法を説明します。以下はJSON形式のステートマシン定義の例として説明します。
1. 変数の初期化
まず、リトライ回数を保持する変数を初期化するためにPassステートを使用します。
2. タスクの実行
次に、実行したいタスクを定義します。このタスクが失敗した場合にリトライ回数を増加させます。
3. リトライ回数のカウント
タスクが失敗した場合にリトライ回数を更新するためのPassステートを追加します。
4. Choiceステートで条件分岐
リトライ回数に基づいて次のアクションを決定するためのChoiceステートを定義します。
以下は上記の流れを含むStep Functionsの例です。
{
"Comment": "State machine to retry a task and use retry count in a choice condition",
"StartAt": "InitializeRetryCount",
"States": {
"InitializeRetryCount": {
"Type": "Pass",
"Result": {
"retryCount": 0
},
"ResultPath": "$.retryData",
"Next": "TaskState"
},
"TaskState": {
"Type": "Task",
"Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FunctionName", // 実行したいタスク
"Next": "CheckTaskResult",
"Catch": [
{
"ErrorEquals": ["States.TaskFailed"],
"Next": "IncrementRetryCount"
}
]
},
"IncrementRetryCount": {
"Type": "Pass",
"ResultPath": "$.retryData.retryCount",
"Parameters": {
"retryCount.$": "$.retryData.retryCount + 1"
},
"Next": "CheckRetryCount"
},
"CheckRetryCount": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.retryData.retryCount",
"NumericLessThan": 3, // リトライ回数の上限(例:3回未満ならリトライ)
"Next": "TaskState"
}
],
"Default": "FailState"
},
"CheckTaskResult": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.taskresult", // タスクの結果に基づく条件分岐
"StringEquals": "Success",
"Next": "SuccessState"
}
],
"Default": "FailState"
},
"SuccessState": {
"Type": "Succeed"
},
"FailState": {
"Type": "Fail",
"Error": "TaskFailed",
"Cause": "The task failed after maximum retries"
}
}
}
説明:
- InitializeRetryCount:
Passステートを使ってリトライ回数を初期化します。 - TaskState: 実際のタスクを実行します。失敗した場合は
CatchブロックによりIncrementRetryCountに移行します。 - IncrementRetryCount: ここでリトライ回数を1増やします。
- CheckRetryCount: リトライ回数が上限未満の場合、再度
TaskStateを実行。上限以上の場合、FailStateに遷移します。 - CheckTaskResult: タスクの結果をチェックし、成功なら
SuccessState、それ以外ならFailStateに遷移します。
このようにして、リトライ回数を変数として保持し、それを条件文として使用できます。

コメント