翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Step Functions で Lambda 関数を使用してループを繰り返す
このチュートリアルでは、ステートマシンと AWS Lambda 関数を使用してループを一定回数反復する設計パターンを実装します。
必要に応じて、この設計パターンを随時使用し、ステートマシンのループ数を追跡できます。この実装を使用すると、大規模なタスクや時間がかかる実行を小さいチャンクに分割したり、特定のイベント数の後で実行を終了させたりできます。同様の実装を使用して、時間がかかる実行を定期的に終了して再起動することで、AWS Step Functions や AWS Lambda などの AWS のサービスでサービスクォータ超過を防止できます。
開始する前に Lambda を使用する Step Functions ステートマシン状態の作成 チュートリアルを参照して、Lambda と Step Functions の使用方法に慣れておいてください。
ステップ 1: Lambda 関数を作成してカウントを反復する
Lambda 関数を使用することで、ステートマシンでのループの反復回数を追跡できます。次の Lambda 関数は、count
、index
、step
の入力値を受け取ります。次に、更新された index
と、continue
というブール値を持つこれらの値を返します。index
が count
未満の場合、Lambda 関数は continue
を true
に設定します。
その後、ステートマシンは、continue
が true
の場合に Choice
状態を実装し、false
の場合に終了します。
Lambda 関数を作成するには
-
[Lambda console]
(Lambda コンソール) にサインインし、[Create function] (関数の作成) を選択します。 -
[関数の作成] ページで、[一から作成] を選択します。
-
[ベーシック情報] セクションで、以下のように Lambda 関数を設定します。
-
[Function name] (関数名) に
Iterator
と入力します。 -
[ランタイム] で、[Node.js] を選択します。
-
[デフォルトの実行ロールの変更] で、[基本的な Lambda アクセス許可で新しいロールを作成] を選択します。
-
[Create function (関数の作成)] を選択します。
-
-
Lambda 関数の下記のコードを [コードソース] にコピーします。
export const handler = function (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
です。 -
[デプロイ] を選択します。
ステップ 2: Lambda 関数をテストする
数値を使用して Lambda 関数を実行し、関数のオペレーションを確認します。Lambda 関数の反復を表す入力値を指定します。
Lambda 関数をテストします。
-
[テスト] を選択します。
-
[テストイベントの設定] ダイアログボックスで、[イベント名] ボックスに
TestIterator
を入力します。 -
データ例を以下に置き換えます。
{ "Comment": "Test my Iterator function", "iterator": { "count": 10, "index": 5, "step": 1 } }
これらの値は、反復でステートマシンから返される値を表します。Lambda 関数はインデックスを増分し、インデックスが
count
より小さい場合にtrue
をcontinue
に返します。このテストでは、インデックスは既に5
に増分されています。テストはindex
を6
に増分し、continue
をtrue
に設定します。 -
[Create] (作成) を選択します。
-
[テスト] を選択して、Lambda 関数をテストします。
テストの結果は [実行結果] タブに表示されます。
-
実行結果を表示するには、[出力] タブを選択します。
{ "index": 6, "step": 1, "count": 10, "continue": true }
注記
index
を9
に設定して再度テストすると、10
はcontinue
に増分し、index
はfalse
になります。
ステップ 3: ステートマシンを作成する
Lambda コンソールを離れる前に…
Lambda 関数の ARN をコピーします。それをメモに貼り付けます。これは次のステップで必要になります。
次に、次の状態を持つステートマシンを作成します。
-
ConfigureCount
–count
、index
、step
のデフォルト値を設定します。 -
Iterator
– 前に作成した Lambda 関数を参照し、ConfigureCount
で設定した値を渡します。 -
IsCountReached
–Iterator
関数から返された値に基づいて、ループを継続するか、Done
状態に進む選択状態。 -
ExampleWork
– 実行する必要がある作業用のスタブ。この例では、ワークフローにPass
状態がありますが、実際のソリューションでは、Task
を使用する可能性があります。 -
Done
– ワークフローの終了状態。
コンソールで、ステートマシンを作成するには
-
Step Functions コンソール
を開き、[Create a state machine] (ステートマシンの作成) を選択します。 重要
ステートマシンは、Lambda 関数と同じ AWS アカウントとリージョンにある必要があります。
-
空白のテンプレートを選択します。
-
[コード] ペインで、ステートマシンを定義する次の JSON を貼り付けます。
Amazon ステートメント言語の詳細については、[State Machine Structure] (ステートマシンの構造) を参照してください。
{ "Comment": "Iterator State Machine Example", "StartAt": "ConfigureCount", "States": { "ConfigureCount": { "Type": "Pass", "Result": { "count": 10, "index": 0, "step": 1 }, "ResultPath": "$.iterator", "Next": "Iterator" }, "Iterator": { "Type": "Task", "Resource": "
arn:aws:lambda:us-east-1:123456789012:function:Iterate
", "ResultPath": "$.iterator", "Next": "IsCountReached" }, "IsCountReached": { "Type": "Choice", "Choices": [ { "Variable": "$.iterator.continue", "BooleanEquals": true, "Next": "ExampleWork" } ], "Default": "Done" }, "ExampleWork": { "Comment": "Your application logic, to run a specific number of times", "Type": "Pass", "Result": { "success": true }, "ResultPath": "$.result", "Next": "Iterator" }, "Done": { "Type": "Pass", "End": true } } } -
Iterator Resource
フィールドを、前に作成したIterator
Lambda 関数の ARN に置き換えます。 -
[設定] を選択し、ステートマシンの [名前] (
など) を入力します。IterateCount
注記
ステートマシン、実行、およびアクティビティタスク名は 80 文字以下にする必要があります。これらの名前はアカウントと AWS リージョンで一意である必要があり、以下のものを含めることはできません。
-
空白
-
ワイルドカード文字 (
? *
) -
角かっこ (
< > { } [ ]
) -
特殊文字 (
" # % \ ^ | ~ ` $ & , ; : /
) -
制御文字 (
\\u0000
-\\u001f
または\\u007f
-\\u009f
)
Step Functions では、ステートマシン、実行、アクティビティ、ラベルに、ASCII 以外の文字を含む名前を使用できます。このような文字は Amazon CloudWatch では機能しないため、CloudWatch でメトリクスを追跡できるように ASCII 文字のみを使用することをお勧めします。
-
-
[タイプ] で、デフォルト値の [Standard] を受け入れます。[アクセス許可] で、[新しいロールを作成] を選択します。
-
[作成] を選択し、ロールの作成を [確認] します。
ステップ 4: 新しい実行をスタートする
ステートマシンを作成した後、実行をスタートできます。
-
[IterateCount] ページで、[実行を開始] を選択します。
-
(オプション) 生成されたデフォルトを上書きするカスタム実行名を入力します。
非 ASCII 名とログ記録
Step Functions では、ステートマシン、実行、アクティビティ、ラベルに、ASCII 以外の文字を含む名前を使用できます。このような文字は Amazon CloudWatch では機能しないため、CloudWatch でメトリクスを追跡できるように ASCII 文字のみを使用することをお勧めします。
-
[実行のスタート] を選択します。
ステートマシンの新しい実行がスタートされ、進行中の実行が表示されます。
実行は、Lambda 関数を使用してカウントを追跡しながら段階的に増分されます。反復ごとに、ステートマシンの
ExampleWork
状態で参照されている作業例が実行されます。カウントがステートマシンの
ConfigureCount
状態で設定した数に到達すると、実行が反復を完了して終了します。