「翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。」
Lambda を使用してループを反復する
このチュートリアルでは、ステートマシンと AWS Lambda 関数を使用してループを一定回数反復する設計パターンを実装します。
必要に応じて、この設計パターンを随時使用し、ステートマシンのループ数を追跡できます。この実装を使用すると、大規模なタスクや時間がかかる実行を小さいチャンクに分割したり、特定のイベント数の後で実行を終了させたりできます。同様の実装を使用して、時間がかかる実行を定期的に終了して再起動することで、AWS Step Functions や AWS Lambda などの AWS のサービスでサービスクォータ超過を防止できます。
開始する前に、Creating a Step Functions State Machine That Uses Lambda チュートリアルに目を通し、必要な IAM ロールが作成済みであること、Lambda と Step Functions の併用方法を理解したことを確認します。
トピック
ステップ 1: Lambda 関数を作成してカウントを反復する
Lambda 関数を使用することで、ステートマシンでのループの反復回数を追跡できます。次の Lambda 関数は、count
、index
、step
の入力値を受け取ります。次に、更新された index
と、continue
というブール値を持つこれらの値を返します。index
が count
未満の場合、Lambda 関数は continue
を true
に設定します。
その後、ステートマシンは、continue
が true
の場合に Choice
状態を実装し、false
の場合に終了します。
Lambda 関数を作成する
-
Lambda コンソール
にサインインし、[関数の作成] を選択します。 -
[Create function (関数の作成)] セクションで、[一から作成] を選択します。
-
[基本的な情報] セクションで、以下のように Lambda 関数を設定します。
-
[Function name (関数名)] に「
Iterator
」と入力します。 -
[ランタイム] で [Node.js 12.x] を選択します。
-
[Role (ロール)] で、[Use an existing role (既存のロールを使用)] を選択します。
-
[既存のロール] で、「Creating a Step Functions State Machine That Uses Lambda」チュートリアルで作成した Lambda ロールを選択します。
注記 作成した IAM ロールがリストに表示されない場合は、そのロールが Lambda に伝達されるまで、あと数分かかる場合があります。
-
[Create function] を選択します。
Lambda 関数が作成されたら、以下に示すように、ページの右上隅に表示されているその Amazon リソースネーム (ARN) を記録します。
arn:aws:lambda:us-east-1:123456789012:function:Iterator
-
-
Lambda 関数の以下のコードを、Lambda コンソールの [
Iterator
] ページの [Configuration] セクションにコピーします。exports.iterator = function iterator (event, context, callback) { let index = event.iterator.index let step = event.iterator.step let count = event.iterator.count index += step callback(null, { index, step, count, continue: index < count }) }
このコードは、
count
、index
、step
の入力値を受け入れています。index
をstep
の値増分し、それらの値とブール値continue
を返します。index
がcount
未満の場合、continue
の値はtrue
です。 -
[Save] を選択します。
ステップ 2: Lambda 関数をテストする
数値を使用して Lambda 関数を実行し、関数の動作を確認します。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
に設定されます。 -
[作成] を選択します。
-
Lambda コンソールの [
Iterator
] ページで、[TestIterator] が表示されていることを確認し、[Test] を選択します。テストの結果がページの上部に表示されます。[Details] (詳細) を選択し、結果を確認します。
{ "index": 6, "step": 1, "count": 10, "continue": true }
注記 このテストで
index
を9
に設定した場合、index
が10
に増分され、continue
がfalse
になります。
ステップ 3: ステートマシンを作成する
-
Step Functions コンソール
にサインインし、[ステートマシンの作成] を選択します。 重要 ステートマシンが、前に作成した Lambda 関数と同じ AWS アカウントおよびリージョンにあることを確認します。
-
[Define state machine (ステートマシンの定義)] ページで、[Author with code snippets (コードスニペットで作成)] を選択します。[タイプ] で、[標準] を選択します。[名前] に
IterateCount
と入力します。注記 ステートマシン、実行、およびアクティビティ名の長さは 1~80 文字で、アカウントと AWS リージョンに対して一意である必要があります。また、次の文字を含めることはできません。
-
空白
-
ワイルドカード文字 (
? *
) -
括弧 (
< > { } [ ]
) -
特殊文字 (
: ; , \ | ^ ~ $ # % & ` "
) -
制御文字 (
\\u0000
-\\u001f
or\\u007f
-\\u009f
)
Step Functions では、ASCII 以外の文字を含むステートマシン、実行、およびアクティビティの名前を作成することができます。これらの ASCII 以外の文字は Amazon CloudWatch では使用できません。CloudWatch メトリクスを追跡できるようにするには、ASCII 文字のみを使用する名前を選択します。
[Next (次へ)] を選択します。
-
-
IAM ロールを作成または入力します。
-
Step Functions の IAM ロールを作成するには、[自分用の IAM ロールを作成する] を選択し、[名前] にロール名を入力します。
-
ステートマシンの正しいアクセス許可を使用して IAM ロールをすでに作成済みである場合は、[Choose an existing IAM role (既存の IAM ロールを選択する)] を選択します。リストから ロールを選択するか、ロールの ARN を指定します。
注記 Step Functions によって作成された IAM ロールを削除すると、Step Functions は後で再作成することはできません。同様に、ロールを変更すると (たとえば、IAM ポリシーのプリンシパルから Step Functions を削除するなど)、後で Step Functions でそれを元の設定に復元することはできません。
-
-
次のコードは、以下の状態のステートマシンを記述します。
-
ConfigureCount
–count
、index
、step
のデフォルト値を設定します。"ConfigureCount": { "Type": "Pass", "Result": { "count": 10, "index": 0, "step": 1 }, "ResultPath": "$.iterator", "Next": "Iterator" },
-
Iterator
– 前に作成した Lambda 関数を参照し、ConfigureCount
で設定した値を渡します。"Iterator": { "Type": "Task", "Resource": "
arn:aws:lambda:us-east-1:123456789012:function:Iterate
", "ResultPath": "$.iterator", "Next": "IsCountReached" }, -
IsCountReached
–Iterator
Lambda 関数から返されるブール値に応じて、作業例を再実行するか、Done
に移行するかに分岐する Choice 状態。"IsCountReached": { "Type": "Choice", "Choices": [ { "Variable": "$.iterator.continue", "BooleanEquals": true, "Next": "ExampleWork" } ], "Default": "Done" },
-
ExampleWork
– 実行で達成する作業のスタブ。この例ではpass
状態です。実際の実装では、これはtask
状態になります。「Task」を参照してください。 -
Done
– 実行の最終状態。
[Code (コード)] ペインで、前に作成した Lambda 関数の Amazon リソースネーム (ARN) を使用して以下のステートマシンの定義を追加します。
{ "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
状態の ARN を更新し、前に作成した Lambda を参照するようにします。Amazon ステートメント言語 の詳細については、「State Machine Structure」を参照してください。 -
-
[Visual Workflow] のグラフを使用して、Amazon ステートメント言語 コードでステートマシンが正しく記述されていることを確認します。
次の図は、上記のステートマシンコードで表現されたロジックを示しています。
グラフが表示されない場合は、[Visual Workflow] ペインの
を選択します。
-
[次へ] を選択します。
-
IAM ロールを作成または入力します。
-
Step Functions の IAM ロールを作成するには、[自分用の IAM ロールを作成する] を選択し、[名前] にロール名を入力します。
-
ステートマシンの正しいアクセス許可を使用して IAM ロールをすでに作成済みである場合は、[Choose an existing IAM role (既存の IAM ロールを選択する)] を選択します。リストから ロールを選択するか、ロールの ARN を指定します。
注記 Step Functions によって作成された IAM ロールを削除すると、Step Functions は後で再作成することはできません。同様に、ロールを変更すると (たとえば、IAM ポリシーのプリンシパルから Step Functions を削除するなど)、後で Step Functions でそれを元の設定に復元することはできません。
-
-
[Create state machine (ステートマシンの作成)] をクリックします。
ステップ 4: 新しい実行を開始する
ステートマシンを作成した後、実行を開始できます。
-
[IterateCount] ページで、[New execution (新しい実行)] を選択します。
-
(オプション)実行を特定できるように、[Enter an execution name] (実行名を入力) ボックスでその ID を指定できます。ID を入力しない場合、Step Functions は自動的に一意の ID を生成します。
注記 Step Functions では、ASCII 以外の文字を含むステートマシン、実行、およびアクティビティの名前を作成することができます。これらの ASCII 以外の文字は Amazon CloudWatch では使用できません。CloudWatch メトリクスを追跡できるようにするには、ASCII 文字のみを使用する名前を選択します。
-
[Start Execution] を選択します。
ステートマシンの新しい実行が開始され、進行中の実行が表示されます。
実行は、Lambda 関数を使用してカウントを追跡しながら段階的に増分されます。反復ごとに、ステートマシンの
ExampleWork
状態で参照されている作業例が実行されます。 -
(省略可能) [Execution Details] セクションで、[Info] タブを選択して [Execution Status] および [Started] と [Closed] のタイムスタンプを確認します。
-
カウントがステートマシンの
ConfigureCount
状態で設定した数に到達すると、実行が反復を完了して終了します。