

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

# Step Functions で Lambda 関数を使用して新しい実行を継続する
<a name="tutorial-use-lambda-cont-exec"></a>

**ヒント**  
次のアプローチでは、Lambda 関数を使用して新しいワークフロー実行を開始します。Step Functions の Task 状態を使用して新しいワークフロー実行を開始することを**お勧め**します。方法は次のチュートリアル、「**[Step Functions API を使用して長時間実行されるワークフローを継続する (推奨)](tutorial-continue-new.md)**」で確認してください。

Lambda 関数を使用して、現在の実行を終了させる前に新しい実行を開始するステートマシンを作成できます。このアプローチにより、新しい実行で進行中の作業を継続できるため、大きなジョブを小さなワークフローに分割したり、ワークフローを無期限に実行したりできます。

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

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


| State | 目的 | 
| --- | --- | 
| `ConfigureCount` |  `Pass` 状態は、作業の反復を進めるステップ `Iterator` Lambda 関数で使用される、`count`、`index`、および `step` 値を設定します。  | 
|  `Iterator`  |  `Task` 状態は、`Iterator` Lambda 関数を参照します。  | 
| `IsCountReached` | Choice 関数からのブール値を使用する Iterator 状態は、ステートマシンがサンプルの作業を続行するか、ShouldRestart 状態に移行するかを決定します。 | 
| `ExampleWork` | Pass 状態は、実際の実装で作業を実行する Task 状態を表します。 | 
| `ShouldRestart` | Choice 状態は、ある実行を終了して別の実行を開始するか、単に終了するかを決定するために executionCount 値を使用します。 | 
| `Restart` | 新しいステートマシンの実行をスタートする Lambda 関数を使用した Task状態。また、Iterator 関数と同様に、この関数はカウントを減らします。Restart 状態は、減少したカウント値を新しい実行の入力に渡します。 | 

## 前提条件
<a name="tutorial-continue-new-prereq"></a>

開始する前に [Lambda を使用する Step Functions ステートマシン状態の作成](tutorial-creating-lambda-state-machine.md) チュートリアルを参照して、Lambda と Step Functions の使用方法に慣れておいてください。

## ステップ 1: Lambda 関数を作成してカウントを反復する
<a name="tutorial-continue-new-step-1"></a>

**注記**  
[Step Functions で Lambda 関数を使用してループを繰り返す](tutorial-create-iterate-pattern-section.md) チュートリアルを完了している場合は、このステップをスキップして、その Lambda 関数を使用することができます。

このセクションと、[Step Functions で Lambda 関数を使用してループを繰り返す](tutorial-create-iterate-pattern-section.md) チュートリアルでは、Lambda 関数を使用して、ステートマシンのループの反復回数のカウントを追跡する方法などを示します。

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

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

### 反復処理 Lambda 関数を作成する
<a name="tutorial-continue-new-create-lambda-function"></a>

