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. [関数の作成] ページで、[一から作成] を選択します。

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

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

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

    3. [デフォルトの実行ロールの変更] で、[基本的な Lambda アクセス許可で新しいロールを作成] を選択します。

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

  4. 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 }) }

    このコードは、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 関数はインデックスをインクリメントし、truecontinueインデックスがそれより小さくなると戻ります。countこのテストでは、インデックスは既に 5 に増分されています。テストはにインクリメントされ、に設定されますindex6 continue true

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

  5. [テスト] を選択して Lambda 関数をテストします。

    テストの結果は [実行結果] タブに表示されます。

  6. 実行結果を表示するには、[出力] タブを選択します。

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

    index9に設定して再度テストすると、indexはにインクリメントされ10continue、になります。false

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

Lambda コンソールを終了する前に...

Lambda 関数 ARN をコピーします。これをメモに貼り付けます。これは次のステップで必要になります。

次に、以下のステートを持つステートマシンを作成します。

  • ConfigureCountcountindex、のデフォルト値を設定しますstep

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

  • IsCountReached— 関数から返された値に基づいて、ループを継続するか、Doneステートに進む選択ステート。Iterator

  • ExampleWork— 実行する必要のある作業のスタブ。この例では、Passワークフローには状態がありますが、実際のソリューションではを使用するのが普通ですTask

  • Done— ワークフローの終了状態。

コンソールでステートマシンを作成するには:

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

    重要

    ステートマシンは Lambda AWS 関数と同じアカウントとリージョンにある必要があります。

  2. 空白のテンプレートを選択します

  3. コードペインに、ステートマシンを定義する次の 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 } } }
  4. Iterator Resourceフィールドを、前に作成した Iterator Lambda 関数の ARN に置き換えます。

  5. Config を選択し、ステートマシンの名前 (など) を入力しますIterateCount

    注記

    ステートマシン、実行、およびアクティビティタスク名は 80 文字以下にする必要があります。 AWS これらの名前はアカウントと地域で一意である必要があり、次のものを含んではいけません。

    • 空白

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

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

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

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

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

    Step Functions では、ステートマシン、実行、アクティビティの名前と、非 ASCII 文字を含むラベルを作成できます。これらの非ASCII名はAmazonでは機能しません。 CloudWatch CloudWatch メトリクスを追跡できるようにするには、ASCII 文字のみを使用する名前を選択してください。

  6. タイプ」には、「標準」のデフォルト値をそのまま使用します。[権限] で [新しいロールを作成] を選択します。

  7. [作成] を選択し、ロールの作成を確認します

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

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

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

  2. (オプション) 実行を識別するには、[名前] ボックスに名前を指定します。デフォルトでは、Step Functions は自動的に一意の実行名を生成します。

    注記

    Step Functions では、ステートマシン、実行、アクティビティの名前と、非 ASCII 文字を含むラベルを作成できます。これらの非ASCII名はAmazonでは機能しません。 CloudWatch CloudWatch メトリクスを追跡できるようにするには、ASCII 文字のみを使用する名前を選択してください。

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

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

    
                            ステートマシングラフビュー。Iterator の状態は青色で表示され、進行中であることを示します。

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

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

    
                                    ステートマシングラフビュー。Iterator 状態と Done 状態は緑色で表示され、どちらも成功していることを示します。