AWS Batch
用户指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

教程:使用数组作业索引控制作业差异化

本教程介绍如何使用 AWS_BATCH_JOB_ARRAY_INDEX 环境变量(所分配的每个子作业)来区分子作业。该示例的工作原理是使用子作业的索引数量,以读取文件中的特定行并用作业的容器内的命令替换与该行号关联的参数。最终,您可以拥有多个运行同一 Docker 映像和命令参数的 AWS Batch 作业,但结果由于数组作业索引被用作修饰符而不同。

在本教程中,您将创建一个文本文件,该文件包含了彩虹的所有颜色,并且每种颜色单独占一行。然后,您将为 Docker 容器创建一个入口点脚本,该脚本会将索引转换为可用于颜色文件中的行号的值(索引从 0 开始,但行号从 1 开始)。创建一个 Dockerfile,该文件会将颜色和索引文件复制到容器映像并将该映像的 ENTRYPOINT 设置为入口点脚本。Dockerfile 和资源将生成为一个 Docker 映像并被推送到 Amazon ECR。然后,您应注册使用新容器映像的作业定义,提交具有该作业定义的 AWS Batch 数组作业并查看结果。

先决条件

本教程包含以下先决条件:

  • 一个 AWS Batch 计算环境。有关更多信息,请参阅 创建计算环境

  • 一个 AWS Batch 作业队列和关联的计算环境。有关更多信息,请参阅创建作业队列

  • 在本地系统上安装的 AWS CLI。有关更多信息,请参阅 AWS Command Line Interface 用户指南 中的安装 AWS Command Line Interface

  • 在本地系统上安装的 Docker。有关更多信息,请参阅 Docker 文档中的关于 Docker CE

步骤 1:构建容器映像

尽管您可以在命令参数内的作业定义中使用 AWS_BATCH_JOB_ARRAY_INDEX,但创建在入口点脚本中使用变量的容器映像更方便、更高效。本节介绍如何创建此类容器映像。

构建 Docker 容器映像

  1. 创建要用作 Docker 映像工作区的新目录并导航到该目录。

  2. 在工作区目录中创建一个名为 colors.txt 的文件,并将下面的内容粘贴到其中。

    red orange yellow green blue indigo violet
  3. 在工作区目录中创建一个名为 print-color.sh 的文件,并将下面的内容粘贴到其中。

    注意

    LINE 变量被设置为 AWS_BATCH_JOB_ARRAY_INDEX + 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.
  4. 在工作区目录中创建一个名为 Dockerfile 的文件,并将下面的内容粘贴到其中。此 Dockerfile 会将以前的文件复制到您的容器并设置要在容器启动时运行的入口点脚本。

    FROM busybox COPY print-color.sh /tmp/print-color.sh COPY colors.txt /tmp/colors.txt ENTRYPOINT /tmp/print-color.sh
  5. 生成 Docker 映像:

    docker build -t print-color .
  6. 使用以下脚本测试容器。此脚本在本地将 AWS_BATCH_JOB_ARRAY_INDEX 变量设置为 0,然后递增它以模拟具有 7 个子级的数组作业的行为。

    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.

步骤 2:将映像推送到 Amazon ECR

既然您已构建并测试 Docker 容器,您必须将其推送到映像存储库。本示例使用了 Amazon ECR,但您也可以选择使用其他注册表,例如 DockerHub。

  1. 创建用于存储您的容器映像的 Amazon ECR 映像存储库。为简便起见,本示例使用了 AWS CLI,但您也可以使用 AWS 管理控制台。有关更多信息,请参阅 Amazon Elastic Container Registry 用户指南 中的创建存储库

    aws ecr create-repository --repository-name print-color
  2. 用从上一步返回的 Amazon ECR 存储库 URI 标记 print-color 映像。

    docker tag print-color aws_account_id.dkr.ecr.region.amazonaws.com/print-color
  3. 为 Amazon ECR 注册表检索登录命令。有关更多信息,请参阅 Amazon Elastic Container Registry 用户指南 中的注册表身份验证

    aws ecr get-login --no-include-email
  4. 运行由上一步返回的 docker login ... 命令。

  5. 将映像推送到 Amazon ECR:

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

步骤 3:创建并注册作业定义

既然您的 Docker 映像位于映像注册表中,您可以在 AWS Batch 作业定义中指定它并在稍后使用它来运行数组作业。为简便起见,本示例使用了 AWS CLI,但您也可以使用 AWS 管理控制台。有关更多信息,请参阅创建作业定义

创建作业定义

  1. 在工作区目录中创建一个名为 print-color.json 的文件,并将下面的内容粘贴到其中。将映像存储库 URI 替换为您自己的映像的 URI。

    { "jobDefinitionName": "print-color", "type": "container", "containerProperties": { "image": "aws_account_id.dkr.ecr.region.amazonaws.com/print-color", "vcpus": 1, "memory": 250 } }
  2. 使用 AWS Batch 注册作业定义:

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

步骤 4:提交 AWS Batch 数组作业

在注册作业定义后,您可以提交使用新容器映像的 AWS Batch 数组作业。

提交 AWS Batch 数组作业

  1. 在工作区目录中创建一个名为 print-color-job-def.json 的文件,并将下面的内容粘贴到其中。

    注意

    本示例采用由 AWS Batch 首次运行向导创建的默认作业队列名称。如果您的作业队列名称不同,请将 first-run-job-queue 名称替换为您的作业队列名称。

    { "jobName": "print-color", "jobQueue": "first-run-job-queue", "arrayProperties": { "size": 7 }, "jobDefinition": "print-color" }
  2. 将作业提交到 AWS Batch 作业队列。记下在输出中返回的作业 ID。

    aws batch submit-job --cli-input-json file://print-color-job-def.json
  3. 描述作业的状态并等待作业移动到 SUCCEEDED

步骤 5:查看数组作业日志

在任务达到 SUCCEEDED 状态后,您可以从任务的容器查看 CloudWatch Logs。

在 CloudWatch Logs 中查看作业的日志

  1. 使用 https://console.amazonaws.cn/batch/ 打开 AWS Batch 控制台。

  2. 在左侧导航窗格中,选择 Jobs (作业)

  3. 对于 Job queue(作业队列),选择一个队列。

  4. Status (状态) 部分中,选择 succeeded (已成功)

  5. 要显示数组作业的所有子作业,请选择在上一节中返回的作业 ID。

  6. 要从作业的容器查看日志,请选择其中一个子作业,然后选择 View logs (查看日志)

  7. 查看其他子作业的日志。每个作业将分别返回彩虹的一种颜色。