1. [Lambda コンソール](https://console.aws.amazon.com/lambda/home)を開き、**[関数の作成]** を選択します。

1. **[関数の作成]** ページで、**[一から作成]** を選択します。

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

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

   1. **[ランタイム]** で **[Node.js 16.x]** を選択します。

   1. ページのデフォルトの選択をすべて維持して、**[関数を作成]** を選択します。

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

      ```
      arn:aws:lambda:region:123456789012:function:Iterator
      ```

1. Lambda 関数の以下のコードを、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
     })
   }
   ```

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

1. **[デプロイ]** を選択して、コードをデプロイします。

### 反復処理 Lambda 関数をテストする
<a name="tutorial-continue-new-step-1-test"></a>

`Iterate` 関数の動作を確認するには、関数を数値で実行します。Lambda 関数の反復を表す入力値を指定し、入力値別の出力を確認できます。

#### Lambda 関数をテストします。
<a name="tutorial-continue-new-test-lambda-function"></a>

1. **[Configure test event]** (テストイベントの設定) ダイアログボックスで、**[Create new test event]** (新規テストイベントを作成) を選択し、**[Event name]** (イベント名) に `TestIterator` と入力します。

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

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

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

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

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

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

   ```
   {
     "index": 6,
     "step": 1,
     "count": 10,
     "continue": true
   }
   ```
**注記**  
このテストで `index` を `9` に設定した場合、`index` が `10` に増分され、`continue` が `false` になります。

## ステップ 2: 新しい Step Functions の実行を開始する Lambda 関数を再開する
<a name="tutorial-continue-new-step-3"></a>

1. [Lambda コンソール](https://console.aws.amazon.com/lambda/home)を開き、**[関数の作成]** を選択します。

1. **[関数の作成]** ページで、**[一から作成]** を選択します。

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

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

   1. **[ランタイム]** で **[Node.js 16.x]** を選択します。

1. ページのデフォルトの選択をすべて維持して、**[関数を作成]** を選択します。

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

   ```
   arn:aws:lambda:region:123456789012:function:Iterator
   ```

1. Lambda 関数の以下のコードを、Lambda コンソールの ***[イテレーター]*** ページの **[コードソース]** (設定) セクションにコピーします。

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

   ```
   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);
     });
   
   }
   ```

1. **[デプロイ]** を選択して、コードをデプロイします。

## ステップ 3: ステートマシンを作成する
<a name="tutorial-continue-new-step-4"></a>

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

**Example ShouldRestart 選択状態**  
次の出力例に、`ShouldRestart``Choice` 状態が示されています。この状態は、実行を再開すべきかどうかを決定します。  

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

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

**Example Restart タスク状態**  
次の出力例に、`Restart``Task` 状態が示されています。この状態では、前のステップで作成した Lambda 関数を使用して、実行を再開し、カウントを減らして、スタートする残りの実行数を追跡します。  

```
"Restart": {
  "Type": "Task",
  "Resource": "arn:aws:lambda:region:123456789012:function:Restart",
  "Next": "Done"
},
```

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

1. [Step Functions コンソール](https://console.aws.amazon.com/states/home)を開き、メニューから **[ステートマシン]** を選択したら、**[ステートマシンの作成]** を選択します。
**重要**  
ステートマシンが、ステップ [1 とステップ](#tutorial-continue-new-step-1) [2](#tutorial-continue-new-step-3) で先ほど作成した Lambda 関数と同じ AWS アカウントとリージョンにあることを確認します。

1. **[空白から作成]** を選択します。

1. ステートマシンに名前を付け、**[続行]** を選択して Workflow Studio でステートマシンを編集します。

1. このチュートリアルでは、[コードエディタ](workflow-studio.md#wfs-interface-code-editor) でステートマシンの [Amazon States Language](concepts-amazon-states-language.md) (ASL) 定義を記述します。これを行うには、**[コード]** を選択します。

1. 既存のボイラープレートコードを削除して、次のコードを貼り付けます。このコードの ARN を、作成した Lambda 関数の ARN に置き換えることに注意してください。

   ```
   {
       "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:region: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:region:123456789012:function:Restart",
             "Next": "Done"
           },
           "Done": {
               "Type": "Pass",
               "End": true 
           }
       }
   }
   ```

1. ステートマシンの名前を指定します。これを行うには、**MyStateMachine** のデフォルトステートマシン名の横にある編集アイコンを選択します。次に、**[ステートマシンの設定]** の **[ステートマシン名]** ボックスに名前を指定します。

   このチュートリアルでは、名前として「**ContinueAsNew**」と入力します。

1. (オプション) **[ステートマシンの設定]** で、ステートマシンのタイプや実行ロールなど、他のワークフロー設定を指定します。

   このチュートリアルでは、**[ステートマシンの設定]** のデフォルト設定をすべてそのまま使用します。

   ステートマシンに適切なアクセス許可を持つ [IAM ロールを以前に作成](procedure-create-iam-role.md)していて、そのロールを使用する場合は、**[アクセス許可]** で **[既存のロールを選択]** を選択し、一覧からロールを選択します。または、**[ロールの ARN を入力]** を選択し、その IAM ロールの ARN を指定します。

1. **[ロールの作成を確認]** ダイアログボックスで、**[確認]** を選択して続行します。

   **[ロールの設定を表示]** を選択して **[ステートマシンの設定]** に戻ることもできます。
**注記**  
Step Functions が作成した IAM ロールを削除すると、Step Functions を後で再作成することはできません。同様に、ロールを変更すると (例えば、IAM ポリシーのプリンシパルから Step Functions を削除するなど)、後で Step Functions でそれを元の設定に復元することはできません。

1. このステートマシンの Amazon リソースネーム (ARN) をテキストファイルに保存します。新しい Step Functions の実行を開始するには、Lambda 関数にアクセス許可を与えると同時に ARN を指定する必要があります。

## ステップ 4: IAM ポリシーを変更する
<a name="tutorial-continue-new-step-2"></a>

Lambda 関数に新しい Step Functions 実行を開始する権限を確実に持つようにするには、`Restart` Lambda 関数で使用する IAM ロールにインラインポリシーをアタッチします。詳細については、「IAM ユーザーガイド**」の「[インラインポリシーの埋め込み](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#embed-inline-policy-console)」を参照してください。

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

****  

```
{
 "Version":"2012-10-17",		 	 	 
 "Statement": [
     {
         "Sid": "VisualEditor0",
         "Effect": "Allow",
         "Action": [
             "states:StartExecution"
         ],
         "Resource": "arn:aws:states:us-east-2:123456789012:stateMachine:ContinueAsNew"
     }
 ]
}
```

## ステップ 5: ステートマシンを実行する
<a name="tutorial-continue-new-step-5"></a>

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

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

   **[実行を開始]** ダイアログが表示されます。

1. **[実行を開始]** ダイアログボックスで、以下の操作を行います。

   1. (オプション) 生成されたデフォルトを上書きするカスタム実行名を入力します。
**非 ASCII 名とログ記録**  
Step Functions では、ステートマシン、実行、アクティビティ、ラベルに、ASCII 以外の文字を含む名前を使用できます。このような文字を使用すると Amazon CloudWatch がデータを記録できなくなるため、Step Functions のメトリクスを追跡できるように ASCII 文字のみを使用することをお勧めします。

   1. **[入力]** ボックスに、次の JSON 入力を入力してワークフローを実行します。

      ```
      {
        "restart": {
          "StateMachineArn": "arn:aws:states:region:account-id:stateMachine:ContinueAsNew",
          "executionCount": 4
        }
      }
      ```

   1. `ContinueAsNew` ステートマシンの ARN を使用して、`StateMachineArn` フィールドを更新します。

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

   1. Step Functions コンソールから実行 ID のタイトルが付いたページが表示されます。このページは、*[実行の詳細]* ページと呼ばれます。このページでは、実行の進行中または完了後に実行結果を確認できます。

      実行結果を確認するには、**[グラフビュー]** で個々の状態を選択し、[ステップの詳細](concepts-view-execution-details.md#exec-details-intf-step-details) ペインの個々のタブを選択すると、入力、出力、定義などの各状態の詳細がそれぞれ表示されます。*[実行の詳細]* ページに表示できる実行情報の詳細については、「[実行の詳細の概要](concepts-view-execution-details.md#exec-details-interface-overview)」を参照してください。

      **[グラフビュー]** に、4 回のうちの最初の実行が表示されます。完了する前に、`Restart` 状態がそのまま渡され、新しい実行をスタートします。  
![\[4 つのうち最初の実行を示す実行図。\]](http://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/images/execution-test1.png)

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

      すべての実行が完了すると、リストに 4 つの成功した実行が表示されます。最初の実行がスタートされると、選択した名前が表示され、その後の実行には生成された名前が付けられます。  
![\[すべての実行が完了したことを示すスクリーンショットの例。\]](http://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/images/execution-test1-complete.png)