チュートリアル 3: ワークフローに if-else 条件を実装する - AWS Step Functions

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

チュートリアル 3: ワークフローに if-else 条件を実装する

選択 状態を使用することにより、ワークフローに if-else 条件を実装できます。指定された条件が「true」または「false」のどちらと評価されるかによって、ワークフローの実行パスを決定します。

このチュートリアルでは、チュートリアル 2 で使用した RandomNumberforCredit Lambda 関数によって返されたクレジットの申請額が、特定のしきい値を超えたかどうかを判断する条件付きロジックを追加します。金額が上限を超えた場合、アプリケーションでは、承認には人による操作が必要になります。それ以外の場合、アプリケーションによって自動承認され、次のステップに進みます。

タスクトークンが返されるまでワークフローの実行を一時停止することにより、人による操作ステップを模倣します。これを行うには、このチュートリアルで使用する AWS SDK 統合である Amazon Simple Notification Service にタスクトークンを渡します。ワークフローの実行は、SendTaskSuccess API コールでタスクトークンが返されるまで一時停止されます。タスクトークン使用の詳細については、「タスクトークンのコールバックまで待機する」を参照してください。

このチュートリアルでは、ワークフロープロトタイプで人による承認と自動承認のステップを定義済みなので、まず、コールバックトークンを受け取る Amazon SNS トピックを作成します。次に、コールバック機能を実装する Lambda 関数を作成します。最後に、これらの AWS のサービス 統合の詳細を追加して、ワークフロープロトタイプを更新します。

ステップ 1: コールバックトークンを受け取る Amazon SNS トピックを作成する

人による操作ステップを実装するには、Amazon Simple Notification Service トピックに公開し、このトピックにコールバックタスクトークンを渡します。タスクトークンがペイロードとともに返されるまで、コールバックタスクはワークフローの実行を一時停止します。

  1. Amazon SNS コンソールを開き、[標準] トピックタイプを作成します。トピックの作成の詳細については、「Amazon Simple Notification Service デベロッパーガイド」の「Amazon SNS トピックを作成する」を参照してください。

  2. トピック名に TaskTokenTopic を指定します。

  3. 必ずトピック ARN をコピーし、テキストファイルに保存してください。人による承認待ち状態のサービス統合を指定する場合には、トピック ARN が必要になります。トピック ARN の例を次に示します。

    arn:aws:sns:us-east-2:123456789012:TaskTokenTopic
  4. トピックの E メールベースのサブスクリプションを作成し、次にサブスクリプションを確定します。トピックへのサブスクリプションの詳細については、「Amazon Simple Notification Service デベロッパーガイド」の「トピックに対するサブスクリプションを作成する」を参照してください。

ステップ 2: コールバックを処理する Lambda 関数を作成する

コールバック機能を処理するには、Lambda 関数を定義し、この関数のトリガーとして、ステップ 1 で作成した Amazon SNS トピックを追加します。タスクトークンを使用して Amazon SNS トピックに発行すると、発行されたメッセージのペイロードで Lambda 関数が呼び出されます。

ステップ 2.1: コールバックを処理する Lambda 関数を作成する

この関数は、クレジット限度額承認リクエストを処理し、SendTaskSuccess API コールによって、リクエストの結果を成功として返します。この Lambda 関数は、Amazon SNS トピックから受け取ったタスクトークンも返します。

