

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

# 在 Step Functions 中使用分散式映射複製大規模 CSV 資料
<a name="tutorial-map-distributed"></a>

本教學課程可協助您在分散式模式中開始使用 `Map` 狀態。設定為**分散式**`Map`的狀態稱為*分散式映射狀態*。您可以在工作流程中使用*分散式地圖狀態*，逐一查看大規模的 Amazon S3 資料來源。`Map` 狀態會以子工作流程執行的方式執行每個反覆運算，這會啟用高並行。如需分散式模式的詳細資訊，請參閱[分散式模式中的映射狀態](state-map-distributed.md)。

在本教學課程中，您會使用*分散式地圖狀態*來逐一查看 Amazon S3 儲存貯體中的 CSV 檔案。然後，您會在另一個 Amazon S3 儲存貯體中傳回其內容，以及子工作流程執行的 ARN。首先在工作流程 Studio 中建立工作流程原型。接著，您將[`Map`狀態的處理模式](state-map.md#concepts-map-process-modes)設定為分散式，指定 CSV 檔案做為資料集，並提供其位置給 `Map` 狀態。您也可以指定*分散式映射狀態*啟動為 **Express** 的子工作流程執行的工作流程類型。

除了這些設定之外，您也可以指定其他組態，例如並行子工作流程執行的數目上限，以及匯出`Map`結果的位置，例如本教學中使用的範例工作流程。

## 先決條件
<a name="use-dist-map-prereqs"></a>
+ 將 CSV 檔案上傳至 Amazon S3 儲存貯體。您必須在 CSV 檔案中定義標頭列。如需對 CSV 檔案實施的大小限制以及如何指定標頭列的資訊，請參閱 [Amazon S3 儲存貯體中的 CSV 檔案](input-output-itemreader.md#itemsource-example-csv-data)。
+ 在儲存貯體中建立另一個 Amazon S3 儲存貯體和資料夾，以匯出`Map`狀態結果。

**帳戶和區域的需求**  
Amazon S3 儲存貯體必須與狀態機器位於相同 AWS 帳戶 和 AWS 區域 。  
請注意，即使您的狀態機器可以跨相同 中的不同 存取儲存貯 AWS 帳戶 體中的檔案 AWS 區域，Step Functions 僅支援在*與* AWS 區域 狀態機器相同 AWS 帳戶 和相同的 Amazon S3 儲存貯體中列出物件。

## 步驟 1：建立工作流程原型
<a name="use-dist-map-create-workflow"></a>

在此步驟中，您會使用 Workflow Studio 建立工作流程的原型。Workflow Studio 是 Step Functions 主控台中提供的視覺化工作流程設計工具。您可以從**流程**和動作索引標籤分別選擇所需的狀態和 API **動作**。您將使用 Workflow Studio 的拖放功能來建立工作流程原型。

1. 開啟 [Step Functions 主控台](https://console.aws.amazon.com/states/home)，從選單中選擇**狀態機器**，然後選擇**建立狀態機器**。

1. 選擇**從空白建立**。

1. 為您的狀態機器命名，然後選擇**繼續**在 Workflow Studio 中編輯您的狀態機器。

1. 從**流程**索引標籤中，拖曳**映射**狀態，並將其放入標示為**拖曳第一個狀態的空白狀態。**

1. 在**組態**索引標籤中，針對**狀態名稱**輸入 **Process data**。

1. 從**動作**索引標籤中，拖曳**AWS Lambda 叫用 API **動作，並將其放入 **程序資料**狀態。

1. 將**AWS Lambda 調用**狀態重新命名為 **Process CSV data**。

## 步驟 2：設定映射狀態的必要欄位
<a name="use-dist-map-config-fields"></a>

在此步驟中，您可以設定*分散式地圖狀態*的下列必要欄位：
+ [ItemReader](input-output-itemreader.md) – 指定資料集及其`Map`狀態可從中讀取輸入的位置。
+ [ItemProcessor](state-map-distributed.md#distitemprocessor) – 指定下列值：
  + `ProcessorConfig` – 將 `Mode`和 `EXPRESS`分別`ExecutionType`設定為 `DISTRIBUTED`和 。這會為*分散式映射狀態*啟動的子工作流程執行設定`Map`狀態的處理模式和工作流程類型。
  + `StartAt` – Map 工作流程中的第一個狀態。
  + `States` – 定義映射工作流程，這是每個子工作流程執行中要重複的一組步驟。
+ [ResultWriter](input-output-resultwriter.md) – 指定 Step Functions 寫入*分散式映射狀態*結果的 Amazon S3 位置。
**重要**  
請確定您用來匯出 Map Run 結果的 Amazon S3 儲存貯體與您的狀態機器位於相同 AWS 帳戶 和 AWS 區域 之下。否則，您的狀態機器執行會失敗並顯示`States.ResultWriterFailed`錯誤。

**若要設定必要欄位：**

1. 選擇**處理資料**狀態，然後在**組態**索引標籤中執行下列動作：

   1. 針對**處理模式**，選擇**分散式**。

   1. 針對**項目來源**，選擇 **Amazon S3**，然後從 ** S3 項目來源下拉式清單中選擇 S3 中的 CSV 檔案**。 **S3 ** 

   1. 執行下列動作來指定 CSV 檔案的 Amazon S3 位置：

      1. 對於 **S3 物件**，從下拉式清單中選取**輸入儲存貯體和金鑰**。

      1. 針對**儲存貯體**，輸入包含 CSV 檔案的 Amazon S3 儲存貯體名稱。例如 **amzn-s3-demo-source-bucket**。

      1. 針對**金鑰**，輸入您儲存 CSV 檔案的 Amazon S3 物件名稱。您也必須在此欄位中指定 CSV 檔案名稱。例如 **csvDataset/ratings.csv**。

   1. 對於 CSV 檔案，您還必須指定資料欄標頭的位置。若要這樣做，請選擇**其他組態**，然後對於 **CSV 標頭位置**，如果 CSV 檔案**的第一列**是 標頭，則保留第一列的預設選擇。否則，請選擇**指定**以在狀態機器定義中指定標頭。如需詳細資訊，請參閱`ReaderConfig`。

   1. 針對**子執行類型**，選擇**快速**。

1. 在**匯出位置**中，若要將映射執行結果匯出至特定 Amazon S3 位置，請選擇**匯出映射狀態的輸出至 Amazon S3**。

1. 請執行下列操作：

   1. 對於 **S3 儲存貯**體，從下拉式清單中選擇**輸入儲存貯體名稱和字首**。

   1. 針對**儲存貯**體，輸入您要匯出結果的 Amazon S3 儲存貯體名稱。例如 **mapOutputs**。

   1. 針對**字首**，輸入您要儲存結果的資料夾名稱。例如 **resultData**。

## 步驟 3：設定其他選項
<a name="use-dist-map-config-misc-fields"></a>

除了*分散式地圖狀態*的必要設定之外，您也可以指定其他選項。這些可以包括並行子工作流程執行的數目上限，以及匯出`Map`狀態結果的位置。

1. 選擇**處理資料**狀態。然後，在**項目來源**中，選擇**其他組態**。

1. 請執行下列操作：

   1. 選擇**使用 ItemSelector 修改項目**，為每個子工作流程執行指定自訂 JSON 輸入。

   1. 輸入下列 JSON 輸入：

      ```
      {
        "index.$": "$$.Map.Item.Index",
        "value.$": "$$.Map.Item.Value"
      }
      ```

      如需如何建立自訂輸入的資訊，請參閱 `ItemSelector （地圖）`。

1. 在**執行時間設定**中，針對**並行限制**，指定*分散式映射狀態*可以啟動的並行子工作流程執行次數。例如，​輸入 **100**。

1. 在瀏覽器上開啟新視窗或索引標籤，並完成您將在此工作流程中使用的 Lambda 函數組態，如 中所述[步驟 4：設定 Lambda 函數](#use-dist-map-config-resource)。

## 步驟 4：設定 Lambda 函數
<a name="use-dist-map-config-resource"></a>

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

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

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

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

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

   1. 針對 **Runtime** (執行時間)，選擇 **Node.js **。

   1. 保留所有預設選擇，然後選擇**建立函數**。

   1. 建立 Lambda 函數後，複製頁面右上角顯示的函數 Amazon Resource Name (ARN)。您需要在工作流程原型中提供此資訊。以下是範例 ARN：

      ```
      arn:aws:lambda:us-east-2:123456789012:function:distributedMapLambda
      ```

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

   ```
   exports.handler = async function(event, context) {
       console.log("Received Input:\n", event);
   
       return {
           'statusCode' : 200,
           'inputReceived' : event //returns the input that it received
       }
   };
   ```

1. 選擇**部署**。部署函數後，請選擇**測試**以查看 Lambda 函數的輸出。

## 步驟 5：更新工作流程原型
<a name="use-dist-map-update-workflow"></a>

在 Step Functions 主控台中，您將更新工作流程以新增 Lambda 函數的 ARN。

1. 返回您建立工作流程原型的標籤或視窗。

1. 選擇**程序 CSV 資料**步驟，然後在**組態**索引標籤中執行下列動作：

   1. 針對**整合類型**，選擇**最佳化**。

   1. 針對**函數名稱**，開始輸入 Lambda 函數的名稱。從顯示的下拉式清單中選擇函數，或選擇**輸入函數名稱**並提供 Lambda 函數 ARN。

## 步驟 6：檢閱自動產生的 Amazon States Language 定義並儲存工作流程
<a name="use-dist-map-review-asl"></a>

當您從**動作**和**流程**索引標籤將狀態拖放至畫布時，Workflow Studio 會自動即時編寫工作流程的 [Amazon States Language](concepts-amazon-states-language.md) 定義。您可以視需要編輯此定義。

1. （選用） 選擇[Inspector 面板](workflow-studio.md#workflow-studio-components-formdefinition)面板上的**定義**，並檢視狀態機器定義。
**提示**  
您也可以在 Workflow Studio [程式碼編輯器](workflow-studio.md#wfs-interface-code-editor) 的 中檢視 ASL 定義。在程式碼編輯器中，您也可以編輯工作流程的 ASL 定義。

   下列範例程式碼顯示工作流程自動產生的 Amazon States Language 定義。

   ```
   {
     "Comment": "Using Map state in Distributed mode",
     "StartAt": "Process data",
     "States": {
       "Process data": {
         "Type": "Map",
         "MaxConcurrency": 100,
         "ItemReader": {
           "ReaderConfig": {
             "InputType": "CSV",
             "CSVHeaderLocation": "FIRST_ROW"
           },
           "Resource": "arn:aws:states:::s3:getObject",
           "Parameters": {
             "Bucket": "amzn-s3-demo-source-bucket",
             "Key": "csvDataset/ratings.csv"
           }
         },
         "ItemProcessor": {
           "ProcessorConfig": {
             "Mode": "DISTRIBUTED",
             "ExecutionType": "EXPRESS"
           },
           "StartAt": "Process CSV data",
           "States": {
             "Process CSV data": {
               "Type": "Task",
               "Resource": "arn:aws:states:::lambda:invoke",
               "OutputPath": "$.Payload",
               "Parameters": {
                 "Payload.$": "$",
                 "FunctionName": "arn:aws:lambda:us-east-2:account-id:function:distributedMapLambda"
               },
               "End": true
             }
           }
         },
         "Label": "Processdata",
         "End": true,
         "ResultWriter": {
           "Resource": "arn:aws:states:::s3:putObject",
           "Parameters": {
             "Bucket": "mapOutputs",
             "Prefix": "resultData"
           }
         },
         "ItemSelector": {
           "index.$": "$$.Map.Item.Index",
           "value.$": "$$.Map.Item.Value"
         }
       }
     }
   }
   ```

1. 為您的狀態機器指定名稱。若要這樣做，請選擇 **MyStateMachine** 預設狀態機器名稱旁的編輯圖示。然後，在**狀態機器組態**中，在**狀態機器名稱方塊中指定名稱**。

   針對本教學課程，輸入名稱 **DistributedMapDemo**。

1. （選用） 在**狀態機器組態**中，指定其他工作流程設定，例如狀態機器類型及其執行角色。

   在此教學課程中，請保留**狀態機器組態**中的所有預設選擇。

1. 在**確認角色建立**對話方塊中，選擇**確認**以繼續。

   您也可以選擇**檢視角色設定**以返回**狀態機器組態**。
**注意**  
如果您刪除 Step Functions 建立的 IAM 角色，Step Functions 稍後無法重新建立該角色。同樣地，如果您修改角色 （例如，從 IAM 政策中的主體移除 Step Functions)，Step Functions 稍後無法還原其原始設定。

## 步驟 7：執行狀態機器
<a name="use-dist-map-sm-run"></a>

*執行*是您狀態機器的執行個體，您可以在其中執行工作流程來執行任務。

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

1. 在**開始執行**對話方塊中，執行下列動作：

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

   1. （選用） 在**輸入**方塊中，輸入 JSON 格式的輸入值來執行工作流程。

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

   1. Step Functions 主控台會將您導向至標題為執行 ID 的頁面，稱為*執行詳細資訊*頁面。您可以在工作流程進行和完成後檢閱執行結果。

      若要檢閱執行結果，請在**圖形檢視**中選擇個別狀態，然後選擇[步驟詳細資訊](concepts-view-execution-details.md#exec-details-intf-step-details)窗格上的個別索引標籤，分別檢視每個狀態的詳細資訊，包括輸入、輸出和定義。如需您可以在執行詳細資訊頁面上檢視之*執行資訊的詳細資訊*，請參閱 [執行詳細資訊概觀](concepts-view-execution-details.md#exec-details-interface-overview)。

   例如，選擇 `Map` 狀態，然後選擇**映射執行**以開啟*映射執行詳細資訊*頁面。在此頁面上，您可以檢視*分散式映射狀態*的所有執行詳細資訊及其啟動的子工作流程執行。如需此頁面的相關資訊，請參閱 [檢視地圖執行](concepts-examine-map-run.md)。