Step Functions ステートマシンでのエラー条件の処理 - AWS Step Functions

Step Functions ステートマシンでのエラー条件の処理

このチュートリアルでは、Task ステートを含む AWS Step Functions ステートマシンを作成します。このステートは、カスタムエラーをスローするように構築されたサンプルの Lambda 関数を呼び出します。

タスクは Fallback 状態 の 1 つであり、Catch フィールドを設定できます。統合からエラーを受け取ると、Catch フィールドがエラー名に基づいて次のステップを選択します。

ステップ 1: エラーをスローする Lambda 関数を作成する

Lambda 関数を使用してエラー条件をシミュレートします。

  1. AWS Lambda コンソールの https://console.aws.amazon.com/lambda/ を開いてください。

  2. [関数の作成] を選択してください。

  3. [ブループリントを使う] を選択し、Step Functions を検索して、[カスタムエラーをスローする] を選択します。

  4. [関数名] に「ThrowErrorFunction」と入力します。

  5. [Role] で、[Create a new role with basic Lambda permissions] を選択します。

  6. [関数の作成] を選択してください。

    次のコードが [コード] ペインに表示されます。

    export const handler = async () => { function CustomError(message) { this.name = 'CustomError'; this.message = message; } CustomError.prototype = new Error(); throw new CustomError('This is a custom error!'); };

ステップ 2: Lambda 関数をテストする

ステートマシンを作成する前に、Lambda 関数が呼び出されたときに CustomError をスローすることを確認します。

  1. [テスト] タブを選択します。

  2. [新しいイベントを作成] を選択し、デフォルトの [Event JSON] をそのままにします。

  3. [テスト] を選択して、テストイベントで関数を呼び出します。

  4. [関数の実行] を展開して、スローされたエラーの詳細を確認します。

これで、カスタムエラーをスローする Lambda 関数を用意できました。

次のステップでは、そのエラーをキャッチして再試行するようにステートマシンを設定します。

ステップ 3: ステートマシンを作成する

Step Functions コンソールを使用して、Task ワークフロー状態Catch 設定を使用するステートマシンを作成します。このステートマシンは、呼び出されるとエラーをスローするように構築した Lambda 関数を呼び出します。Step Functions は、再試行間に exponential backoff (エクスポネンシャルバックオフ) を使用して、この関数を再試行します。

  1. Step Functions コンソールを開き、メニューから [ステートマシン] を選択したら、[ステートマシンの作成] を選択します。

  2. [空白から作成] を選択し、[ステートマシン名] に「CatchErrorStateMachine 」と入力します。

  3. デフォルトのタイプ (Standard) を受け入れ、[続行] を選択して、Workflow Studio でステートマシンを編集します。

  4. [コード] を選択して ASL エディタに切り替え、コードを次のステートマシン定義に置き換えます。

    { "Comment": "Example state machine that can catch a custom error thrown by a function integration.", "StartAt": "CreateAccount", "States": { "CreateAccount": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Output": "{% $states.result.Payload %}", "Arguments": { "FunctionName": "arn:aws:lambda:region:account-id:function:ThrowErrorFunction:$LATEST", "Payload": "{% $states.input %}" }, "Catch": [ { "ErrorEquals": [ "CustomError" ], "Next": "CustomErrorFallback" }, { "ErrorEquals": [ "States.ALL" ], "Next": "CatchAllFallback" } ], "End": true, "Retry": [ { "ErrorEquals": [ "CustomError", "Lambda.ServiceException", "Lambda.AWSLambdaException", "Lambda.SdkClientException", "Lambda.TooManyRequestsException" ], "IntervalSeconds": 1, "MaxAttempts": 3, "BackoffRate": 2, "JitterStrategy": "FULL" } ] }, "CustomErrorFallback": { "Type": "Pass", "End": true, "Output": { "Result": "Fallback from a custom error function." } }, "CatchAllFallback": { "Type": "Pass", "End": true, "Output": { "Result": "Fallback from all other error codes." } } }, "QueryLanguage": "JSONata" }

ステップ 4: ステートマシンを設定する

ステートマシンを実行する前に、先ほど作成した Lambda 関数に接続する必要があります。

  1. [デザイン] モードに戻り、CreateAccount という名前の [Lambda : Invoke] タスクステートを選択します。

  2. [設定] タブで、[API の引数] を探します。 [関数名] で、先ほど作成した Lambda 関数を選択します。

  3. [作成] を選択し、ロールを確認してから、[確認] を選択すると、ステートマシンが作成されます。

ステップ 5: ステートマシンを実行する

ステートマシンを作成して設定したら、実行してフローを調べることができます。

  1. エディタで [実行] を選択します。

    あるいは、[ステートマシン] リストから [実行を開始] を選択します。

  2. [実行を開始] ダイアログボックスで、生成された ID を受け入れ、[入力] に次の JSON を入力します。

    { "Cause" : "Custom Function Error" }
  3. [実行のスタート] を選択します。

Step Functions コンソールから実行 ID のタイトルが付いたページ ([実行の詳細] ページ) が表示されます。ワークフローの進行中および完了後に、実行結果を確認できます。

実行結果を確認するには、[グラフビュー] で個々の状態を選択し、ステップの詳細 ペインの個々のタブを選択すると、入力、出力、定義などの各状態の詳細がそれぞれ表示されます。[実行の詳細] ページに表示できる実行情報の詳細については、「実行の詳細の概要」を参照してください。

ステートマシンは Lambda 関数を呼び出し、CustomError がスローされます。グラフビュー[CreateAccount] ステップを選択して、ステートの出力を確認します。ステートマシンの出力は次の図のようになります。

カスタムエラーをキャッチするワークフローのスクリーンショット。

おめでとうございます。

これで、Lambda 関数によってスローされたエラー条件をキャッチして処理できるステートマシンが完成しました。このパターンを使用して、ワークフローに堅牢なエラー処理を実装できます。

注記

また、タイムアウト時に再試行するステートマシンや、エラーやタイムアウトが発生したときに、Catch を使用して特定の状態に移行するステートマシンを作成できます。これらのエラー処理方法の例については、Retry の使用例と Catch の使用例を参照してください。