Lambda を使用してループを反復する - AWS Step Functions

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Lambda を使用してループを反復する

このチュートリアルでは、ステートマシンと AWS Lambda 関数を使用してループを一定回数反復する設計パターンを実装します。

必要に応じて、この設計パターンを随時使用し、ステートマシンのループ数を追跡できます。この実装を使用すると、大規模なタスクや時間がかかる実行を小さいチャンクに分割したり、特定のイベント数の後で実行を終了させたりできます。同様の実装を使用して、時間がかかる実行を定期的に終了して再起動することで、AWS Step Functions や AWS Lambda などの AWS のサービスでサービスクォータ超過を防止できます。

始める前に、以下に示すように、Lambda を使用するStep Functions ステートマシンの作成Lambda 関数とStep Functions を一緒に使用されていることを確認するチュートリアルです。

ステップ 1: Lambda 関数が作成してカウントを繰り返します。

Lambda 関数を使用することで、ステートマシンでのループの反復回数を追跡できます。次の Lambda 関数は、countindexstep の入力値を受け取ります。次に、更新された index と、continue というブール値を持つこれらの値を返します。indexcount 未満の場合、Lambda 関数は continuetrue に設定します。

その後、ステートマシンは、continuetrue の場合に Choice 状態を実装し、false の場合に終了します。

Lambda 関数を作成するには

  1. [Lambda console] (Lambda コンソール) にサインインし、[Create function] (関数の作成) を選択します。

  2. [Create function] ページで、[Author from scratch] を選択します。

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

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

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

    3. 既定の実行ロールを変更、選択してくださいLambda の基本権限が設定されている新しいロールが作成します。

    4. [機能の作成]を選択します。

    5. Lambda 関数が作成されたら、ページの右上隅に表示されているその Amazon リソースネーム (ARN) を記録します。ARN をコピーするには、をクリックします 
                                        copy Amazon Resource Name
                                    。ARN の例を次に示します。

      arn:aws:lambda:us-east-1:123456789012:function:Iterator
  4. 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. [デプロイ] をクリックします。

ステップ 2: Lambda 関数をテストする

数値を使用して Lambda 関数を実行し、関数のオペレーションを確認します。Lambda 関数の反復を表す入力値を指定し、入力値別にどんな出力となったか確認できます。

Lambda 関数をテストします。

  1. [テスト] を選択します。

  2. ではテストイベントの設定ダイアログボックス、入力TestIteratorイベントネームボックス。

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

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

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

  4. [作成] を選択します。

  5. 上にイテレータページ、選択テストLambda 関数をテストします。

    テストの結果は、以下に示すように、実行結果タブ。

  6. を選択します。実行結果タブをクリックして出力を表示します。

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

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

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

を使うStep Functions コンソール以下に示すように、ステートマシンが作成されたら、以下に示すように、ステートマシンが作成します。ステップ 1 で作成した Lambda 関数を記録します。

  • ConfigureCountcountindexstep のデフォルト値を設定します。

  • Iterator – 前に作成した Lambda 関数を参照し、ConfigureCount で設定した値を渡します。

  • IsCountReachedIterator Lambda 関数から返される ブール値に応じて、作業例を再実行するか、Done に移行するかに分岐する選択状態。

  • ExampleWork – 実行で達成したい作業のスタブ。この例では Pass 状態です。実際の実装では、これは Task 状態になります。

  • Done – 実行の最終状態。

  1. Step Functions コンソールを開き、[Create a state machine] (ステートマシンの作成) を選択します。

    重要

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

  2. オーサリング方法を選択ページ、選択ワークフローをコードで記述する

  3. にとってタイプデフォルトの選択はそのままにします。つまり、スタンダード

  4. 定義ペインに表示されているら、次のコードを貼りします。先ほど作成されているLambda 関数が作成されたら、ではResourceフィールド。

    { "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 } } }

    の ARN を必ず更新してくださいIterator上記の状態で、参照できるようにしてください。先ほど作成されているLambda 関数が作成されたら、

  5. [Visual Workflow] (ビジュアルワークフロー) ペインのグラフを使用して、Amazon ステートメント言語コードでステートマシンが正しく記述されていることをチェックします。

    次の図は、上記のステートマシンコードで表現されたロジックを示しています。

    
              ステートマシンワークフロー

    Amazon ステートメント言語の詳細については、[State Machine Structure] (ステートマシンの構造) を参照してください。

    グラフが表示されない場合は、[Visual Workflow] (ビジュアルワークフロー) ペインの 
       refresh
    を選択します。

  6. [次へ] をクリックします。

  7. a と入力します。[名前]ステートマシン用に、以下に示すようにIterateCount

    注記

    ステートマシン、実行、アクティビティの名前は 1~80 文字で、アカウントと AWS リージョンが一意である必要があり、以下のものを含めることはできません。

    • 空白

    • ワイルドカード文字 (? *)

    • 角かっこ (< > { } [ ])

    • 特殊文字 (: ; , \ | ^ ~ $ # % & ` ")

    • 制御文字 (\\u0000 - \\u001f または \\u007f - \\u009f)

    ステートマシンのタイプが Express の場合、ステートマシンを複数回実行するときに同じ名前を指定できます。Step Functions は、複数の実行が同じ名前であっても、Express ステートマシンの実行ごとに一意の実行 ARN を生成します。

    Step Functions では、非 ASCII 文字を含むステートマシン、実行、およびアクティビティ名を作成できます。ASCII 以外の名前は Amazon では使用できません。 CloudWatch。追跡できるようにするため CloudWatch メトリクスでは、ASCII 文字のみを使用する名前を選択します。

  8. パーミッション、選択新しいロールが作成されたら

  9. Create State Machine(ステートマシンの作成)を選択します。

ステップ 4: 新しい実行をスタートする

ステートマシンを作成した後、実行をスタートできます。

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

    ザ・実行開始ダイアログ・ボックスが表示されます。

  2. (オプション) 実行内容を記録します。[名前]ボックス。デフォルトでは、Step Functions は固有の実行名を自動的に生成します。

    注記

    Step Functions では、非 ASCII 文字を含むステートマシン、実行、およびアクティビティ名を作成できます。ASCII 以外の名前は Amazon では使用できません。 CloudWatch。追跡できるようにするため CloudWatch メトリクスでは、ASCII 文字のみを使用する名前を選択します。

  3. [Start Execution] (実行のスタート) を選択します。

    ステートマシンの新しい実行がスタートされ、進行中の実行が表示されます。

    
                            ステートマシンの実行

    実行は、Lambda 関数を使用してカウントを追跡しながら段階的に増分されます。反復ごとに、ステートマシンの ExampleWork 状態で参照されている作業例が実行されます。

  4. (オプション) [詳細] タブで、実行ステータスと、実行の開始時間終了時間のタイムスタンプを見ます。

    カウントがステートマシンの ConfigureCount 状態で設定した数に到達すると、実行が反復を完了して終了します。

    
                            ステートマシンの実行の完了