

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 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` 布林值的這些值。`true` 如果 `index` 小於 ，Lambda 函數會`continue`設定為 `count`。

您的狀態機器會實作 `Choice` 狀態，如果 `continue` 為 `true`，其將執行一些應用程式邏輯，如果為 `false` 則結束。

### 建立 Lambda 函數
<a name="create-iterate-pattern-create-lambda-function"></a>

1. 登入 [Lambda 主控台](https://console.aws.amazon.com/lambda/home)，然後選擇**建立函數**。

1. 在 **Create function (建立函數)** 頁面上，選擇 **Author from scratch (從頭開始撰寫)**。

1. 在**基本資訊**區段中，設定您的 Lambda 函數，如下所示：

   1. 針對**函數名稱**，請輸入 `Iterator`。

   1. 針對 **Runtime** (執行時間)，選擇 **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`。這會將 `step` 的值增量 `index`，並傳回這些值及布林值 `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 函數將遞增索引，並在索引小於 `true``continue`時傳回 `count`。對於此測試，索引已經增加到 `5`。測試將遞增`index`至 ，`6`並將 `continue`設定為 `true`。

1. 選擇**建立**。

1. 選擇**測試**以測試 Lambda 函數。

   測試結果會顯示在**執行結果**索引標籤中。

1. 選擇**執行結果**索引標籤以查看輸出。

   ```
   {
     "index": 6,
     "step": 1,
     "count": 10,
     "continue": true
   }
   ```
**注意**  
如果您`index`將 設定為 `9`並再次測試，則 會`index`遞增至 `10`，並將`continue`是 `false`。

## 步驟 3：建立狀態機器
<a name="create-iterate-pattern-step-3"></a>

**在您離開 Lambda 主控台之前...**  
複製 Lambda 函數 ARN。將它貼到筆記中。下一個步驟將需要此值。

接著，您將建立具有下列狀態的狀態機器：
+ `ConfigureCount` – 設定 `count`、 `index`和 的預設值`step`。
+ `Iterator` – 參考您先前建立的 Lambda 函數，傳入在 中設定的值`ConfigureCount`。
+ `IsCountReached` – 根據函數傳回的值，繼續循環或繼續進入 `Done` 狀態的選擇狀態`Iterator`。
+ `ExampleWork` – 需要完成之工作的 stub。在此範例中，工作流程具有 `Pass` 狀態，但在實際解決方案中，您可能會使用 `Task`。
+ `Done` – 工作流程的結束狀態。

若要在主控台中建立狀態機器：

1. 開啟 [Step Functions 主控台](https://console.aws.amazon.com/states/home)，然後選擇**建立狀態機器**。
**重要**  
您的狀態機器必須與 Lambda 函數位於相同的 AWS 帳戶和區域。

1. 選取**空白**範本。

1. 在**程式碼**窗格中，貼上下列定義狀態機器的 JSON。

   如需 Amazon States Language 的詳細資訊，請參閱[狀態機器結構](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. 選取 **Config**，然後輸入狀態機器**的名稱**，例如 `IterateCount`。
**注意**  
狀態機器、執行和活動任務的名稱長度不得超過 80 個字元。這些名稱對於您的帳戶和 AWS 區域必須是唯一的，且不得包含下列任何項目：  
空格
萬用字元 (`? *`)
括號字元 (`< > { } [ ]`)
特殊字元 (`" # % \ ^ | ~ ` $ & , ; : /`)
控制字元 (`\\u0000` - `\\u001f`或 `\\u007f` - `\\u009f`)。
Step Functions 接受包含非 ASCII 字元的狀態機器、執行、活動和標籤名稱。由於這類字元會阻止 Amazon CloudWatch 記錄資料，我們建議您僅使用 ASCII 字元，以便您可以追蹤 Step Functions 指標。

1. 對於**類型**，接受**標準**預設值。針對**許可**，選擇**建立新角色**。

1. 選擇**建立**，然後選擇**確認**角色建立。

## 步驟 4：開始新的執行
<a name="create-iterate-pattern-step-4"></a>

建立狀態機器後，您就可以開始執行。

1. 在 **IterateCount** 頁面上，選擇**開始執行**。

1. （選用） 輸入自訂執行名稱以覆寫產生的預設值。
**非 ASCII 名稱和記錄**  
Step Functions 接受包含非 ASCII 字元的狀態機器、執行、活動和標籤名稱。由於這類字元會阻止 Amazon CloudWatch 記錄資料，我們建議您僅使用 ASCII 字元，以便您可以追蹤 Step Functions 指標。

1. 選擇 **Start Execution (開始執行)**。

   狀態機器的新執行隨即開始，顯示您正在執行的執行。  
![\[狀態機器圖顯示藍色迭代器狀態，指出進行中狀態。\]](http://docs.aws.amazon.com/zh_tw/step-functions/latest/dg/images/tutorial-create-iterate-running.png)

   執行會逐步遞增，使用 Lambda 函數追蹤計數。每次反覆運算時，其會執行在狀態機器中以 `ExampleWork` 狀態參考的範例工作。

   計數達到狀態機器中指定的 `ConfigureCount` 狀態的數量後，執行會結束反覆運算並退出。  
![\[狀態機器圖顯示迭代器和完成狀態為綠色，表示兩者都成功。\]](http://docs.aws.amazon.com/zh_tw/step-functions/latest/dg/images/tutorial-create-iterate-done.png)