Step Functions で Lambda 関数を使用して新しい実行を継続する - AWS Step Functions

Step Functions で Lambda 関数を使用して新しい実行を継続する

ヒント

次のアプローチでは、Lambda 関数を使用して新しいワークフロー実行を開始します。Step Functions の Task 状態を使用して新しいワークフロー実行を開始することをお勧めします。方法は次のチュートリアル、「Step Functions API を使用して長時間実行されるワークフローを継続する (推奨)」で確認してください。

Lambda 関数を使用して、現在の実行を終了させる前に新しい実行を開始するステートマシンを作成できます。このアプローチにより、新しい実行で進行中の作業を継続できるため、大きなジョブを小さなワークフローに分割したり、ワークフローを無期限に実行したりできます。

このチュートリアルは、Step Functions で Lambda 関数を使用してループを繰り返す チュートリアルで説明した、ワークフローを変更する外部 Lambda 関数を使用する概念に基づいています。同じ Lambda 関数 (Iterator) を使用して、特定の回数ループを繰り返します。また、別の Lambda 関数を作成し、新しいワークフローの実行をスタートしたり、新しい実行をスタートするたびにカウントを減少させることができます。入力の実行回数を設定することにより、このステートマシンは終了し、指定された回数だけ実行を再開します。

作成するステートマシンは、次の状態を実装します。

都道府県 目的

ConfigureCount

Pass 状態は、作業の反復を進めるステップ Iterator Lambda 関数で使用される、countindex、および step 値を設定します。

Iterator

Task 状態は、Iterator Lambda 関数を参照します。

IsCountReached

Choice 関数からのブール値を使用する Iterator 状態は、ステートマシンがサンプルの作業を続行するか、ShouldRestart 状態に移行するかを決定します。

ExampleWork

Pass 状態は、実際の実装で作業を実行する Task 状態を表します。

ShouldRestart

Choice 状態は、ある実行を終了して別の実行を開始するか、単に終了するかを決定するために executionCount 値を使用します。

Restart

新しいステートマシンの実行をスタートする Lambda 関数を使用した Task状態。また、Iterator 関数と同様に、この関数はカウントを減らします。Restart 状態は、減少したカウント値を新しい実行の入力に渡します。

前提条件

開始する前に Lambda を使用する Step Functions ステートマシン状態の作成 チュートリアルを参照して、Lambda と Step Functions の使用方法に慣れておいてください。

ステップ 1: Lambda 関数を作成してカウントを反復する

注記

Step Functions で Lambda 関数を使用してループを繰り返す チュートリアルを完了している場合は、このステップをスキップして、その Lambda 関数を使用することができます。

このセクションと、Step Functions で Lambda 関数を使用してループを繰り返す チュートリアルでは、Lambda 関数を使用して、ステートマシンのループの反復回数のカウントを追跡する方法などを示します。

次の Lambda 関数は、countindexstep の入力値を受け取ります。これらの値を、更新された index と、continue というブール値を使用して返します。indexcount 未満の場合、Lambda 関数は continuetrue に設定します。

その後、ステートマシンは、continuetrue の場合に、アプリケーションロジックを実行する Choice 状態を実装し、continuefalse の場合に、ShouldRestart に移行します。

反復処理 Lambda 関数を作成する

  1. Lambda コンソールを開き、[関数の作成] を選択します。

  2. [関数の作成] ページで、[一から作成] を選択します。

  3. [ベーシック情報] セクションで、以下のように Lambda 関数を設定します。

    1. [Function name] (関数名) に Iterator と入力します。

    2. [ランタイム][Node.js 16.x] を選択します。

    3. ページのデフォルトの選択をすべて維持して、[関数を作成] を選択します。

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

      arn:aws:lambda:us-east-1:123456789012:function:Iterator
  4. Lambda 関数の以下のコードを、Lambda コンソールの [イテレーター] ページの [コードソース] セクションにコピーします。

    exports.handler = function iterator (event, context, callback) { let index = event.iterator.index; let step = event.iterator.step; let count = event.iterator.count; index = index + step; callback(null, { index, step, count, continue: index < count }) }

    このコードは、countindexstep の入力値を受け入れています。indexstep の値増分し、それらの値とブール値 continue を返します。indexcount 未満の場合、continue の値は true です。

  5. [デプロイ] を選択して、コードをデプロイします。

反復処理 Lambda 関数をテストする

Iterate 関数の動作を確認するには、関数を数値で実行します。Lambda 関数の反復を表す入力値を指定し、入力値別の出力を確認できます。

