

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Step Functions ステートマシンでのエラー条件の処理
<a name="tutorial-handling-error-conditions"></a>

このチュートリアルでは、カスタムエラーをスローするために構築された Lambda 関数の例を呼び出す**タスク**状態を持つ AWS Step Functions ステートマシンを作成します。

タスクは [Fallback 状態](concepts-error-handling.md#error-handling-fallback-states) の 1 つであり、`Catch` フィールドを設定できます。統合からエラーを受け取ると、Catch フィールドがエラー名に基づいて次のステップを選択します。

## ステップ 1: エラーをスローする Lambda 関数を作成する
<a name="create-lambda-function-fail"></a>

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

1. [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) で AWS Lambda コンソールを開きます。

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

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

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

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

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

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

   ```
   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 関数をテストする
<a name="error-conditions-test"></a>

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

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

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

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

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

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

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

## ステップ 3: ステートマシンを作成する
<a name="state-machine-create-step"></a>

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

1. [Step Functions コンソール](https://console.aws.amazon.com/states/home)を開き、メニューから **[ステートマシン]** を選択したら、**[ステートマシンの作成]** を選択します。

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

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

1. **[コード]** を選択して 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: ステートマシンを設定する
<a name="state-machine-configure"></a>

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

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

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

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

## ステップ 5: ステートマシンを実行する
<a name="error-conditions-execution"></a>

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

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

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

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

   ```
   { "Cause" : "Custom Function Error" }
   ```

1. **[実行のスタート]** を選択します。

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

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

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

![カスタムエラーをキャッチするワークフローのスクリーンショット。](http://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/images/tutorial-console-retry-state-machine-error-output.png)


**おめでとうございます。**

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

**注記**  
また、タイムアウト時に[再試行](concepts-error-handling.md#error-handling-retrying-after-an-error)するステートマシンや、エラーやタイムアウトが発生したときに、`Catch` を使用して特定の状態に移行するステートマシンを作成できます。これらのエラー処理方法の例については、[Retry の使用例と Catch の使用例](concepts-error-handling.md#error-handling-examples)を参照してください。