Step Functions ステートマシンでのエラー条件の処理
このチュートリアルでは、Task ステートを含む AWS Step Functions ステートマシンを作成します。このステートは、カスタムエラーをスローするように構築されたサンプルの Lambda 関数を呼び出します。
タスクは Fallback 状態 の 1 つであり、Catch フィールドを設定できます。統合からエラーを受け取ると、Catch フィールドがエラー名に基づいて次のステップを選択します。
ステップ 1: エラーをスローする Lambda 関数を作成する
Lambda 関数を使用してエラー条件をシミュレートします。
-
AWS Lambda コンソールの https://console.aws.amazon.com/lambda/
を開いてください。 -
[関数の作成] を選択してください。
-
[ブループリントを使う] を選択し、
Step Functionsを検索して、[カスタムエラーをスローする] を選択します。 -
[関数名] に「
ThrowErrorFunction」と入力します。 -
[Role] で、[Create a new role with basic Lambda permissions] を選択します。
-
[関数の作成] を選択してください。
次のコードが [コード] ペインに表示されます。
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 をスローすることを確認します。
-
[テスト] タブを選択します。
-
[新しいイベントを作成] を選択し、デフォルトの [Event JSON] をそのままにします。
-
[テスト] を選択して、テストイベントで関数を呼び出します。
-
[関数の実行] を展開して、スローされたエラーの詳細を確認します。
これで、カスタムエラーをスローする Lambda 関数を用意できました。
次のステップでは、そのエラーをキャッチして再試行するようにステートマシンを設定します。
ステップ 3: ステートマシンを作成する
Step Functions コンソールを使用して、Task ワークフロー状態 で Catch 設定を使用するステートマシンを作成します。このステートマシンは、呼び出されるとエラーをスローするように構築した Lambda 関数を呼び出します。Step Functions は、再試行間に exponential backoff (エクスポネンシャルバックオフ) を使用して、この関数を再試行します。
-
Step Functions コンソール
を開き、メニューから [ステートマシン] を選択したら、[ステートマシンの作成] を選択します。 -
[空白から作成] を選択し、[ステートマシン名] に「
CatchErrorStateMachine」と入力します。 -
デフォルトのタイプ (Standard) を受け入れ、[続行] を選択して、Workflow Studio でステートマシンを編集します。
-
[コード] を選択して 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 関数に接続する必要があります。
-
[デザイン] モードに戻り、CreateAccount という名前の [Lambda : Invoke] タスクステートを選択します。
[設定] タブで、[API の引数] を探します。 [関数名] で、先ほど作成した Lambda 関数を選択します。
[作成] を選択し、ロールを確認してから、[確認] を選択すると、ステートマシンが作成されます。
ステップ 5: ステートマシンを実行する
ステートマシンを作成して設定したら、実行してフローを調べることができます。
-
エディタで [実行] を選択します。
あるいは、[ステートマシン] リストから [実行を開始] を選択します。
-
[実行を開始] ダイアログボックスで、生成された ID を受け入れ、[入力] に次の JSON を入力します。
{ "Cause" : "Custom Function Error" } -
[実行のスタート] を選択します。
Step Functions コンソールから実行 ID のタイトルが付いたページ ([実行の詳細] ページ) が表示されます。ワークフローの進行中および完了後に、実行結果を確認できます。
実行結果を確認するには、[グラフビュー] で個々の状態を選択し、ステップの詳細 ペインの個々のタブを選択すると、入力、出力、定義などの各状態の詳細がそれぞれ表示されます。[実行の詳細] ページに表示できる実行情報の詳細については、「実行の詳細の概要」を参照してください。
ステートマシンは Lambda 関数を呼び出し、CustomError がスローされます。グラフビューで [CreateAccount] ステップを選択して、ステートの出力を確認します。ステートマシンの出力は次の図のようになります。
おめでとうございます。
これで、Lambda 関数によってスローされたエラー条件をキャッチして処理できるステートマシンが完成しました。このパターンを使用して、ワークフローに堅牢なエラー処理を実装できます。
注記
また、タイムアウト時に再試行するステートマシンや、エラーやタイムアウトが発生したときに、Catch を使用して特定の状態に移行するステートマシンを作成できます。これらのエラー処理方法の例については、Retry の使用例と Catch の使用例を参照してください。