Lambda 関数をテストします。

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

  2. データ例を以下に置き換えます。

    { "Comment": "Test my Iterator function", "iterator": { "count": 10, "index": 5, "step": 1 } }

    これらの値は、反復でステートマシンから返される値を表します。Lambda 関数はインデックスを増分し、continuetrue として返します。インデックスが count 以上になると、continuefalse として返します。このテストでは、インデックスは既に 5 に増分されています。結果では、index6 に増分され、continuetrue に設定されます。

  3. [Create] (作成) を選択します。

  4. Lambda コンソールの [Iterator] (イテレーター) ページで、[TestIterator] が表示されていることを確認し、[Test] (テスト) を選択します。

    テストの結果がページの上部に表示されます。[Details] (詳細) を選択し、結果を確認します。

    { "index": 6, "step": 1, "count": 10, "continue": true }
    注記

    このテストで index9 に設定した場合、index10 に増分され、continuefalse になります。

ステップ 2: 新しい Step Functions の実行を開始する Lambda 関数を再開する

  1. Lambda コンソールを開き、[関数の作成] を選択します。

  2. [関数の作成] ページで、[一から作成] を選択します。

  3. [ベーシック情報] セクションで、以下のように Lambda 関数を設定します。

    1. [Function name] (関数名) に Restart と入力します。

    2. [ランタイム][Node.js 16.x] を選択します。

  4. ページのデフォルトの選択をすべて維持して、[関数を作成] を選択します。

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

    arn:aws:lambda:us-east-1:123456789012:function:Iterator
  5. Lambda 関数の以下のコードを、Lambda コンソールの [イテレーター] ページの [コードソース] (設定) セクションにコピーします。

    次のコードは、実行回数を減らし、減少した値を含め、ステートマシンの新しい実行をスタートします。

    var aws = require('aws-sdk'); var sfn = new aws.StepFunctions(); exports.restart = function(event, context, callback) { let StateMachineArn = event.restart.StateMachineArn; event.restart.executionCount -= 1; event = JSON.stringify(event); let params = { input: event, stateMachineArn: StateMachineArn }; sfn.startExecution(params, function(err, data) { if (err) callback(err); else callback(null,event); }); }
  6. [デプロイ] を選択して、コードをデプロイします。

ステップ 3: ステートマシンを作成する

これで 2 つの Lambda 関数を作成したので、ステートマシンを作成します。このステートマシンで、ShouldRestart および Restart 状態は、複数の実行で作業を分割する方法を示します。

例 ShouldRestart 選択状態

次の出力例に、ShouldRestartChoice 状態が示されています。この状態は、実行を再開すべきかどうかを決定します。

"ShouldRestart": { "Type": "Choice", "Choices": [ { "Variable": "$.restart.executionCount", "NumericGreaterThan": 1, "Next": "Restart" } ],

この $.restart.executionCount 値は、最初の実行の入力に含まれています。これは、Restart 関数が呼び出されるたびに 1 ずつ減らされ、それ以降の実行ごとに、入力に配置されます。

例 Restart タスク状態

次の出力例に、RestartTask 状態が示されています。この状態では、前のステップで作成した Lambda 関数を使用して、実行を再開し、カウントを減らして、スタートする残りの実行数を追跡します。

"Restart": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:Restart", "Next": "Done" },
ステートマシンを作成するには
  1. Step Functions コンソールを開き、[ステートマシンの作成] を選択します。

    重要

    ステートマシンが、前の ステップ 1ステップ 2 で作成した Lambda 関数と同じ AWS アカウントおよびリージョンにあることを確認します。

  2. [テンプレートを選択] ダイアログボックスで [空白] を選択します。

  3. [選択] を選択して、デザインモード で Workflow Studio を開きます。

  4. このチュートリアルでは、コードエディタ でステートマシンの Amazon ステートメント言語 (ASL) 定義を記述します。これを行うには、[コード] を選択します。

  5. 既存のボイラープレートコードを削除して、次のコードを貼り付けます。このコードの ARN を、作成した Lambda 関数の ARN に置き換えることに注意してください。

    { "Comment": "Continue-as-new State Machine Example", "StartAt": "ConfigureCount", "States": { "ConfigureCount": { "Type": "Pass", "Result": { "count": 100, "index": -1, "step": 1 }, "ResultPath": "$.iterator", "Next": "Iterator" }, "Iterator": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:Iterator", "ResultPath": "$.iterator", "Next": "IsCountReached" }, "IsCountReached": { "Type": "Choice", "Choices": [ { "Variable": "$.iterator.continue", "BooleanEquals": true, "Next": "ExampleWork" } ], "Default": "ShouldRestart" }, "ExampleWork": { "Comment": "Your application logic, to run a specific number of times", "Type": "Pass", "Result": { "success": true }, "ResultPath": "$.result", "Next": "Iterator" }, "ShouldRestart": { "Type": "Choice", "Choices": [ { "Variable": "$.restart.executionCount", "NumericGreaterThan": 0, "Next": "Restart" } ], "Default": "Done" }, "Restart": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:Restart", "Next": "Done" }, "Done": { "Type": "Pass", "End": true } } }
  6. ステートマシンの名前を指定します。これを行うには、MyStateMachine のデフォルトステートマシン名の横にある編集アイコンを選択します。次に、[ステートマシンの設定][ステートマシン名] ボックスに名前を指定します。

    このチュートリアルでは、名前として「ContinueAsNew」と入力します。

  7. (オプション) [ステートマシンの設定] で、ステートマシンのタイプや実行ロールなど、他のワークフロー設定を指定します。

    このチュートリアルでは、[ステートマシンの設定] のデフォルト設定をすべてそのまま使用します。

    ステートマシンに適切なアクセス許可を持つ IAM ロールを以前に作成していて、そのロールを使用する場合は、[アクセス許可][既存のロールを選択] を選択し、一覧からロールを選択します。または、[ロールの ARN を入力] を選択し、その IAM ロールの ARN を指定します。

  8. [ロールの作成を確認] ダイアログボックスで、[確認] を選択して続行します。

    [ロールの設定を表示] を選択して [ステートマシンの設定] に戻ることもできます。

    注記

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

  9. このステートマシンの Amazon リソースネーム (ARN) をテキストファイルに保存します。新しい Step Functions の実行を開始するには、Lambda 関数にアクセス許可を与えると同時に ARN を指定する必要があります。

