メニュー
AWS Step Functions
開発者ガイド

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

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

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

開始する前に、Lambda ステートマシンを作成する チュートリアルに目を通し、必要な IAM ロールが作成済みであること、Lambda と Step Functions の併用方法を理解したことを確認します。

ステップ 1: Lambda 関数を作成してカウントを反復する

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

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

Lambda 関数を作成する

  1. Lambda コンソールにサインインし、[Create function] を選択します。

  2. [Create function] セクションで、[Author from scratch] を選択します。

  3. [Author from scratch] セクションで、次のように Lambda 関数を設定します。

    1. [Name] に、「Iterator」と入力します。

    2. [Runtime] で、[Node.js 6.10] を選択します。

    3. [Role] で、[Choose an existing role] を選択します。

    4. [Existing role] で、「Lambda ステートマシンを作成する」チュートリアルで作成した Lambda ロールを選択します。

      注記

      作成した IAM ロールがリストに表示されない場合は、そのロールが Lambda に伝達されるまであと数分かかる場合があります。

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

      Lambda 関数が作成されたら、ページの右上隅に表示されているその Amazon リソースネーム (ARN) を記録します。以下に例を示します。

      arn:aws:lambda:us-east-1:123456789012:function:Iterator
  4. 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 }) }

    このコードは、countindexstep の入力値を受け入れています。indexstep の値増分し、それらの値とブール値 continue を返します。indexcount 未満の場合、continue の値は true です。

  5. [Save] を選択します。

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

数値を使用して Lambda 関数を実行し、関数の動作を確認します。Lambda 関数の反復を表す入力値を指定し、入力値別の出力を確認できます。

Lambda 関数をテストするには

  1. [Configure test event] ダイアログボックスで、[Create new test event] を選択し、[Event name] に「TestIterator」と入力します。

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

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

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

  3. [Create] を選択します。

  4. Lambda コンソールの [Iterator] ページで、[TestIterator] が表示されていることを確認し、[Test] (テスト) を選択します。

    テストの結果がページの上部に表示されます。[Details] (詳細) を選択し、結果を確認します。

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

    注記

    このテストで index を 9 に設定した場合、index が 10 に増分され、continuefalse になります。

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

ステートマシンを作成するには

  1. Step Functions コンソールにサインインし、[Create a state machine] を選択します。

    重要

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

  2. [Create a state machine] ページで、[Author from scratch] を選択します。[Give a name to your state machine] に、「IterateCount」と入力します。

    注記

    ステートマシン名の長さは 1~80 文字で、アカウントとリージョンに対して一意である必要があります。また、次の文字を含めることはできません。

    • 空白

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

    • 括弧 (< > { } [ ])

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

    • 制御文字 (\\u0000 - \\u001f or \\u007f - \\u009f)

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

  3. IAM ロールを作成または入力します。

    • Step Functions 用の新しい IAM ロールを作成するには、[自分のロールの作成] を選択し、[I acknowledge that Step Functions will create an IAM role which allows access to my Lambda functions (Step Functions が Lambda 関数へのアクセスを許可する IAM ロールを作成することに同意します)] を選択します。

    • Step Functions 用の IAM ロールを以前に作成している場合は、[IAM ロール ARN を指定します] を選択し、既存の [IAM ロール ARN] を入力します。

    注記

    Step Functions によって作成された IAM ロールを削除すると、Step Functions で後で再作成することはできません。同様に、ロールを変更すると (たとえば、IAM ポリシーのプリンシパルから Step Functions を削除するなど)、後で Step Functions でそれを元の設定に復元することはできません。

  4. 次のコードは、以下の状態のステートマシンを記述します。

    • ConfigureCount: countindexstep のデフォルト値を設定します。

      "ConfigureCount": { "Type": "Pass", "Result": { "count": 10, "index": 0, "step": 1 },
    • 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 状態になります。「タスク」を参照してください。

    • Done: 実行の最終状態。

    [Code] ペインで、前に作成した Lambda 関数の Amazon リソースネーム を使用して以下のステートマシンの定義を追加します。

    { "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 状態の Amazon リソースネーム を更新し、前に作成した Lambda を参照するようにします。Amazon ステートメント言語 の詳細については、「State Machine Structure」を参照してください。

  5. [Visual Workflow] のグラフを使用して、Amazon ステートメント言語 コードでステートマシンが正しく記述されていることを確認します。

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

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

    グラフが表示されない場合は、[Visual Workflow] ペインの 
       refresh
    を選択します。

  6. [Create State Machine] を選択します。

  7. [OK] を選択します。

    ステートマシンが作成され、確認ページが表示されます。

ステップ 4: 新しい実行を開始する

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

新しい実行を開始するには

  1. [IterateCount] ページで、[New execution] を選択します。

  2. (オプション) 実行を特定できるように、[Enter an execution name] (実行名を入力) ボックスでその ID を指定できます。ID を入力しない場合、Step Functions は自動的に一意の ID を生成します。

    注記

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

  3. [Start Execution] を選択します。

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

     ステートマシンの実行

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

  4. (省略可能) [Execution Details] セクションで、[Info] タブを選択して [Execution Status] および [Started] と [Closed] のタイムスタンプを確認します。

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

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