AWS Step Functions
開発者ガイド

新しい実行として続行

AWS Step Functions は一定の期間とステップ数のあるワークフローを実行するように設計されています。実行期間は 1 年間、最大 25,000 イベントに制限されています (「制限」を参照してください)。ただし、現在の実行を終了させる前に、新しい実行を開始する Lambda 関数を使用するステートマシンを作成できます。これにより、大きなジョブを小さなワークフローに分割するステートマシンや、無期限に実行するステートマシンを使用できます。

このチュートリアルは、Lambda を使用してループを反復する チュートリアルで説明した、ワークフローを変更する外部 Lambda 関数を使用する概念に基づいています。同じ Lambda 関数 (Iterator) を使用して、特定の回数ループを繰り返します。また、別の Lambda 関数を作成し、新しいワークフローの実行を開始したり、新しい実行を開始するたびにカウントを減少させることができます。入力の実行回数を設定することにより、このステートマシンは終了し、指定された回数だけ実行を再開します。

このチュートリアルでは、Lambda 関数を使用してステートマシンを作成する方法を示します。新しく実行を開始し、その新しい実行で進行中の作業を続行できます。


      ワークフローの概要

作成するステートマシンは、次の状態を実装します。

状態 目的
ConfigureCount

Pass 状態は、作業の反復を進める Iterator Lambda 関数で使用される、countindex、および step 値を設定します。

Iterator

Task 状態は、Iterator Lambda 関数を参照します。

IsCountReached Iterator 関数からのブール値を使用する Choice 状態は、ステートマシンが作業例を続行するか、ShouldRestart Choice 状態に移行するかを決定します。
ExampleWork この例では、ExampleWork は、実際の実装で作業を実行する Task 状態を表す Pass 状態です。
ShouldRestart Choice 状態は、1 つの実行を終了し、別の実行を開始するか、または単に終了するかを決定する executionCount 値を使用します。
Restart 新しいステートマシンの実行を開始する Lambda 関数を使用した Task 状態。また、Iterator 関数と同様に、この関数はカウントを減らします。この値は新しい実行の入力に渡されます。

前提条件

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

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

注記

Lambda を使用してループを反復する チュートリアルを完了している場合は、この手順をスキップして、その Lambda 関数を使用することができます。

このセクションと、Lambda を使用してループを反復する チュートリアルでは、ステートマシン内のループの反復回数を追跡するために、カウントを追跡する Lambda 関数をどのように使用できるかを示します。

次の Lambda 関数は、countindexstep の入力値を受け取ります。これらの値を、更新された index と、continue というブール値を使用して返します。indexcount 未満の場合、Lambda 関数は continuetrue に設定します。

その後、ステートマシンは、continuetrue の場合に、アプリケーションロジックを実行する Choice 状態を実装し、continuefalse の場合に、ShouldRestart に移行します。

Iterate 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] を選択します。

Iterate Lambda 関数をテストする

Iterate 関数の動作を確認するには、関数を数値で実行します。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 になります。

ステップ 2: 新しい Step Functions 実行を開始する Restart Lambda 関数を作成する

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

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

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

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

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

    4. [Existing role] で、前に作成した IAM ポリシーを含むロールを選択します。

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

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

      arn:aws:lambda:us-east-1:123456789012:function:Restart
  3. Lambda 関数の以下のコードを、Lambda コンソールの [Restart] ページの [Configuration] セクションにコピーします。

    次のコードは、実行回数を減らし、減少した値を含め、ステートマシンの新しい実行を開始します。

    var aws = require('aws-sdk'); var sfn = new aws.StepFunctions(); exports.restart = function(event, context, callback) { let StateMachineArn = event.restart.StateMachineArn; event.restart.executionCount -= 1; event = JSON.stringify(event); let params = { input: event, stateMachineArn: StateMachineArn }; sfn.startExecution(params, function(err, data) { if (err) callback(err); else callback(null,event); }); }
  4. [Save] を選択します。

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

これで 2 つの Lambda 関数を作成したので、ステートマシンを作成します。このステートマシンで、ShouldRestart および Restart 状態は、複数の実行で作業を分割する方法を示します。

ShouldRestart Choice 状態

このステートマシンの抜粋は、ShouldRestart Choice 状態を示しています。この状態は、実行を再開すべきかどうかを決定します。

