翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Step Functions ワークフローに条件付きロジックを追加する
前のトピックサービスの統合「」では、Lambda 関数を統合しました。このトピックでは、 で if-else 条件を設定します選択 state
。選択状態は、特定の条件に基づいてワークフローの実行パスを決定します。
RandomNumberforCredit
Lambda 関数によって返される適用されたクレジット量に基づいてパスを選択するロジックを追加します。値がしきい値の制限内にある場合、クレジットアプリケーションは自動的に承認され、次のステップに進みます。値がしきい値の制限を超えると、ワークフローを続行するには人間による承認が必要です。
タスクトークンが返されるまでワークフローの実行を一時停止することで、人間によるやり取りのステップを模倣します。これを行うには、タスクトークンを に渡します。 AWS SDK Amazon Simple Notification Service との統合。ワークフローの実行は、タスクトークンをSendTaskSuccess
API呼び出しで返すまで一時停止されます。タスクトークンを使用して他の サービスと統合する方法については、「 のサービスタスクトークンによるコールバックを待つ統合パターン」を参照してください。
プロトタイプステートマシン を作成したら、人間による承認と自動承認のステップを定義しました。次に、コールバックトークンを受信する Amazon SNSトピックを作成する必要があります。次に、コールバック機能を実装する Lambda 関数を作成します。最後に、これらの詳細を追加してワークフロープロトタイプを更新します。 AWS のサービス 統合。
ステップ 1: コールバックトークンを受信する Amazon SNSトピックを作成する
人による操作ステップを実装するには、Amazon Simple Notification Service トピックに公開し、このトピックにコールバックタスクトークンを渡します。タスクトークンがペイロードとともに返されるまで、コールバックタスクはワークフローの実行を一時停止します。
-
Amazon SNSコンソール
を開き、標準トピックタイプを作成します。トピックの作成の詳細については、「Amazon Simple Notification Service デベロッパーガイド」の「Amazon SNSトピックの作成」を参照してください。 -
トピック名に
TaskTokenTopic
を指定します。 -
トピックをコピーARNしてテキストファイルに保存してください。人間による承認待ち状態のサービス統合を指定するARNときは、 トピックが必要です。トピック の例を次に示しますARN。
arn:aws:sns:us-east-2:123456789012:TaskTokenTopic
-
トピックの 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
という名前を付けることができます。
-
新しいタブまたはウィンドウで Lambda コンソール
を開き、 というタイトルの Node.js Lambda 関数を作成します callback-human-approval
。コンソールを使用して Lambda 関数を作成する方法については、「」の「コンソールで Lambda 関数を作成する」を参照してください。 AWS Lambda デベロッパーガイド。 -
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; };
-
以降のアクションに進むには、このウィンドウを開いたまま次のステップに進みます。
ステップ 2.2: Lambda 関数のトリガーとして Amazon SNSトピックを追加する
タスクトークンを使用して Amazon SNSトピックに発行すると、Lambda 関数は公開されたメッセージのペイロードで呼び出されます。Lambda 関数のトリガーの設定の詳細については、「」の「トリガーの設定」を参照してください。 AWS Lambda デベロッパーガイド。
-
callback-human-approval
Lambda 関数の [関数の概要] セクションで、[トリガーを追加] を選択します。 -
トリガーのドロップダウンリストから、トリガーSNSとして を選択します。
-
SNS トピック については、このチュートリアル のステップ 1 で作成した Amazon SNSトピックの名前を入力し始め、表示されるドロップダウンリストから選択します。
-
[追加] を選択します。
-
以降のアクションに進むには、このウィンドウを開いたまま次のステップに進みます。
ステップ 2.3: Lambda 関数IAMロールに必要なアクセス許可を付与する
SendTaskSucess
API 呼び出しとともにタスクトークンを返すには、Step Functions にアクセスするためのアクセス許可を callback-human-approval
Lambda 関数に提供する必要があります。
-
callback-human-approval ページで、設定 タブを選択し、アクセス許可 を選択します。
-
実行ロール で、ロール名を選択して に移動します。 AWS Identity and Access Management コンソールのロールページ。
-
必要なアクセス許可を追加するには、[アクセス許可の追加] を選択し、次に [ポリシーをアタッチ] を選択します。
-
[検索] ボックスに、
AWSStepFunctions
と入力して Enter を押します。 -
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 条件ロジックを追加するには
-
ステートマシンを作成する で作成したワークフロープロトタイプを含む、Step Functions コンソール
ウィンドウを開きます。 -
[適用したクレジット > = 5000?] 状態を選択します。[設定] タブで、次のように条件付きロジックを指定します。
-
[選択ルール] で、[ルール #1] タイルの [編集] アイコンを選択し、最初の選択ルールを定義します。
-
[条件を追加] を選択します。
-
[ルール #1 の条件] ダイアログボックスで、[変数] に
$
を入力します。 -
[演算子] には [未満] を選択します。
-
[値] で [定数] を選択し、[値] ドロップダウンリストの横にあるフィールドに
5000
を入力します。 -
[条件を保存する] を選択します。
-
[次の状態:] ドロップダウンリストで、[自動承認の上限] を選択します。
-
[新しい選択ルールを追加] を選択し、サブステップ 2.b から 2.f を繰り返して、クレジット金額が 5000 以上になったら 2 つ目の選択ルールを定義します。[演算子] で、[以上] を選択します。
-
[次の状態:] ドロップダウンリストには、[人による承認待ち] を選択します。
-
[デフォルトのルール] ボックスで、[編集] アイコンを選択してデフォルトの選択ルールを定義し、[デフォルトの状態]ドロップダウンリストから [人による承認待ち] を選択します。デフォルトのルールは、[選択] 状態の条件がどれも「true」または「false」と評価されなかった場合に、遷移する次の状態を指定するために定義します。
-
-
次のように、[人による承認待ち] 状態を設定します。
-
設定タブのトピック で、Amazon SNSトピックの名前 を入力し始め、ドロップダウンリストに表示される名前TaskTokenTopicを選択します。
-
[メッセージ] には、ドロップダウンリストから [メッセージを入力] を選択します。メッセージ フィールドで、Amazon SNSトピックに発行するメッセージを指定します。このチュートリアルでは、タスクトークンをメッセージとして公開します。
タスクトークンを使用すると、外部プロセスが完了してタスクトークンが返されるまで、[Standard] タイプの Step Functions ワークフローを一時停止できます。.waitForTaskToken サービス統合パターンを指定して、タスク状態をコールバックタスクとして指定すると、タスクの開始時にタスクトークンが生成され、コンテキストオブジェクトに配置されます。コンテキストオブジェクトは、実行中に使用できる内部JSON構造であり、ステートマシンとその実行に関する情報が含まれています。コンテキストオブジェクトの詳細については、「コンテキストオブジェクト」を参照してください。
-
表示されたボックスで、メッセージとして次のように入力します。
{ "TaskToken.$": "$$.Task.Token" }
-
[コールバックを待つ] チェックボックスをオンにします。
-
表示されたダイアログボックスで [完了] を選択します。
-
-
このウィンドウを開いたままにして、次のトピックに進みます。
次のステップ
次のトピック並列タスクを定義するでは、複数のタスクを並行して実行する方法について説明します。