AWS Step Functions
開発者ガイド

ステートマシンを使用してエラー条件を処理する

このチュートリアルでは、Catch フィールドを使用する AWS Step Functions ステートマシンを作成します。このステートマシンは、AWS Lambda 関数を使用して、エラーメッセージのタイプに基づいた条件ロジックに従って応答します。これは、関数エラー処理と呼ばれるテクニックです。

詳細については、AWS Lambda Developer Guideの「関数エラーの処理」を参照してください。

注記

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

ステップ 1: Lambda 用の IAM ロールを作成する

AWS Lambda と AWS Step Functions のいずれも、コードを実行して AWS リソース (Amazon S3 バケットに保存されているデータなど) にアクセスできます。セキュリティを維持するために、これらのリソースへのアクセスを Lambda および Step Functions に付与する必要があります。

Lambda では、Lambda 関数を作成する際に AWS Identity and Access Management (IAM) ロールを割り当てる必要があります。これは、ステートマシンを作成する際に Step Functions に IAM ロールを割り当てる必要があるのと同じ方法です。

  1. IAM コンソールにサインインして、[ロール]、[ロールの作成] の順に選択します。

  2. [信頼されたエンティティの種類を選択] ページの [AWS のサービス] で、リストから [Lambda] を選択し、[Next: Permissions (次へ: アクセス許可)] を選択します。

    注記

    ロールは、Lambda にロールの使用を許可する信頼関係によって自動的に提供されます。

  3. [Attach permissions policy (アクセス許可ポリシーをアタッチする)] ページで、[Next: Review (次へ: レビュー)] を選択します。

  4. [Review (レビュー)] ページで、[ロール名] に MyLambdaRole と入力し、[ロールの作成] を選択します。

ロールのリストで、IAM ロールが表示されます。

ステップ 2: 失敗する Lambda 関数を作成する

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

重要

Lambda 関数が、ステートマシンと同じ AWS アカウントと AWS リージョンにあることを確認します。

  1. https://console.aws.amazon.com/lambda/ にある AWS Lambda コンソールを開きます。

    [Create a function] を選択します。

  2. [Blueprints] セクションで、フィルターに「step-functions」と入力し、[step-functions-error] 設計図を選択します。

  3. [Basic information] セクションで、Lambda 関数を構成します。

    1. [Name (名前)] に「FailFunction」と入力します。

    2. [Role] で、[Choose an existing role] を選択します。

    3. [Existing role (既存のロール)] で、前に作成した Lambda ロールを選択します。

      注記

      作成した IAM ロールがリストに表示されない場合は、そのロールが Lambda に伝達されるまであと数分かかる場合があります。

  4. 次のコードが [Lambda 関数コード] ペインに表示されます。

    'use strict'; exports.handler = (event, context, callback) => { function CustomError(message) { this.name = 'CustomError'; this.message = message; } CustomError.prototype = new Error(); const error = new CustomError('This is a custom error!'); callback(error); };

    context オブジェクトはエラーメッセージ This is a custom error! を返します。

  5. [Create function] を選択します。

    Lambda 関数が作成されたら、ページの右上隅に表示されているその Amazon リソースネーム (ARN) を記録します。例:

    arn:aws:lambda:us-east-1:123456789012:function:FailFunction

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

Lambda 関数をテストしてオペレーションを確認します。

  1. [FailFunction] ページで、[Test] を選択します。

  2. [Configure test event (テストイベントの設定)] ダイアログボックスで、[Event name (イベント名)] に「FailFunction」と入力し、[Create (作成)] を選択します。

  3. [FailFunction] ページで、Lambda 関数の [Test] を実行します。

    テストの結果 (シミュレートしたエラー) がページの下部に表示されます。

ステップ 4: Catch フィールドを使用するステートマシンを作成する

