

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

# 在 Step Functions 中使用 Lambda 函數處理批次資料
<a name="tutorial-itembatcher-param-task"></a>

在本教學課程中，您會使用*分散式地圖狀態*[ItemBatcher （地圖）](input-output-itembatcher.md)的 欄位來處理 Lambda 函數內的整批項目。每個批次最多包含三個項目。*分散式映射狀態*會啟動四個子工作流程執行，每個執行會處理三個項目，而一個執行會處理單一項目。每個子工作流程執行都會叫用 Lambda 函數，以反覆運算批次中存在的個別項目。

您將建立狀態機器，在整數陣列上執行乘法。假設您作為輸入提供的整數陣列是 ，`[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]`而乘數因數是 `7`。然後，在將這些整數乘以係數 7 之後形成的陣列將是 `[7, 14, 21, 28, 35, 42, 49, 56, 63, 70]`。

## 步驟 1：建立狀態機器
<a name="itembatcher-param-task-create-state-machine"></a>

在此步驟中，您會建立狀態機器的工作流程原型，將整批資料傳遞至您將在[步驟 2](#itembatcher-param-task-config-resource) 中建立的 Lambda 函數。
+ 使用以下定義，使用 [Step Functions 主控台](https://console.aws.amazon.com/states/home?region=us-east-1#/)建立狀態機器。如需有關建立狀態機器的資訊，請參閱《 [開始使用分散式地圖狀態](tutorial-map-distributed.md)教學[步驟 1：建立工作流程原型](tutorial-map-distributed.md#use-dist-map-create-workflow)》中的 。

  在此狀態機器中，您可以定義*分散式映射狀態*，接受 10 個整數的陣列做為輸入，並以 的批次將此陣列傳遞給 Lambda 函數`3`。Lambda 函數會逐一查看批次中存在的個別項目，並傳回名為 的輸出陣列`multiplied`。輸出陣列包含對輸入陣列中傳遞的項目執行的乘法結果。
**重要**  
請務必將下列程式碼中 Lambda 函數的 Amazon Resource Name (ARN) 取代為您將在[步驟 2 ](#itembatcher-param-task-config-resource)中建立之函數的 ARN。

  ```
  {
    "StartAt": "Pass",
    "States": {
      "Pass": {
        "Type": "Pass",
        "Next": "Map",
        "Result": {
          "MyMultiplicationFactor": 7,
          "MyItems": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
        }
      },
      "Map": {
        "Type": "Map",
        "ItemProcessor": {
          "ProcessorConfig": {
            "Mode": "DISTRIBUTED",
            "ExecutionType": "STANDARD"
          },
          "StartAt": "Lambda Invoke",
          "States": {
            "Lambda Invoke": {
              "Type": "Task",
              "Resource": "arn:aws:states:::lambda:invoke",
              "OutputPath": "$.Payload",
              "Parameters": {
                "Payload.$": "$",
                "FunctionName": "arn:aws:lambda:region:account-id:function:functionName"
              },
              "Retry": [
                {
                  "ErrorEquals": [
                    "Lambda.ServiceException",
                    "Lambda.AWSLambdaException",
                    "Lambda.SdkClientException",
                    "Lambda.TooManyRequestsException"
                  ],
                  "IntervalSeconds": 2,
                  "MaxAttempts": 6,
                  "BackoffRate": 2
                }
              ],
              "End": true
            }
          }
        },
        "End": true,
        "Label": "Map",
        "MaxConcurrency": 1000,
        "ItemBatcher": {
          "MaxItemsPerBatch": 3,
          "BatchInput": {
            "MyMultiplicationFactor.$": "$.MyMultiplicationFactor"
          }
        },
        "ItemsPath": "$.MyItems"
      }
    }
  }
  ```

## 步驟 2：建立 Lambda 函數
<a name="itembatcher-param-task-config-resource"></a>

在此步驟中，您會建立 Lambda 函數來處理批次中傳遞的所有項目。

**重要**  
確保您的 Lambda 函數與您的 AWS 區域 狀態機器位於相同的 下。

**建立 Lambda 函數**

1. 使用 [Lambda 主控台](https://console.aws.amazon.com/lambda/home)建立名為 的 **Python** Lambda 函數**ProcessEntireBatch**。如需有關建立 Lambda 函數的資訊，請參閱《 [開始使用分散式地圖狀態](tutorial-map-distributed.md)教學》中的[步驟 4：設定 Lambda 函數](tutorial-map-distributed.md#use-dist-map-config-resource)。

1. 複製 Lambda 函數的下列程式碼，並將其貼到 Lambda 函數的**程式碼來源**區段。

   ```
   import json
   
   def lambda_handler(event, context):
       multiplication_factor = event['BatchInput']['MyMultiplicationFactor']
       items = event['Items']
       
       results = [multiplication_factor * item for item in items]
       
       return {
           'statusCode': 200,
           'multiplied': results
       }
   ```

1. 建立 Lambda 函數後，複製頁面右上角顯示的函數 ARN。以下是範例 ARN，其中 *`function-name`*是 Lambda 函數的名稱 （在此情況下為 `ProcessEntireBatch`)：

   ```
   arn:aws:lambda:region:123456789012:function:function-name
   ```

   您需要在步驟 [1 ](#itembatcher-param-task-create-state-machine)中建立的狀態機器中提供函數 ARN。

1. 選擇**部署**以部署變更。

## 步驟 3：執行狀態機器
<a name="itembatcher-param-task-run-state-machine"></a>

當您執行[狀態機器](#itembatcher-param-task-create-state-machine)時，*分散式映射狀態*會啟動四個子工作流程執行，其中每個執行會處理三個項目，而一個執行會處理單一項目。

下列範例顯示其中一個子工作流程執行傳遞至[`ProcessEntireBatch`](#itembatcher-param-task-config-resource)函數的資料。

```
{
  "BatchInput": {
    "MyMultiplicationFactor": 7
  },
  "Items": [1, 2, 3]
}
```

鑑於此輸入，下列範例顯示 Lambda 函數傳回`multiplied`的名為 的輸出陣列。

```
{
  "statusCode": 200,
  "multiplied": [7, 14, 21]
}
```

狀態機器會傳回下列輸出，其中包含針對四個子工作流程執行命名`multiplied`的四個陣列。這些陣列包含個別輸入項目的乘法結果。

```
[
  {
    "statusCode": 200,
    "multiplied": [7, 14, 21]
  },
  {
    "statusCode": 200,
    "multiplied": [28, 35, 42]
  },
  {
    "statusCode": 200,
    "multiplied": [49, 56, 63]
  },
  {
    "statusCode": 200,
    "multiplied": [70]
  }
]
```

若要將所有傳回的陣列項目合併為單一輸出陣列，您可以使用 [ResultSelector](input-output-inputpath-params.md#input-output-resultselector) 欄位。在*分散式映射狀態*中定義此欄位，以尋找所有`multiplied`陣列、擷取這些陣列中的所有項目，然後將它們合併為單一輸出陣列。

若要使用 `ResultSelector` 欄位，請更新您的狀態機器定義，如下列範例所示。

```
{
  "StartAt": "Pass",
  "States": {
    ...
    ...
    "Map": {
      "Type": "Map",
      ...
      ...
      "ItemsPath": "$.MyItems",
      "ResultSelector": {
        "multiplied.$": "$..multiplied[*]"
      }
    }
  }
}
```

更新的 狀態機器會傳回合併的輸出陣列，如下列範例所示。

```
{
  "multiplied": [7, 14, 21, 28, 35, 42, 49, 56, 63, 70]
}
```