"ShouldRestart": { "Type": "Choice", "Choices": [ { "Variable": "$.restart.executionCount", "NumericGreaterThan": 1, "Next": "Restart" } ],

この $.restart.executionCount 値は、最初の実行の入力に含まれています。これは、Restart 関数が呼び出されるたびに 1 ずつ減らされ、それ以降の実行ごとに、入力に配置されます。

Restart Task 状態

このステートマシンの抜粋は、Restart Task 状態を示しています。この状態では、前のステップで作成した Lambda 関数を使用して、実行を再開し、カウントを減らして、開始する残りの実行数を追跡します。

"Restart": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:Restart", "Next": "Done" },
  1. Step Functions コンソールで、[Create a state machine] を選択します。

  2. [Author from scratch] (一から作成) を選択して、ステートマシンの名前に ContinueAsNew を入力します。

  3. [IAM role for your state machine executions] で、Lambda 関数に使用する IAM ロールを選択します。

  4. 次の内容を Code ペインに入力します。

    ContinueAsNew ステートマシン

    { "Comment": "Continue-as-new State Machine Example", "StartAt": "ConfigureCount", "States": { "ConfigureCount": { "Type": "Pass", "Result": { "count": 100, "index": -1, "step": 1 }, "ResultPath": "$.iterator", "Next": "Iterator" }, "Iterator": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:Iterator", "ResultPath": "$.iterator", "Next": "IsCountReached" }, "IsCountReached": { "Type": "Choice", "Choices": [ { "Variable": "$.iterator.continue", "BooleanEquals": true, "Next": "ExampleWork" } ], "Default": "ShouldRestart" }, "ExampleWork": { "Comment": "Your application logic, to run a specific number of times", "Type": "Pass", "Result": { "success": true }, "ResultPath": "$.result", "Next": "Iterator" }, "ShouldRestart": { "Type": "Choice", "Choices": [ { "Variable": "$.restart.executionCount", "NumericGreaterThan": 0, "Next": "Restart" } ], "Default": "Done" }, "Restart": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:Restart", "Next": "Done" }, "Done": { "Type": "Pass", "End": true } } }
  5. 以前に作成したそれぞれの Lambda 関数を参照する Restart および Iterator 状態の Resource 文字列を更新します。

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

注記

このステートマシンの Amazon リソースネーム を保存します。

ステップ 4: IAM ポリシーを変更する

Lambda 関数に新しい Step Functions 実行を開始する権限が確実にあるようにするには、Restart Lambda 関数で使用する IAM ロールにインラインポリシーをアタッチします。詳細については、IAM ユーザーガイドの「インラインポリシーの埋め込み」を参照してください。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "states:StartExecution" ], "Resource": "*" } ] }

注記

前の例の "Resource": "*" 行を更新して、ContinueAsNew ステートマシンの ARN を参照することができます。これは、特定のステートマシンの実行のみを開始できるようにポリシーを制限します。

ステップ 5: 実行を実行する

実行を開始するには、ステートマシンの ARN と、新しい実行を開始する回数 executionCount を含む入力を指定します。

  1. [ContinueAsNew] ページで、[New execution] (新しい実行) を選択します。

  2. [New execution] (新しい実行) ページの、[Input] (入力) セクションで、実行名として Test1 と入力します。次に、[Input] (入力) に次のように入力します。

    { "restart": { "StateMachineArn": "arn:aws:states:us-east-1:123456789012:stateMachine:ContinueAsNew", "executionCount": 4 } }
  3. ContinueAsNew ステートマシンの Amazon リソースネーム を使用して、StateMachineArn フィールドを更新します。

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

[Visual Workflow] (ビジュアルワークフロー) グラフに、4 回のうちの最初の実行が表示されます。完了する前に、Restart 状態がそのまま渡され、新しい実行を開始します。


        4 回のうちの最初の実行

この実行が完了すると、実行中の次の実行を確認できます。上部にある [ContinueAsNew] リンクを選択して、実行のリストを確認します。最近閉じた実行と、Restart Lambda 関数が開始した実行中の実行の両方が表示されるはずです。


        1 つの実行が完了し、次の実行が実行されます。

すべての実行が完了すると、リストに 4 つの成功した実行が表示されます。最初の実行が開始されると、選択した名前が表示され、その後の実行には生成された名前が付けられます。


        すべての実行を完了しました。