

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

# 使用陣列任務索引來控制任務差異
<a name="array_index_example"></a>

本教學課程說明如何使用 `AWS_BATCH_JOB_ARRAY_INDEX`環境變數來區分子任務。每個子任務都會指派給此變數。此範例使用子任務的索引號碼來讀取檔案中的特定行。然後，它會將與該行號相關聯的參數替換為任務容器內的命令。結果是，您可以有多個執行相同 Docker 映像和命令引數 AWS Batch 的任務。不過，結果不同，因為陣列任務索引是用作修飾詞。

在此教學課程中，您可以建立一個含有彩虹中所有顏色的文字檔案，每個顏色各為一行。然後，您可以為 Docker 容器建立進入點指令碼，將索引轉換為可用於顏色檔案中行號的值。索引從零開始，但行號從一開始。建立 Dockerfile，將顏色和索引檔案複製到容器映像，並將映像`ENTRYPOINT`的 設定為進入點指令碼。Dockerfile 和資源會建置到推送到 Amazon ECR 的 Docker 映像。然後，您可以註冊使用新容器映像的任務定義、使用該任務定義提交 AWS Batch 陣列任務，以及檢視結果。

**Topics**
+ [先決條件](array-tutorial-prereqs.md)
+ [建置容器映像](build-index-container.md)
+ [將映像推送至 Amazon ECR](push-array-image.md)
+ [建立並註冊任務定義](create-array-job-def.md)
+ [提交 AWS Batch 陣列任務](submit-array-job.md)
+ [檢視您的陣列任務日誌](#array-tutorial-logs)

# 先決條件
<a name="array-tutorial-prereqs"></a>

本教學課程工作流程具有下列先決條件：
+  AWS Batch 運算環境。如需詳細資訊，請參閱[建立運算環境](create-compute-environment.md)。
+  AWS Batch 任務佇列和相關聯的運算環境。如需詳細資訊，請參閱[建立任務佇列](create-job-queue.md)。
+  AWS CLI 安裝在本機系統的 。如需詳細資訊，請參閱*AWS Command Line Interface 《 使用者指南*》中的 [ >安裝 AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/installing.html)。
+ 安裝在本機系統的 Docker。如需詳細資訊，請參閱 Docker 文件中的[關於 Docker CE](https://docs.docker.com/install/)。

# 建置容器映像
<a name="build-index-container"></a>

您可以在 命令參數`AWS_BATCH_JOB_ARRAY_INDEX`的任務定義中使用 。不過，我們建議您建立在進入點指令碼中使用 變數的容器映像。本節說明如何建立此類容器映像。

**建置 Docker 容器影像**

1. 建立新的目錄做為您的 Docker 影像工作空間，然後瀏覽至該目錄。

1. `colors.txt` 在您的工作區目錄中建立名為 的檔案，並將以下內容貼入其中。

   ```
   red
   orange
   yellow
   green
   blue
   indigo
   violet
   ```

1. 在`print-color.sh`工作區目錄中建立名為 的檔案，並將以下內容貼入其中。
**注意**  
`LINE` 變數設定為 `AWS_BATCH_JOB_ARRAY_INDEX` \$1 1，因為陣列索引起始為 0，但行號從 1 開始。`COLOR` 變數會設定為 中與其行號`colors.txt`相關聯的顏色。

   ```
   #!/bin/sh
   LINE=$((AWS_BATCH_JOB_ARRAY_INDEX + 1))
   COLOR=$(sed -n ${LINE}p /tmp/colors.txt)
   echo My favorite color of the rainbow is $COLOR.
   ```

1. 在`Dockerfile`工作區目錄中建立名為 的檔案，並將下列內容貼入其中。此 Dockerfile 會將之前的檔案複製到您的容器，並將進入點指令碼設定為在啟動容器時執行。

   ```
   FROM busybox
   COPY print-color.sh /tmp/print-color.sh
   COPY colors.txt /tmp/colors.txt
   RUN chmod +x /tmp/print-color.sh
   ENTRYPOINT /tmp/print-color.sh
   ```

1. 建置 Docker 映像。

   ```
   $ docker build -t print-color .
   ```

1. 使用以下指令碼測試容器。此指令碼會在本機將`AWS_BATCH_JOB_ARRAY_INDEX`變數設定為 0，然後遞增以模擬具有七個子項的陣列任務。

   ```
   $ AWS_BATCH_JOB_ARRAY_INDEX=0
   while [ $AWS_BATCH_JOB_ARRAY_INDEX -le 6 ]
   do
       docker run -e AWS_BATCH_JOB_ARRAY_INDEX=$AWS_BATCH_JOB_ARRAY_INDEX print-color
       AWS_BATCH_JOB_ARRAY_INDEX=$((AWS_BATCH_JOB_ARRAY_INDEX + 1))
   done
   ```

   以下為其輸出。

   ```
   My favorite color of the rainbow is red.
   My favorite color of the rainbow is orange.
   My favorite color of the rainbow is yellow.
   My favorite color of the rainbow is green.
   My favorite color of the rainbow is blue.
   My favorite color of the rainbow is indigo.
   My favorite color of the rainbow is violet.
   ```

# 將映像推送至 Amazon ECR
<a name="push-array-image"></a>

現在您已建置並測試 Docker 容器，請將其推送至映像儲存庫。此範例使用 Amazon ECR，但您可以使用其他登錄檔，例如 DockerHub。

1. 建立 Amazon ECR 映像儲存庫以存放您的容器映像。此範例僅使用 AWS CLI，但您也可以使用 AWS 管理主控台。如需詳細資訊，請參閱《*Amazon Elastic Container Registry 使用者指南*》中的[建立儲存庫](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)。

   ```
   $ aws ecr create-repository --repository-name print-color
   ```

1. 使用上一個步驟傳回的 Amazon ECR 儲存庫 URI 標記您的`print-color`映像。

   ```
   $ docker tag print-color aws_account_id.dkr.ecr.region.amazonaws.com/print-color
   ```

1. 登入 Amazon ECR 登錄檔。如需詳細資訊，請參閱《Amazon Elastic Container Registry 使用者指南》**中的[登錄檔身分驗證](https://docs.aws.amazon.com/AmazonECR/latest/userguide/Registries.html#registry_auth)。

   ```
   $ aws ecr get-login-password \
       --region region | docker login \
       --username AWS \
       --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com
   ```

1. 將您的映像推送至 Amazon ECR。

   ```
   $ docker push aws_account_id.dkr.ecr.region.amazonaws.com/print-color
   ```

# 建立並註冊任務定義
<a name="create-array-job-def"></a>

現在您的 Docker 映像位於映像登錄檔中，您可以在 AWS Batch 任務定義中指定它。然後，您可以稍後使用它來執行陣列任務。此範例僅使用 AWS CLI。不過，您也可以使用 AWS 管理主控台。如需詳細資訊，請參閱[建立單一節點任務定義](create-job-definition.md)。

**建立任務定義**

1. 在`print-color-job-def.json`工作區目錄中建立名為 的檔案，並將以下內容貼入其中。將映像儲存庫 URI 取代為您自己的映像 URI。

   ```
   {
     "jobDefinitionName": "print-color",
     "type": "container",
     "containerProperties": {
       "image": "aws_account_id.dkr.ecr.region.amazonaws.com/print-color",
       "resourceRequirements": [
           {
               "type": "MEMORY",
               "value": "250"
           },
           {
               "type": "VCPU",
               "value": "1"
           }
       ]
     }
   }
   ```

1. 向 註冊任務定義 AWS Batch。

   ```
   $ aws batch register-job-definition --cli-input-json file://print-color-job-def.json
   ```

# 提交 AWS Batch 陣列任務
<a name="submit-array-job"></a>

註冊任務定義後，您可以提交使用新容器映像的 AWS Batch 陣列任務。

**提交 AWS Batch 陣列任務**

1. 在`print-color-job.json`工作區目錄中建立名為 的檔案，並將以下內容貼入其中。
**注意**  
此範例使用 [先決條件](array-tutorial-prereqs.md)區段中提到的任務佇列。

   ```
   {
     "jobName": "print-color",
     "jobQueue": "existing-job-queue",
     "arrayProperties": {
       "size": 7
     },
     "jobDefinition": "print-color"
   }
   ```

1. 將任務提交到您的 AWS Batch 任務佇列。請注意輸出中傳回的任務 ID。

   ```
   $ aws batch submit-job --cli-input-json file://print-color-job.json
   ```

1. 描述任務的狀態並等待任務移至 `SUCCEEDED`。

## 檢視您的陣列任務日誌
<a name="array-tutorial-logs"></a>

任務達到 `SUCCEEDED` 狀態後，您可以從任務的容器檢視 CloudWatch Logs。

**在 CloudWatch Logs 中檢視任務的日誌**

1. 在 https：//[https://console.aws.amazon.com/batch/](https://console.aws.amazon.com/batch/) 開啟 AWS Batch 主控台。

1. 在左側導覽窗格中，選擇 **Jobs (任務)**。

1. 對於 **Job queue (任務佇列)**，請選取佇列。

1. 在 **Status (狀態)** 區段，選擇 **succeeded (已成功)**。

1. 若要顯示陣列任務的所有子任務，選取在之前的區段中傳回的任務 ID。

1. 若要查看任務容器的日誌，選取其中一個子任務，然後選擇 **View logs (查看日誌)**。  
![\[陣列任務容器日誌\]](http://docs.aws.amazon.com/zh_tw/batch/latest/userguide/images/array-logs.png)

1. 查看其他子任務日誌。每個任務都會傳回不同的彩虹顏色。