StepFunctionsネットワークエラー

AWS Step FunctionsでlistCommandInvocationsのリトライ処理を設定し、ネットワークエラーが発生した際にリトライすることで処理が失敗しないようにする手順についてご説明します。

リトライ処理をテストするためには、ネットワークエラーをシミュレートする必要があります。ネットワークエラーはAWS SDKで定義されているエラーコードの一種であるため、Step Functionsのリトライポリシーでこれらのエラーを捕捉する設定を行います。

以下のサンプルは、ネットワークエラーをシミュレートし、リトライポリシーを設定する状態マシンの例です。この例では、意図的にネットワークエラーを模倣するためにFailステートを利用しています。

{
  "Comment": "State machine with retry policy for listCommandInvocations task",
  "StartAt": "Invoke ListCommandInvocations",
  "States": {
    "Invoke ListCommandInvocations": {
      "Type": "Task",
      "Resource": "arn:aws:states:::aws-sdk:ssm:listCommandInvocations",
      "Retry": [
        {
          "ErrorEquals": [
            "ThrottlingException",
            "NetworkingError",  // AWS SDK networking error (e.g., network timeout)
            "ServiceUnavailable",
            "UnknownError"  // Generic unknown error
          ],
          "IntervalSeconds": 2,
          "MaxAttempts": 3,
          "BackoffRate": 2
        }
      ],
      "Catch": [
        {
          "ErrorEquals": ["States.ALL"],
          "Next": "HandleNetworkError"
        }
      ],
      "End": true
    },
    "HandleNetworkError": {
      "Type": "Fail",
      "Error": "NetworkError",
      "Cause": "The command invocation failed due to a network error and exceeded the retry limit."
    }
  }
}

この状態マシンでは、次のような流れです:

  1. Invoke ListCommandInvocationsステート:
  • listCommandInvocations APIを実行します。
  • ネットワークエラーやスルットルエラー、サービス利用不可などのエラーが発生した場合、指定されたリトライポリシー(2秒間隔、最大3回、指数バックオフ率2)に基づいてリトライが行われます。
  1. Retryセクション:
  • 指定したエラーコードに対してリトライを行います。リトライの間隔、最大試行回数、バックオフ率が設定されています。
  1. Catchセクション:
  • リトライを行った結果、依然としてエラーが発生する場合、HandleNetworkErrorステートに進みます。
  1. HandleNetworkErrorステート:
  • 最終的に失敗として処理を終了します。

この設定をテストする方法としては、意図的にlistCommandInvocationsタスクの一部の呼び出しが失敗するように、モックデータや一時的なネットワーク変更を使用することが考えられます。しかし、現実的な検証方法としては、Failステートを一時的に追加して、指定のエラーを模倣することができます。

下記にネットワークエラーを模倣するための状態マシンの例を示します:

{
  "Comment": "State machine to simulate network error for listCommandInvocations task",
  "StartAt": "MockNetworkError",
  "States": {
    "MockNetworkError": {
      "Type": "Fail",
      "Error": "NetworkingError",
      "Cause": "Simulated network error for testing retry logic."
    }
  }
}

この状態マシンは、あくまでネットワークエラーを模倣するためのもので、実際にはlistCommandInvocationsタスクを使用しません。この模倣の状態マシンを使ってリトライポリシーが正しく動作するかを検証します。

その後、本番環境のステートマシンに戻し、実際のlistCommandInvocationsタスクとリトライ設定で実際のネットワークエラーが発生した場合でも、処理が安定しているかを確認します。

注意点として、Step Functionsではネットワークエラーは頻繁には発生しないため、実地検証が難しい場合でも、事前の模擬テストでリトライポリシーが期待通り動作することを確認しておくと安心です。

コメント

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