Step Functions で Lambda 関数を使用して新しい実行を継続する
ヒント
次のアプローチでは、Lambda 関数を使用して新しいワークフロー実行を開始します。Step Functions の Task 状態を使用して新しいワークフロー実行を開始することをお勧めします。方法は次のチュートリアル、「Step Functions API を使用して長時間実行されるワークフローを継続する (推奨)」で確認してください。
Lambda 関数を使用して、現在の実行を終了させる前に新しい実行を開始するステートマシンを作成できます。このアプローチにより、新しい実行で進行中の作業を継続できるため、大きなジョブを小さなワークフローに分割したり、ワークフローを無期限に実行したりできます。
このチュートリアルは、Step Functions で Lambda 関数を使用してループを繰り返す チュートリアルで説明した、ワークフローを変更する外部 Lambda 関数を使用する概念に基づいています。同じ Lambda 関数 (Iterator
) を使用して、特定の回数ループを繰り返します。また、別の Lambda 関数を作成し、新しいワークフローの実行をスタートしたり、新しい実行をスタートするたびにカウントを減少させることができます。入力の実行回数を設定することにより、このステートマシンは終了し、指定された回数だけ実行を再開します。
作成するステートマシンは、次の状態を実装します。
都道府県 | 目的 |
---|---|
|
|
|
|
|
Choice 関数からのブール値を使用する Iterator 状態は、ステートマシンがサンプルの作業を続行するか、ShouldRestart 状態に移行するかを決定します。 |
|
Pass 状態は、実際の実装で作業を実行する Task 状態を表します。 |
|
Choice 状態は、ある実行を終了して別の実行を開始するか、単に終了するかを決定するために executionCount 値を使用します。 |
|
新しいステートマシンの実行をスタートする Lambda 関数を使用した Task 状態。また、Iterator 関数と同様に、この関数はカウントを減らします。Restart 状態は、減少したカウント値を新しい実行の入力に渡します。 |
前提条件
開始する前に Lambda を使用する Step Functions ステートマシン状態の作成 チュートリアルを参照して、Lambda と Step Functions の使用方法に慣れておいてください。
ステップ 1: Lambda 関数を作成してカウントを反復する
注記
Step Functions で Lambda 関数を使用してループを繰り返す チュートリアルを完了している場合は、このステップをスキップして、その Lambda 関数を使用することができます。
このセクションと、Step Functions で Lambda 関数を使用してループを繰り返す チュートリアルでは、Lambda 関数を使用して、ステートマシンのループの反復回数のカウントを追跡する方法などを示します。
次の Lambda 関数は、count
、index
、step
の入力値を受け取ります。これらの値を、更新された index
と、continue
というブール値を使用して返します。index
が count
未満の場合、Lambda 関数は continue
を true
に設定します。
その後、ステートマシンは、continue
が true
の場合に、アプリケーションロジックを実行する Choice
状態を実装し、continue
が false
の場合に、ShouldRestart
に移行します。
反復処理 Lambda 関数を作成する
-
Lambda コンソール
を開き、[関数の作成] を選択します。 -
[関数の作成] ページで、[一から作成] を選択します。
-
[ベーシック情報] セクションで、以下のように Lambda 関数を設定します。
-
[Function name] (関数名) に
Iterator
と入力します。 -
[ランタイム] で [Node.js 16.x] を選択します。
-
ページのデフォルトの選択をすべて維持して、[関数を作成] を選択します。
Lambda 関数が作成されたら、ページの右上隅に表示されている Amazon リソースネーム (ARN) を記録します。例:
arn:aws:lambda:us-east-1:123456789012:function:Iterator
-
-
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 }) }
このコードは、
count
、index
、step
の入力値を受け入れています。index
をstep
の値増分し、それらの値とブール値continue
を返します。index
がcount
未満の場合、continue
の値はtrue
です。 -
[デプロイ] を選択して、コードをデプロイします。
反復処理 Lambda 関数をテストする
Iterate
関数の動作を確認するには、関数を数値で実行します。Lambda 関数の反復を表す入力値を指定し、入力値別の出力を確認できます。
Lambda 関数をテストします。
-
[Configure test event] (テストイベントの設定) ダイアログボックスで、[Create new test event] (新規テストイベントを作成) を選択し、[Event name] (イベント名) に
TestIterator
と入力します。 -
データ例を以下に置き換えます。
{ "Comment": "Test my Iterator function", "iterator": { "count": 10, "index": 5, "step": 1 } }
これらの値は、反復でステートマシンから返される値を表します。Lambda 関数はインデックスを増分し、
continue
をtrue
として返します。インデックスがcount
以上になると、continue
をfalse
として返します。このテストでは、インデックスは既に5
に増分されています。結果では、index
が6
に増分され、continue
がtrue
に設定されます。 -
[Create] (作成) を選択します。
-
Lambda コンソールの
[Iterator]
(イテレーター) ページで、[TestIterator] が表示されていることを確認し、[Test] (テスト) を選択します。テストの結果がページの上部に表示されます。[Details] (詳細) を選択し、結果を確認します。
{ "index": 6, "step": 1, "count": 10, "continue": true }
注記
このテストで
index
を9
に設定した場合、index
が10
に増分され、continue
がfalse
になります。
ステップ 2: 新しい Step Functions の実行を開始する Lambda 関数を再開する
-
Lambda コンソール
を開き、[関数の作成] を選択します。 -
[関数の作成] ページで、[一から作成] を選択します。
-
[ベーシック情報] セクションで、以下のように Lambda 関数を設定します。
-
[Function name] (関数名) に
Restart
と入力します。 -
[ランタイム] で [Node.js 16.x] を選択します。
-
-
ページのデフォルトの選択をすべて維持して、[関数を作成] を選択します。
Lambda 関数が作成されたら、ページの右上隅に表示されている Amazon リソースネーム (ARN) を記録します。例:
arn:aws:lambda:us-east-1:123456789012:function:Iterator
-
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); }); }
-
[デプロイ] を選択して、コードをデプロイします。
ステップ 3: ステートマシンを作成する
これで 2 つの Lambda 関数を作成したので、ステートマシンを作成します。このステートマシンで、ShouldRestart
および Restart
状態は、複数の実行で作業を分割する方法を示します。
例 ShouldRestart 選択状態
次の出力例に、ShouldRestart
Choice
状態が示されています。この状態は、実行を再開すべきかどうかを決定します。
"ShouldRestart": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.restart.executionCount",
"NumericGreaterThan": 1,
"Next": "Restart"
}
],
この $.restart.executionCount
値は、最初の実行の入力に含まれています。これは、Restart
関数が呼び出されるたびに 1 ずつ減らされ、それ以降の実行ごとに、入力に配置されます。
例 Restart タスク状態
次の出力例に、Restart
Task
状態が示されています。この状態では、前のステップで作成した Lambda 関数を使用して、実行を再開し、カウントを減らして、スタートする残りの実行数を追跡します。
"Restart": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-east-1:123456789012:function:Restart
",
"Next": "Done"
},
ステートマシンを作成するには
-
Step Functions コンソール
を開き、[ステートマシンの作成] を選択します。 [テンプレートを選択] ダイアログボックスで [空白] を選択します。
[選択] を選択して、デザインモード で Workflow Studio を開きます。
-
このチュートリアルでは、コードエディタ でステートマシンの Amazon ステートメント言語 (ASL) 定義を記述します。これを行うには、[コード] を選択します。
-
既存のボイラープレートコードを削除して、次のコードを貼り付けます。このコードの 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 } } } -
ステートマシンの名前を指定します。これを行うには、MyStateMachine のデフォルトステートマシン名の横にある編集アイコンを選択します。次に、[ステートマシンの設定] の [ステートマシン名] ボックスに名前を指定します。
このチュートリアルでは、名前として「
ContinueAsNew
」と入力します。 -
(オプション) [ステートマシンの設定] で、ステートマシンのタイプや実行ロールなど、他のワークフロー設定を指定します。
このチュートリアルでは、[ステートマシンの設定] のデフォルト設定をすべてそのまま使用します。
ステートマシンに適切なアクセス許可を持つ IAM ロールを以前に作成していて、そのロールを使用する場合は、[アクセス許可] で [既存のロールを選択] を選択し、一覧からロールを選択します。または、[ロールの ARN を入力] を選択し、その IAM ロールの ARN を指定します。
-
[ロールの作成を確認] ダイアログボックスで、[確認] を選択して続行します。
[ロールの設定を表示] を選択して [ステートマシンの設定] に戻ることもできます。
注記
Step Functions が作成した IAM ロールを削除すると、Step Functions を後で再作成することはできません。同様に、ロールを変更すると (例えば、IAM ポリシーのプリンシパルから Step Functions を削除するなど)、後で Step Functions でそれを元の設定に復元することはできません。
-
このステートマシンの 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
を含む入力を指定します。
-
[ContinueAsNew] ページで、[実行を開始] を選択します。
[実行を開始] ダイアログが表示されます。
-
[実行を開始] ダイアログボックスで、以下の操作を行います。
-
(オプション) 生成されたデフォルトを上書きするカスタム実行名を入力します。
非 ASCII 名とログ記録
Step Functions では、ステートマシン、実行、アクティビティ、ラベルに、ASCII 以外の文字を含む名前を使用できます。このような文字は Amazon CloudWatch では機能しないため、CloudWatch でメトリクスを追跡できるように ASCII 文字のみを使用することをお勧めします。
-
[入力] ボックスに、次の JSON 入力を入力してワークフローを実行します。
{ "restart": { "StateMachineArn": "
arn:aws:states:us-east-1:123456789012:stateMachine:ContinueAsNew
", "executionCount":4
} } -
ContinueAsNew
ステートマシンの ARN を使用して、StateMachineArn
フィールドを更新します。 -
[実行のスタート] を選択します。
-
Step Functions コンソールから実行 ID のタイトルが付いたページが表示されます。このページは、[実行の詳細] ページと呼ばれます。このページでは、実行の進行中または完了後に実行結果を確認できます。
実行結果を確認するには、[グラフビュー] で個々の状態を選択し、ステップの詳細 ペインの個々のタブを選択すると、入力、出力、定義などの各状態の詳細がそれぞれ表示されます。[実行の詳細] ページに表示できる実行情報の詳細については、「実行の詳細の概要」を参照してください。
[グラフビュー] に、4 回のうちの最初の実行が表示されます。完了する前に、
Restart
状態がそのまま渡され、新しい実行をスタートします。この実行が完了すると、実行中の次の実行を確認できます。上部にある ContinueAsNew リンクを選択して、実行のリストを確認します。最近終了した実行と、
Restart
Lambda 関数が開始した進行中の実行の両方が表示されるはずです。すべての実行が完了すると、リストに 4 つの成功した実行が表示されます。最初の実行がスタートされると、選択した名前が表示され、その後の実行には生成された名前が付けられます。
-