Step Functions ワークフローに条件付きロジックを追加する - AWS Step Functions

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

Step Functions ワークフローに条件付きロジックを追加する

前のトピックサービスの統合「」では、Lambda 関数を統合しました。このトピックでは、 で if-else 条件を設定します選択 state。選択状態は、特定の条件に基づいてワークフローの実行パスを決定します。

RandomNumberforCredit Lambda 関数によって返される適用されたクレジット量に基づいてパスを選択するロジックを追加します。値がしきい値の制限内にある場合、クレジットアプリケーションは自動的に承認され、次のステップに進みます。値がしきい値の制限を超えると、ワークフローを続行するには人間による承認が必要です。

タスクトークンが返されるまでワークフローの実行を一時停止することで、人間によるやり取りのステップを模倣します。これを行うには、タスクトークンを に渡します。 AWS SDK Amazon Simple Notification Service との統合。ワークフローの実行は、タスクトークンをSendTaskSuccessAPI呼び出しで返すまで一時停止されます。タスクトークンを使用して他の サービスと統合する方法については、「 のサービスタスクトークンによるコールバックを待つ統合パターン」を参照してください。

プロトタイプステートマシン を作成したら、人間による承認と自動承認のステップを定義しました。次に、コールバックトークンを受信する 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 関数を作成する

この関数では、クレジット制限の承認リクエストを処理し、リクエストの結果をSendTaskSuccessAPI呼び出し成功として返します。この Lambda 関数は、Amazon SNSトピックから受信したタスクトークンも返します。

わかりやすくするために、ヒューマンインタラクションステップに使用される Lambda 関数は、タスクを自動的に承認し、SendTaskSuccessAPI呼び出しでタスクトークンを返します。Lambda 関数には、 callback-human-approval という名前を付けることができます。

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

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

    // Lambda function that will automatically approve any task // in a message published to an Amazon SNS topic console.log('Loading function'); const AWS = require('aws-sdk'); const resultMessage = "Successful"; export const handler = async (event) => { 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: Lambda 関数のトリガーとして Amazon SNSトピックを追加する

タスクトークンを使用して Amazon SNSトピックに発行すると、Lambda 関数は公開されたメッセージのペイロードで呼び出されます。Lambda 関数のトリガーの設定の詳細については、「」の「トリガーの設定」を参照してください。 AWS Lambda デベロッパーガイド

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

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

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

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

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

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

SendTaskSucess API 呼び出しとともにタスクトークンを返すには、Step Functions にアクセスするためのアクセス許可を callback-human-approval Lambda 関数に提供する必要があります。

  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 状態内の比較に使用するには、次の手順に示す $ 構文を使用しま。

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

注記

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

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

Choice 状態を使用して if-else 条件ロジックを追加するには
  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. このウィンドウを開いたままにして、次のトピックに進みます。

次のステップ

次のトピック並列タスクを定義するでは、複数のタスクを並行して実行する方法について説明します。