Step Functions コンソールにより、Task 状態で Catch フィールドを使用するステートマシンを作成します。Task ステートに Lambda 関数への参照を追加します。Lambda 関数が呼び出され、実行中に失敗します。Step Functions は、再試行間のエクスポネンシャルパックオフを使用して、関数を 2 回再試行します。

  1. Step Functions コンソールを開き、[Create a state machine (ステートマシンの作成)] を選択します。

  2. [Create a state machine (ステートマシンの作成)] ページで、[テンプレート]、[Catch failure (Catch の失敗)] の順に選択します。

  3. [Name your state machine (ステートマシンの名前)] (例: Catchfailure)。

    注記

    ステートマシン、実行、およびアクティビティ名の長さは 1~80 文字で、アカウントと AWS リージョンに対して一意である必要があります。また、次の文字を含めることはできません。

    • 空白

    • ワイルドカード文字 (? *)

    • 括弧 (< > { } [ ])

    • 特殊文字 (: ; , \ | ^ ~ $ # % & ` ")

    • 制御文字 (\\u0000 - \\u001f or \\u007f - \\u009f)

    Step Functions では、ASCII 以外の文字を含むステートマシン、実行、およびアクティビティの名前を作成することができます。これらの ASCII 以外の文字は Amazon CloudWatch では使用できません。CloudWatch メトリクスを追跡できるようにするには、ASCII 文字のみを使用する名前を選択します。

  4. [Code] ペインで、Resource フィールドに前に作成した Lambda 関数の ARN を追加します。以下に例を示します。

    { "Comment": "A Catch example of the Amazon States Language using an AWS Lambda function", "StartAt": "CreateAccount", "States": { "CreateAccount": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:FailFunction", "Catch": [ { "ErrorEquals": ["CustomError"], "Next": "CustomErrorFallback" }, { "ErrorEquals": ["States.TaskFailed"], "Next": "ReservedTypeFallback" }, { "ErrorEquals": ["States.ALL"], "Next": "CatchAllFallback" } ], "End": true }, "CustomErrorFallback": { "Type": "Pass", "Result": "This is a fallback from a custom Lambda function exception", "End": true }, "ReservedTypeFallback": { "Type": "Pass", "Result": "This is a fallback from a reserved error code", "End": true }, "CatchAllFallback": { "Type": "Pass", "Result": "This is a fallback from any error code", "End": true } } }

    これは、Amazon ステートメント言語 を使用したステートマシンの説明です。CreateAccount という名前の単一の Task 状態を定義します。詳細については、「State Machine Structure」を参照してください。

    Retry フィールドの構文の詳細については、「Retry の使用例と Catch の使用例」を参照してください。

    注記

    Lambda で処理されないエラーは、エラー出力で Lambda.Unknown と表示されます。これには、メモリ不足エラー、関数のタイムアウト、同時 Lambda 呼び出しの制限などがあります。これらのエラーを処理するには、Lambda.UnknownStates.ALL、または States.TaskFailed で一致できます。Lambda が呼び出しの制限に達した場合のエラーは Lambda.TooManyRequestsException になります。Lambda の Handled および Unhandled エラーの詳細については、AWS Lambda Developer Guideの「FunctionError」を参照してください。

  5. [Visual Workflow] のグラフを使用して、Amazon ステートメント言語 コードでステートマシンが正しく記述されていることを確認します。

    グラフが表示されない場合は、[Visual Workflow] ペインの 
       refresh
    を選択します。

  6. [Next] を選択します。

  7. IAM ロールを作成または入力します。

    • Step Functions の IAM ロールを作成するには、[自分用の IAM ロールを作成する] を選択し、[名前] にロール名を入力します。

    • ステートマシンの正しいアクセス許可を使用して IAM ロールをすでに作成済みである場合は、[Choose an existing IAM role (既存の IAM ロールを選択する)] を選択します。リストから ロールを選択するか、ロールの ARN を指定します。

    注記

    Step Functions によって作成された IAM ロールを削除すると、Step Functions で後で再作成することはできません。同様に、ロールを変更すると (たとえば、IAM ポリシーのプリンシパルから Step Functions を削除するなど)、後で Step Functions でそれを元の設定に復元することはできません。

  8. [Create state machine (ステートマシンの作成)] をクリックします。

ステップ 5: 新しい実行を開始する

ステートマシンを作成した後、実行を開始できます。

  1. [CatchStateMachine] ページで、[New execution (新しい実行)] を選択します。

    [New execution (新しい実行)] ページが表示されます。

  2. (オプション) 実行を特定できるように、[Enter an execution name] (実行名を入力) ボックスでその ID を指定できます。ID を入力しない場合、Step Functions は自動的に一意の ID を生成します。

    注記

    Step Functions では、ASCII 以外の文字を含むステートマシン、実行、およびアクティビティの名前を作成することができます。これらの ASCII 以外の文字は Amazon CloudWatch では使用できません。CloudWatch メトリクスを追跡できるようにするには、ASCII 文字のみを使用する名前を選択します。

  3. [Start Execution] を選択します。

    ステートマシンの新しい実行が開始され、実行中の実行が表示されている新しいページが表示されます。

  4. [Execution Details] (実行の詳細) セクションで、[Output] (出力) セクションを展開して、ワークフローの出力を表示します。

    
                            実行出力
  5. カスタムエラーメッセージを表示するには、[Visual workflow] (ビジュアルワークフロー) で [CreateAccount] を選択して、[Output] (出力) セクションを展開します。

    
                            エラー出力

    注記

    状態入力とエラーを保持するには、ResultPath を使用します。「ResultPath を使用して、エラーと入力の両方を Catch に含める」を参照してください。