簡略化のため、人による操作ステップに使用される Lambda 関数は、すべてのタスクを自動的に承認し、SendTaskSuccess API コールでタスクトークンを返します。Lambda 関数には、 callback-human-approval という名前を付けることができます。

  1. 新しいタブまたはウィンドウで Lambda コンソールを開き、callback-human-approval というタイトルの Node.js 16.x Lambda 関数を作成します。コンソールを使用した Lambda 関数の作成については、「AWS Lambda デベロッパーガイド」の「コンソールで Lambda の関数の作成」を参照してください。

  2. [callback-human-approval] ページで、[コードソース] 領域の既存のコードを、次のコードに置き換えます。

    // Sample Lambda function that will automatically approve any task whenever a message is published to an Amazon SNS topic by Step Functions. console.log('Loading function'); const AWS = require('aws-sdk'); const resultMessage = "Successful"; exports.handler = async (event, context) => { const stepfunctions = new AWS.StepFunctions(); let message = JSON.parse(event.Records[0].Sns.Message); let taskToken = message.TaskToken; console.log('Message received from SNS:', message); console.log('Task token: ', taskToken); // Return task token to Step Functions let params = { output: JSON.stringify(resultMessage), taskToken: taskToken }; console.log('JSON Returned to Step Functions: ', params); let myResult = await stepfunctions.sendTaskSuccess(params).promise(); console.log('State machine - callback completed..'); return myResult; };
  3. 以降のアクションに進むには、このウィンドウを開いたまま次のステップに進みます。

ステップ 2.2: Amazon SNS トピックを Lambda 関数のトリガーとして追加する

このチュートリアルのステップ 1 で作成した Amazon SNS トピックを、このチュートリアルのステップ 2.1 で作成した Lambda 関数のトリガーとして追加すると、Amazon SNS トピックに発行するたびに Lambda 関数がトリガーされます。タスクトークンを使用して Amazon SNS トピックに発行すると、発行されたメッセージのペイロードで Lambda 関数が呼び出されます。Lambda 関数のトリガー設定の詳細については、「AWS Lambda デベロッパーガイド」の「トリガーの設定」を参照してください。

  1. callback-human-approval Lambda 関数の [関数の概要] セクションで、[トリガーを追加] を選択します。

  2. トリガーのドロップダウンリストから、トリガーとして [SNS] を選択します。

  3. [SNS トピック] には、このチュートリアルのステップ 1 で作成した Amazon SNS トピックの名前を入力し始め、表示されるドロップダウンリストから選択します。

  4. [Add] (追加) を選択します。

  5. 以降のアクションに進むには、このウィンドウを開いたまま次のステップに進みます。

ステップ 2.3: Lambda 関数の IAM ロールに必要なアクセス許可を付与する

SendTaskSucess API コールとともにタスクトークンを返すには、callback-human-approval Lambda 関数に Step Functions へのアクセス許可を付与する必要があります。

  1. [callback-human-approval] ページで、[設定] タブを選択し、次に [アクセス許可] を選択します。

  2. [実行ロール] で、[ロール名] を選択し、AWS Identity and Access Management コンソールの [ロール] ページに移動します。

  3. 必要なアクセス許可を追加するには、[アクセス許可の追加] を選択し、次に [ポリシーをアタッチ] を選択します。

  4. [検索] ボックスに、AWSStepFunctions と入力して Enter を押します。

  5. [AWSStepFunctionsFullAccess] を選択し、下にスクロールして [ポリシーをアタッチ] を選択します。これにより、callback-human-approval Lambda 関数ロールに必要なアクセス許可を含むポリシーが追加されます。

ステップ 3: ワークフローの更新 - 選択状態に if-else 条件ロジックを追加する

Step Functions コンソールで、Choice 状態を使用してワークフローの条件ロジックを定義します。RandomNumberforCredit Lambda 関数によって返される出力が 5,000 未満の場合、リクエストされたクレジットは自動的に承認されます。返される出力が 5,000 以上の場合、ワークフローの実行は人による操作ステップに進み、クレジット限度額額を承認します。

Choice 状態では、比較演算子を使用して、入力変数を特定の値と比較します。ステートマシンの実行開始時に、入力変数を実行入力として指定することも、直前のステップの出力を現在のステップの入力として使用することもできる。デフォルトでは、ステップの出力は Payload と呼ばれる変数に保存されます。Payload 変数の値を Choice 状態内の比較に使用するには、次の手順に示す $ 構文を使用しま。

