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

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

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

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

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

開始する前に、Step Functions ステートを作成マシンLambda の使用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. Eclipseデフォルトの実行ロールの変更で、基本的な Lambda アクセス権限で新しいロールを作成する

    4. [Create function] を選択します。

    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. [Deploy‬] (デプロイ) をクリックします。

ステップ 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. [Create] (作成) を選択します。

  5. リポジトリの []イテレータ[] ページで [] を選択しますTestLambda 関数をテストします。

    テストの結果は、実行結果タブ。

  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. を使用する場合タイプの場合は、デフォルトの選択を保持します。つまり、Standard

  4. 定義[] ペインで、次のコードを貼り付けますが、の ARN を置き換えます。前に作成した 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. [Next] (次へ) を選択します。

  7. 「」と入力します。名前[Name you state machine (ステートマシンIterateCount

    注記

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

    • 空白

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

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

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

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

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

  8. Eclipseアクセス許可で、新しいロールの作成

  9. [Create state machine] (ステートマシンの作成) をクリックします。

ステップ 4: 新しい実行のスタート

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

  1. リポジトリの []IterateCount[] ページで [] を選択します実行開始

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

  2. (オプション) 実行を識別するために、の実行名を名前ボックスに移動するとそのように表示されます。デフォルトでは、Step Functions は自動的に一意の実行名を生成します。

    注記

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

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

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

    
                            ステートマシンの実行

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

  4. (オプション)の詳細タブで、実行ステータスおよびのタイムスタンプStartedそしてEnd Time (終了時刻)実行の。

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

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