ステップ 4: IAM ポリシーを変更する

Lambda 関数に新しい Step Functions 実行を開始する権限を確実に持つようにするには、Restart Lambda 関数で使用する IAM ロールにインラインポリシーをアタッチします。詳細については、「IAM ユーザーガイド」の「インラインポリシーの埋め込み」を参照してください。

注記

前の例の Resource 行を更新して、ContinueAsNew ステートマシンの ARN を参照することができます。これは、特定のステートマシンの実行のみをスタートできるようにポリシーを制限します。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "states:StartExecution" ], "Resource": "arn:aws:states:us-east-2:123456789012stateMachine:ContinueAsNew" } ] }

ステップ 5: ステートマシンを実行する

実行をスタートするには、ステートマシンの ARN と、新しい実行をスタートする回数 executionCount を含む入力を指定します。

  1. [ContinueAsNew] ページで、[実行を開始] を選択します。

    [実行を開始] ダイアログが表示されます。

  2. [実行を開始] ダイアログボックスで、以下の操作を行います。

    1. (オプション) 生成されたデフォルトを上書きするカスタム実行名を入力します。

      非 ASCII 名とログ記録

      Step Functions では、ステートマシン、実行、アクティビティ、ラベルに、ASCII 以外の文字を含む名前を使用できます。このような文字は Amazon CloudWatch では機能しないため、CloudWatch でメトリクスを追跡できるように ASCII 文字のみを使用することをお勧めします。

    2. [入力] ボックスに、次の JSON 入力を入力してワークフローを実行します。

      { "restart": { "StateMachineArn": "arn:aws:states:us-east-1:123456789012:stateMachine:ContinueAsNew", "executionCount": 4 } }
    3. ContinueAsNew ステートマシンの ARN を使用して、StateMachineArn フィールドを更新します。

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

    5. Step Functions コンソールから実行 ID のタイトルが付いたページが表示されます。このページは、[実行の詳細] ページと呼ばれます。このページでは、実行の進行中または完了後に実行結果を確認できます。

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

      [グラフビュー] に、4 回のうちの最初の実行が表示されます。完了する前に、Restart 状態がそのまま渡され、新しい実行をスタートします。

      4 つのうち最初の実行を示す実行図。

      この実行が完了すると、実行中の次の実行を確認できます。上部にある ContinueAsNew リンクを選択して、実行のリストを確認します。最近終了した実行と、Restart Lambda 関数が開始した進行中の実行の両方が表示されるはずです。

      すべての実行が完了すると、リストに 4 つの成功した実行が表示されます。最初の実行がスタートされると、選択した名前が表示され、その後の実行には生成された名前が付けられます。

      すべての実行が完了したことを示すスクリーンショットの例。