ある状態から別の状態への情報の流れや、ワークフローでの入出力の指定方法については、「チュートリアル 7: 入力と出力を構成する」および「Step Functions の入出力処理」を参照してください。

注記

Choice 状態によって、比較のためにステートマシンの実行入力で指定された入力変数を使用する場合は、$.variable_name 構文を使用して比較を実行します。例えば、myAge などの変数を比較するには、$.myAge 構文を使用します。

このステップでは、Choice 状態が クレジット限度額を取得状態からの入力を受け取ることになるため、$ 構文を使用して Choice 状態を設定します。$.variable_name 状態の設定で、Choice 構文を使用して直前のステップの出力を参照する場合、ステートマシンの実行結果がどのように異なるかを調べるには、チュートリアル 8 の「無効なパス選択状態のエラーのデバッグ セクション」を参照してください。

Choice 状態を使用して if-else 条件ロジックを追加するには
  1. チュートリアル 1: ステートマシンのプロトタイプを作成する で作成したワークフロープロトタイプを含む、Step Functions コンソールウィンドウを開きます。

  2. [適用したクレジット > = 5000?] 状態を選択します。[設定] タブで、次のように条件付きロジックを指定します。

    1. [選択ルール] で、[ルール #1] タイルの [編集] アイコンを選択し、最初の選択ルールを定義します。

    2. [条件を追加] を選択します。

    3. [ルール #1 の条件] ダイアログボックスで、[変数]$ を入力します。

    4. [演算子] には [未満] を選択します。

    5. [値][定数] を選択し、[値] ドロップダウンリストの横にあるフィールドに 5000 を入力します。

    6. [条件を保存する] を選択します。

    7. [次の状態:] ドロップダウンリストで、[自動承認の上限] を選択します。

    8. [新しい選択ルールを追加] を選択し、サブステップ 2.b から 2.f を繰り返して、クレジット金額が 5000 以上になったら 2 つ目の選択ルールを定義します。[演算子] で、[以上] を選択します。

    9. [次の状態:] ドロップダウンリストには、[人による承認待ち] を選択します。

    10. [デフォルトのルール] ボックスで、[編集] アイコンを選択してデフォルトの選択ルールを定義し、[デフォルトの状態]ドロップダウンリストから [人による承認待ち] を選択します。デフォルトのルールは、[選択] 状態の条件がどれも「true」または「false」と評価されなかった場合に、遷移する次の状態を指定するために定義します。

  3. 次のように、[人による承認待ち] 状態を設定します。

    1. [設定] タブの [トピック] に、Amazon SNS トピックの名前 [TaskTokenTopic] を入力し始め、ドロップダウンリストに表示される名前を選択します。

    2. [メッセージ] には、ドロップダウンリストから [メッセージを入力] を選択します。[メッセージ] フィールドで、Amazon SNS トピックに公開するメッセージを指定します。このチュートリアルでは、タスクトークンをメッセージとして公開します。

      タスクトークンを使用すると、外部プロセスが完了してタスクトークンが返されるまで、[Standard] タイプの Step Functions ワークフローを一時停止できます。.waitForTaskToken サービス統合パターンを指定して、タスク状態をコールバックタスクとして指定すると、タスクの開始時にタスクトークンが生成され、コンテキストオブジェクトに配置されます。コンテキストオブジェクトは、実行中に使用できる内部の JSON 構造であり、ステートマシンとその実行に関する情報が含まれています。コンテキストオブジェクトの詳細については、「コンテキストオブジェクト」を参照してください。

    3. 表示されたボックスで、メッセージとして次のように入力します。

      { "TaskToken.$": "$$.Task.Token" }
    4. [コールバックを待つ] チェックボックスをオンにします。

    5. 表示されたダイアログボックスで [完了] を選択します。

  4. 以降のアクションに進むには、このウィンドウを開いたままで次のチュートリアルに進みます。

次のステップ

次のチュートリアルでは、複数のタスクを並行して実行する方法を学習します。