StepFunctionsのリトライについて

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"
    }
  }
}

説明:

  1. InitializeRetryCount: Passステートを使ってリトライ回数を初期化します。
  2. TaskState: 実際のタスクを実行します。失敗した場合はCatchブロックによりIncrementRetryCountに移行します。
  3. IncrementRetryCount: ここでリトライ回数を1増やします。
  4. CheckRetryCount: リトライ回数が上限未満の場合、再度TaskStateを実行。上限以上の場合、FailStateに遷移します。
  5. CheckTaskResult: タスクの結果をチェックし、成功ならSuccessState、それ以外ならFailStateに遷移します。

このようにして、リトライ回数を変数として保持し、それを条件文として使用できます。

コメント

タイトルとURLをコピーしました