

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

# Step Functions で Lambda 関数を使用してループを繰り返す
<a name="tutorial-create-iterate-pattern-section"></a>

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

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

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

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

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

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

### Lambda 関数を作成するには
<a name="create-iterate-pattern-create-lambda-function"></a>

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

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

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

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

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

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

   1. [**関数の作成**] を選択してください。

1. 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
     })
   }
   ```

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

1. **[デプロイ]** をクリックします。

## ステップ 2: Lambda 関数をテストする
<a name="create-iterate-pattern-step-2"></a>

数値を使用して Lambda 関数を実行し、関数のオペレーションを確認します。Lambda 関数の反復を表す入力値を指定します。

### Lambda 関数をテストします。
<a name="create-iterate-pattern-test-lambda-function"></a>

1. **[テスト]** を選択します。

1. **[テストイベントの設定]** ダイアログボックスで、**[イベント名]** ボックスに `TestIterator` を入力します。

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

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

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

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

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

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

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

   ```
   {
     "index": 6,
     "step": 1,
     "count": 10,
     "continue": true
   }
   ```
**注記**  
`index` を `9` に設定して再度テストすると、`10` は `continue` に増分し、`index` は `false` になります。

## ステップ 3: ステートマシンを作成する
<a name="create-iterate-pattern-step-3"></a>

**Lambda コンソールを離れる前に…**  
Lambda 関数の ARN をコピーします。それをメモに貼り付けます。これは次のステップで必要になります。

次に、次の状態を持つステートマシンを作成します。
+ `ConfigureCount` - `count`、`index`、`step` のデフォルト値を設定します。
+ `Iterator` - 前に作成した Lambda 関数を参照し、`ConfigureCount` で設定した値を渡します。
+ `IsCountReached` - `Iterator` 関数から返された値に基づいて、ループを継続するか、`Done` 状態に進む選択状態。
+ `ExampleWork` - 実行する必要がある作業用のスタブ。この例では、ワークフローに `Pass` 状態がありますが、実際のソリューションでは、`Task` を使用する可能性があります。
+ `Done` - ワークフローの終了状態。

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

1. [Step Functions コンソール](https://console.aws.amazon.com/states/home)を開き、**[Create a state machine]** (ステートマシンの作成) を選択します。
**重要**  
ステートマシンは、Lambda 関数と同じ AWS アカウントとリージョンにある必要があります。

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

1. **[コード]** ペインで、ステートマシンを定義する次の JSON を貼り付けます。

   Amazon ステートメント言語の詳細については、[[State Machine Structure]](statemachine-structure.md) (ステートマシンの構造) を参照してください。

   ```
   {
       "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:region: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
             
           }
       }
   }
   ```

1. `Iterator Resource` フィールドを、前に作成した `Iterator` Lambda 関数の ARN に置き換えます。

1. **[設定]** を選択し、ステートマシンの **[名前]** (`IterateCount` など) を入力します。
**注記**  
ステートマシン、実行、およびアクティビティタスク名は 80 文字以下にする必要があります。これらの名前は、アカウントと AWS リージョンで一意である必要があり、次のいずれかを含めることはできません。  
空白
ワイルドカード文字 (`? *`)
角かっこ (`< > { } [ ]`)
特殊文字 (`" # % \ ^ | ~ ` $ & , ; : /`)
制御文字 (`\\u0000` - `\\u001f` または `\\u007f` - `\\u009f`)
Step Functions では、ステートマシン、実行、アクティビティ、ラベルに、ASCII 以外の文字を含む名前を使用できます。このような文字を使用すると Amazon CloudWatch がデータを記録できなくなるため、Step Functions のメトリクスを追跡できるように ASCII 文字のみを使用することをお勧めします。

1. **[タイプ]** で、デフォルト値の **[Standard]** を受け入れます。**[アクセス許可]** で、**[新しいロールを作成]** を選択します。

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

## ステップ 4: 新しい実行をスタートする
<a name="create-iterate-pattern-step-4"></a>

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

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

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

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

   ステートマシンの新しい実行がスタートされ、進行中の実行が表示されます。  
![\[進行中のステータスを示す青いイテレータの状態を示すステートマシンのグラフ。\]](http://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/images/tutorial-create-iterate-running.png)

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

   カウントがステートマシンの `ConfigureCount` 状態で設定した数に到達すると、実行が反復を完了して終了します。  
![\[イテレータと完了状態を緑色で示し、両方が成功したことを示すステートマシンのグラフ。\]](http://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/images/tutorial-create-iterate-done.png)