

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 作业定义
<a name="job_definitions"></a>

AWS Batch 作业定义指定作业的运行方式。虽然每个作业必须引用一个作业定义，但可在运行时覆盖作业定义中指定的许多参数。

在作业定义中指定的一些属性包括：
+ 在作业中用于容器的 Docker 映像。
+ 容器要使用多少 v CPUs 和多少内存。
+ 容器在启动时应运行的命令。
+ 当容器启动时，应传递给容器的环境变量（如果有）。
+ 应该用于容器的任何数据卷。
+ 您的任务应使用哪个（如果有）IAM 角色来获得 AWS 权限。

**Topics**
+ [创建单节点作业定义](create-job-definition.md)
+ [创建多节点并行作业定义](create-multi-node-job-def.md)
+ [使用 ContainerProperties 的作业定义模板](job-definition-template.md)
+ [使用创建作业定义 EcsProperties](multi-container-jobs.md)
+ [使用 awslogs 日志驱动程序](using_awslogs.md)
+ [指定敏感数据](specifying-sensitive-data.md)
+ [作业的私有注册表身份验证](private-registry.md)
+ [Amazon EFS 卷](efs-volumes.md)
+ [作业定义示例](example-job-definitions.md)

# 创建单节点作业定义
<a name="create-job-definition"></a>

必须先创建作业定义 AWS Batch，然后才能在中运行作业。对于单节点并行作业和多节点并行作业，此过程略有不同。本主题专门介绍如何为非多节点 paral AWS Batch lel 作业（也称为*群组调度*）的作业创建任务定义。

您可以在 Amazon 弹性容器服务资源上创建多节点并行作业定义。有关更多信息，请参阅 [创建多节点并行作业定义](create-multi-node-job-def.md)。

**Topics**
+ [在 Amazon EC2 资源上创建单节点作业定义](create-job-definition-EC2.md)
+ [在 Fargate 资源上创建单节点作业定义](create-job-definition-Fargate.md)
+ [在 Amazon EKS 资源上创建单节点作业定义](create-job-definition-eks.md)
+ [在 Amazon EC2 资源上创建使用多个容器的单节点作业定义](create-job-definition-single-node-multi-container.md)

# 在 Amazon EC2 资源上创建单节点作业定义
<a name="create-job-definition-EC2"></a>

完成以下步骤，在 Amazon Elastic Compute Cloud（Amazon EC2）资源上创建单节点作业定义。

**要在 Amazon EC2 资源上创建新的作业定义，请执行以下操作：**

1. 打开 AWS Batch 控制台，网址为[https://console.aws.amazon.com/batch/](https://console.aws.amazon.com/batch/)。

1. 从导航栏中选择 AWS 区域 要使用的。

1. 在左侧导航窗格中，选择**作业定义**。

1. 选择**创建**。

1. 对于**编排类型**，选择 **Amazon Elastic Compute Cloud (Amazon EC2)**。

1. 对于 **EC2 平台配置**，请关闭**启用多节点并行**处理。

1. 对于**名称**，为您的作业定义输入唯一名称。名称长度不超过 128 个字符。可以包含大小写字母、数字、连字符（-）和下划线（\$1）。

1. （可选）对于**执行超时**，输入超时值（以秒为单位）。执行超时是指未完成的作业终止之前的时间长度。如果某次尝试超过了超时时间，该尝试将停止，状态将转为 `FAILED`。有关更多信息，请参阅 [作业超时](job_timeouts.md)。最小值为 60 秒。

1. （可选）开启**计划优先级**。输入介于 0 到 100 之间的计划优先级值。值越高，优先级越高。

1. （可选）对于**作业尝试**，请输入 AWS Batch 尝试将作业移至 `RUNNABLE` 状态的次数。请输入 1 到 10 之间的数字。

1. （可选）对于**重试策略条件**，选择**退出时添加评估**。至少输入一个参数值，然后选择一个**操作**。对于每组条件，必须将**操作**设置为**重试**或**退出**。这些操作意味着以下几点：
   + **重试** — AWS Batch 重试，直到达到您指定的任务尝试次数。
   + **退出** — AWS Batch 停止重试作业。
**重要**  
如果选择**退出时添加评估**，则必须至少配置一个参数并选择一个**操作**或选择**退出时移除评估**。

1. （可选）展开 **标签**，然后选择**添加标签**以向资源添加标签。输入键和可选的值，然后选择**添加标签**。

1. （可选）开启 **传播标签**将标签从作业和作业定义传播到 Amazon ECS 任务。

1. 选择**下一页**。

1. 在**容器配置**部分：

   1. 对于**映像**，选择要用于您的作业的 Docker 映像。默认情况下，Docker Hub 注册表中的映像可用。也可以使用`repository-url/image:tag`指定其他存储库。名称长度不超过 225 个字符。可以包含大小写字母、数字、连字符（-）、下划线（\$1）、冒号（:）、正斜杠（/）和数字符号（\$1）。此参数可映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的[创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的`Image`和[https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/)的`IMAGE`参数。
**注意**  
Docker 映像架构必须与为它们安排的计算资源的处理器架构相匹配。例如，基于 ARM 的 Docker 镜像只能在基于 ARM 的计算资源上运行。
      + Amazon ECR 公有存储库中的映像使用完整的`registry/repository[:tag]`或`registry/repository[@digest]`命名惯例（例如，`public.ecr.aws/registry_alias/my-web-app:latest`）。
      + Amazon ECR 存储库中的映像使用完整的`registry/repository[:tag]`命名惯例（例如，`aws_account_id.dkr.ecr.region.amazonaws.com``/my-web-app:latest`）。
      + Docker Hub 上的官方存储库中的映像使用单一名称 (例如，`ubuntu` 或 `mongo`)。
      + Docker Hub 上其他存储库中的映像通过组织名称（例如，`amazon/amazon-ecs-agent`）进行限定。
      + 其他在线存储库中的映像由域名（例如，`quay.io/assemblyline/ubuntu`）进行进一步限定。

   1. 对于**命令**，将命令的等效 **JSON** 字符串数组输入到该字段中。

      此参数映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) [创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的`Cmd`，以及[https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/)的`COMMAND`参数。有关该Docker`CMD`参数的更多信息，请参阅 reference [https://docs.docker.com/engine//builder/ \$1cmd](https://docs.docker.com/engine/reference/builder/#cmd)。
**注意**  
您可以在命令中使用参数替代默认值和占位符。有关更多信息，请参阅 [Parameters](job_definition_parameters.md#parameters)。

   1. （可选）对于**执行角色**，请指定一个 IAM 角色，该角色授予 Amazon ECS 容器代理代表您进行 AWS API 调用的权限。此功能使用 Amazon ECS IAM 角色执行任务。有关更多信息，请参阅 *Amazon Elastic Container Service 开发人员指南*中的 [Amazon ECS 任务执行 IAM 角色](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_execution_IAM_role.html)。

   1. 要**配置 Job 角色**，请选择有权访问的 IAM 角色 AWS APIs。此功能使用 Amazon ECS IAM 角色执行任务。有关更多信息，请参阅 *Amazon Elastic Container Service 开发人员指南*中的[任务的 IAM 角色](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html)。
**注意**  
此处仅显示具有 **Amazon Elastic Container Service Task Role** 信任关系的角色。有关为您的 AWS Batch 任务创建 IAM 角色的更多信息，请参阅 A *mazon Elastic Container 服务开发者指南*[中的为任务创建 IAM 角色和策略](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html#create_task_iam_policy_and_role)。

1. 对于**参数**，选择**添加参数**以添加参数替换占位符，作为**键**（可选的）**值**对。

1. 在**环境配置**部分：

   1. 对于 **v CPUs**，输入CPUs 要为容器保留的 v 数。此参数将映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的[创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的`CpuShares`以及[https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/)的`--cpu-shares`选项。每个 vCPU 相当于 1024 个 CPU 份额。您必须指定至少一个 vCPU。

   1. 对于**内存**，输入容器可用的内存限制。如果您的容器尝试使用超出您在此处指定的内存量，该容器将会被终止。此参数将映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的[创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的`Memory`以及[https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/)的`--memory`选项。您必须为作业指定至少 4 MiB 内存。
**注意**  
要最大限度地提高资源利用率，请为特定实例类型的作业确定内存优先级。有关更多信息，请参阅 [计算资源内存管理](memory-management.md)。

   1. 在 “**数量**” 中 GPUs，选择 GPUs 要为集装箱保留的数量。

   1. （可选）对于**环境变量**，选择**添加环境变量**以名称-值对的形式添加环境变量。这些变量传递给容器。

   1. （可选）对于**密钥**，选择**添加密钥**，将密钥添加为名称-值对。这些密钥暴露在容器中。[欲了解更多信息，请参阅：LogConfiguration秘密选项。](https://docs.aws.amazon.com/batch/latest/APIReference/API_LogConfiguration.html#Batch-Type-LogConfiguration-secretOptions)

1. 选择**下一页**。

1. 在 **Linux 配置**部分中：

   1. 对于 **User**，输入要在容器内使用的用户名。此参数将映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的[创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的`User`以及[https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/)的`--user`选项。

   1. （可选）要授予作业容器对主机实例（类似于 `root` 用户）的更高权限，请向右拖动**权限**滑块。此参数将映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的[创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的`Privileged`以及[https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/)的`--privileged`选项。

   1. （可选）开启**启用 Init 处理**以在容器内运行 `init` 进程。该进程转发信号和获得进程。

1. （可选）在**文件系统配置**部分：

   1. 开启**启用只读文件系统**以移除对卷的写入权限。

   1. 在**共享内存大小**中，输入 `/dev/shm` 卷的大小（以 MiB 为单位）。

   1. 在**最大交换大小**中，输入容器可使用的总交换内存量（以 MiB 为单位）。

   1. 在 **Swappiness** 中输入一个介于 0 和 100 之间的值，以指示容器的 swappiness 行为。如果不指定值且启用了交换，则值默认值为 60。[有关更多信息，请参阅:交换性LinuxParameters。](https://docs.aws.amazon.com/batch/latest/APIReference/API_LinuxParameters.html#Batch-Type-LinuxParameters-swappiness)

   1. （可选）展开**其他配置**。

   1. （可选）对于 **Tmpfs**，请选择**添加 tmpfs** 以添加 `tmpfs` 挂载。

   1. （可选）对于**设备**，选择**添加设备**以添加设备：

      1. 对于**容器路径**，指定容器实例中的路径以公开映射到主机实例的设备。如果将其留空，则在容器中使用主机路径。

      1. 对于**主机路径**，指定主机实例中设备的路径。

      1. 对于**权限**，选择要应用于设备的一个或多个权限。可用权限包括**读取**、**写入**和 **MKNOD**。

   1. （可选）对于**卷配置**，请选择**添加卷**以创建要传递到容器的卷列表。输入卷的**名称**和**源路径**，然后选择**添加卷**。您也可以选择开启**启用 EFS**。

   1. （可选）对于**挂载点**，请选择**添加挂载点配置**以添加数据卷的挂载点。您必须指定源卷和容器路径。这些挂载点会传递到容器实例上的 Docker daemon。您也可以选择将卷设为**只读**。

   1. （可选）对于 **Ulimits 配置**，请选择**添加 ulimit** 为容器添加一个 `ulimits` 值。输入**名称**、**软限制**和**硬限制**值，然后选择**添加 ulimit**。

1. 在**任务属性**部分中：

   1. 对于**执行角色（视情况而定**），选择一个角色以允许 Amazon ECS 代理代表您进行 AWS API 调用。有关创建**执行角色**的更多信息，请参阅[教程：创建 IAM 执行角色](create-execution-role.md)。

   1. 选择**启用 ECS execute 命令**，以实现直接访问 Amazon ECS 容器 Shell 并绕过主机操作系统。必须选择一个**任务角色**。
**重要**  
**ECS execute** 命令要求文件系统是可写的。

   1. 对于**任务角色**，选择一个 Amazon ECS 身份和访问管理 (IAM) Access Management 角色以允许容器代表 AWS 您进行 API 调用。有关更多信息，请参阅《Amazon Elastic Container Service 开发人员指南》中的 [Amazon ECS 任务 IAM 角色](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html)**。

1. （可选）在**日志记录配置**部分：

   1. 对于**日志驱动程序**，请选择要使用的日志驱动程序。[有关可用日志驱动程序的更多信息，请参阅:LogConfigurationlogDriver。](https://docs.aws.amazon.com/batch/latest/APIReference/API_LogConfiguration.html#Batch-Type-LogConfiguration-logDriver)
**注意**  
默认情况下，使用 `awslogs` 日志驱动程序。

   1. 在**选项**中，选择**添加选项**以添加选项。输入名称-值对，然后选择**添加选项**。

   1. 对于**密钥**，选择**添加密钥**。输入名称-值对，然后选择**添加密钥**以添加密钥。
**提示**  
[欲了解更多信息，请参阅：LogConfiguration秘密选项。](https://docs.aws.amazon.com/batch/latest/APIReference/API_LogConfiguration.html#Batch-Type-LogConfiguration-secretOptions)

1. 选择**下一页**。

1. 对于**作业定义查看**，请查看配置步骤。如果需要进行更改，请选择 **Edit**（编辑）。完成后，选择**创建作业定义**。

# 在 Fargate 资源上创建单节点作业定义
<a name="create-job-definition-Fargate"></a>

完成以下步骤，在 AWS Fargate 资源上创建单节点作业定义。

**要在 Fargate 资源上创建新作业定义，请执行以下操作：**

1. 打开 AWS Batch 控制台，网址为[https://console.aws.amazon.com/batch/](https://console.aws.amazon.com/batch/)。

1. 从顶部导航栏中，选择 AWS 区域 要使用的。

1. 在左侧导航窗格中，选择**作业定义**。

1. 选择**创建**。

1. 对于**编排类型**，请选择 **Fargate**。有关更多信息，请参阅 [Fargate 计算环境](fargate.md)。

1. 对于**名称**，为您的作业定义输入唯一名称。名称长度不超过 128 个字符。可以包含大小写字母、数字、连字符（-）和下划线（\$1）。

1. （可选）对于**执行超时**，输入超时值（以秒为单位）。执行超时是指未完成的作业终止之前的时间长度。如果某次尝试超过了超时时间，该尝试将停止，状态将转为 `FAILED`。有关更多信息，请参阅 [作业超时](job_timeouts.md)。最小值为 60 秒。

1. （可选）开启**计划优先级**。输入介于 0 到 100 之间的计划优先级值。值越高，相较于较低值的优先级越高。

1. （可选）展开 **标签**，然后选择**添加标签**以向资源添加标签。启用**传播标签**以传播作业和作业定义中的标签。

1. 在 **Fargate 平台配置**部分中：

   1. 对于**运行时平台**，请选择计算环境架构。

   1. 对于**操作系统系列**，为计算环境选择操作系统。

   1. 对于** CPU 架构**，请选择 vCPU 架构。

   1. 对于 **Fargate 平台版本**，请输入 `LATEST` 或特定的运行时系统环境版本。

   1. （可选）打开**分配公有 IP**，为 Fargate 作业网络接口分配公有 IP 地址。为使在私有子网中运行的作业将出站流量发送到互联网，私有子网需要挂载 NAT 网关才能将请求路由到互联网。您可能需要这样做，以便可以提取容器映像。有关更多信息，请参阅《Amazon Elastic Container Service 开发人员指南》**中的 [Amazon ECS 任务联网](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-networking.html)。

   1. （可选）对于**临时存储**，请输入要分配给任务的临时存储量。临时存储容量必须介于 21 GiB 到 200 GiB 之间。默认情况下，如果您不输入值，则会分配 20 GiB 的临时存储空间。
**注意**  
临时存储需要 Fargate 平台版本 1.4 或更高版本。

   1. 对于**执行角色**，请指定一个 IAM 角色，该角色授予 Amazon ECS 容器和 Fargate 代理代表您进行 AWS API 调用的权限。此功能使用 Amazon ECS IAM 角色来执行任务功能。有关更多信息，请参阅 *Amazon Elastic Container Service 开发人员指南* 中的 [Amazon ECS 任务执行 IAM 角色](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_execution_IAM_role.html)。

   1. 对于**作业尝试**，请输入 AWS Batch 尝试将作业移至某一 `RUNNABLE` 状态的次数。请输入 1 到 10 之间的数字。

   1. 可选）对于**重试策略条件**，选择**退出时添加评估**。至少输入一个参数值，然后选择一个**操作**。对于每组条件，必须将**操作**设置为**重试**或**退出**。这些操作意味着以下几点：
      + **重试** — AWS Batch 重试，直到达到您指定的任务尝试次数。
      + **退出** — AWS Batch 停止重试作业。
**重要**  
如果选择**退出时添加评估**，则必须至少配置一个参数并选择一个**操作**或选择**退出时移除评估**。

1. 选择**下一页**。

1. 在**容器配置**部分：

   1. 对于**映像**，选择要用于您的作业的 Docker 映像。默认情况下，Docker Hub 注册表中的映像可用。也可以使用`repository-url/image:tag`指定其他存储库。名称长度不超过 225 个字符。可以包含大小写字母、数字、连字符（-）、下划线（\$1）、冒号（:）、句点（.）、正斜杠（/）和数字符号（\$1）。此参数可映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的[创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的`Image`和[https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/)的`IMAGE`参数。
**注意**  
Docker 映像架构必须与为它们安排的计算资源的处理器架构相匹配。例如，基于 ARM 的 Docker 镜像只能在基于 ARM 的计算资源上运行。
      + Amazon ECR 公有存储库中的映像使用完整的`registry/repository[:tag]`或`registry/repository[@digest]`命名惯例（例如，`public.ecr.aws/registry_alias/my-web-app:latest`）。
      + Amazon ECR 存储库中的映像使用完整的`registry/repository[:tag]`命名惯例（例如，`aws_account_id.dkr.ecr.region.amazonaws.com``/my-web-app:latest`）。
      + Docker Hub 上的官方存储库中的映像使用单一名称 (例如，`ubuntu` 或 `mongo`)。
      + Docker Hub 上其他存储库中的映像通过组织名称（例如，`amazon/amazon-ecs-agent`）进行限定。
      + 其他在线存储库中的映像由域名（例如，`quay.io/assemblyline/ubuntu`）进行进一步限定。

   1. 对于**命令**，将命令的等效 JSON 字符串数组输入到该字段中。

      此参数映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) [创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的`Cmd`，以及[https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/)的`COMMAND`参数。有关该Docker`CMD`参数的更多信息，请参阅 reference [https://docs.docker.com/engine//builder/ \$1cmd](https://docs.docker.com/engine/reference/builder/#cmd)。
**注意**  
您可以在命令中使用参数替代默认值和占位符。有关更多信息，请参阅 [Parameters](job_definition_parameters.md#parameters)。

   1. （可选）将参数作为名称-值映射添加到作业定义中，以覆盖作业定义的默认值。若要添加参数：

      1. 对于**参数**，选择**添加参数**，输入名称-值对，然后选择**添加参数**。
**重要**  
如果选择**添加参数**，则必须至少配置一个参数或选择**移除参数**

   1. 在**环境配置**部分：

      

      1. 要**配置 Job 角色**，请选择有权访问的 IAM 角色 AWS APIs。此功能使用 Amazon ECS IAM 角色来执行任务功能。有关更多信息，请参阅 *Amazon Elastic Container Service 开发人员指南*中的[任务的 IAM 角色](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html)。
**注意**  
此处仅显示具有 **Amazon Elastic Container Service Task Role** 信任关系的角色。有关如何为您的 AWS Batch 任务创建 IAM 角色的更多信息，请参阅 A *mazon Elastic Container 服务开发者指南*[中的为任务创建 IAM 角色和策略](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html#create_task_iam_policy_and_role)。

      1. 对于 **v CPUs**，输入CPUs 要为容器保留的 v 数。此参数将映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的[创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的`CpuShares`以及[https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/)的`--cpu-shares`选项。每个 vCPU 相当于 1024 个 CPU 份额。您必须指定至少一个 vCPU。

      1. 对于**内**存，输入容器可用的内存限制。如果您的容器尝试使用超出此处指定的内存，该容器将被终止。此参数将映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的[创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的`Memory`以及[https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/)的`--memory`选项。您必须为作业指定至少 4 MiB 内存。

         如果您使用 GuardDuty 运行时监控，则 GuardDuty 安全代理会有轻微的内存开销。因此，内存限制必须包括 GuardDuty安全代理的大小。有关 GuardDuty 安全代理内存限制的信息，请参阅《*GuardDuty 用户指南》*中的 [CPU 和内存限制](https://docs.aws.amazon.com/guardduty/latest/ug/prereq-runtime-monitoring-ecs-support.html#ecs-runtime-agent-cpu-memory-limits)。有关最佳实践的信息，请参阅《Amazon ECS 开发人员指南》**中的[启用运行时监控后，如何解决 Fargate 任务中的内存不足错误](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-guard-duty-troubleshooting.html#memory-error)。
**注意**  
要最大限度地提高资源利用率，请为特定实例类型的作业确定内存优先级。有关更多信息，请参阅 [计算资源内存管理](memory-management.md)。

   1. （可选）对于**环境变量**，选择**添加环境变量**以名称-值对的形式添加环境变量。这些变量传递给容器。

   1. （可选）对于**密钥**，选择**添加密钥**，将密钥添加为名称-值对。这些密钥暴露在容器中。[欲了解更多信息，请参阅：LogConfiguration秘密选项。](https://docs.aws.amazon.com/batch/latest/APIReference/API_LogConfiguration.html#Batch-Type-LogConfiguration-secretOptions)

   1. 选择**下一页**。

1. （可选）在 **Linux 配置**部分中：

   1. 对于**用户**，输入要在容器内使用的用户名。

   1. 开启**启用初始化进程**以在容器内运行初始化进程。该进程转发信号和获得进程。

   1. 开启**启用只读文件系统**以移除对卷的写入权限。

   1. （可选）展开**其他配置**。

   1. 对于**装载点配置**，请选择**添加装载点配置**以添加数据卷的装载点。您必须指定源卷和容器路径。这些装载点会传递到容器实例上的 Docker daemon。

   1. 对于**卷配置**，请选择**添加卷**以创建要传递到容器的卷列表。输入卷的**名称**和**源路径**，然后选择**添加卷**。

   1. 在**任务属性**部分中：

      1. 对于**执行角色（视情况而定**），选择一个角色以允许 Amazon ECS 代理代表您进行 AWS API 调用。有关创建**执行角色**的更多信息，请参阅[教程：创建 IAM 执行角色](create-execution-role.md)。

      1. 选择**启用 ECS execute 命令**，以实现直接访问 Amazon ECS 容器 Shell 并绕过主机操作系统。必须选择一个**任务角色**。
**重要**  
**ECS execute** 命令要求文件系统是可写的。

      1. 对于**任务角色**，选择一个 Amazon ECS 身份和访问管理 (IAM) Access Management 角色以允许容器代表 AWS 您进行 API 调用。有关更多信息，请参阅《Amazon Elastic Container Service 开发人员指南》中的 [Amazon ECS 任务 IAM 角色](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html)**。

   1. 在**日志配置**部分：

      1. （可选）对于**日志驱动程序**，选择要使用的日志驱动程序。[有关可用日志驱动程序的更多信息，请参阅:LogConfigurationlogDriver。](https://docs.aws.amazon.com/batch/latest/APIReference/API_LogConfiguration.html#Batch-Type-LogConfiguration-logDriver)
**注意**  
默认情况下，使用 `awslogs` 日志驱动程序。

      1. （可选）在**选项**中，选择**添加选项**以添加选项。输入名称-值对，然后选择**添加选项**。

      1. （可选）对于**密钥**，选择**添加密钥**以添加密钥。然后，输入名称-值对，并选择**添加密钥**。
**提示**  
[欲了解更多信息，请参阅：LogConfiguration秘密选项。](https://docs.aws.amazon.com/batch/latest/APIReference/API_LogConfiguration.html#Batch-Type-LogConfiguration-secretOptions)

1. 选择**下一页**。

1. 对于**作业定义查看**，请查看配置步骤。如果需要进行更改，请选择 **Edit**（编辑）。完成后，选择**创建作业定义**。

# 在 Amazon EKS 资源上创建单节点作业定义
<a name="create-job-definition-eks"></a>

完成以下步骤，在 Amazon Elastic Kubernetes Service（Amazon EKS）上创建单节点作业定义。

**要在 Amazon EKS 资源上创建新的作业定义，请执行以下操作：**

1. 打开 AWS Batch 控制台，网址为[https://console.aws.amazon.com/batch/](https://console.aws.amazon.com/batch/)。

1. 从顶部导航栏中选择 AWS 区域 要使用的。

1. 在左侧导航窗格中，选择**作业定义**。

1. 选择**创建**。

1. 对于**编排类型**，选择 **Elastic Kubernetes Service (EKS)**。

1. 对于**名称**，为您的作业定义输入唯一名称。名称长度不超过 128 个字符。可以包含大小写字母、数字、连字符（-）和下划线（\$1）。

1. （可选）对于**执行超时**，输入超时值（以秒为单位）。执行超时是指未完成的作业终止之前的时间长度。如果某次尝试超过了超时时间，该尝试将停止，状态将转为 `FAILED`。有关更多信息，请参阅 [作业超时](job_timeouts.md)。最小值为 60 秒。

1. （可选）开启**计划优先级**。输入介于 0 到 100 之间的计划优先级值。值越高，相较于较低值的优先级越高。

1. （可选）展开 **标签**，然后选择**添加标签**以向资源添加标签。

1. 选择**下一页**。

1. 在 **EKS pod 属性**部分中：

   1. 在**服务账户名称**中，输入为在 pod 中运行的进程提供身份的账户。

   1. 打开**主机网络**以使用 Kubernetes pod 网络模型，并为传入的连接打开侦听端口。仅对传出通信关闭此设置。

   1. 对于** DNS 策略**，选择以下选项之一：
      + **无值（空）** - pod 忽略 Kubernetes 环境中的 DNS 设置。
      + **默认** — pod 从其运行的节点继承名称解析配置。
**注意**  
如果未指定 DNS 策略，则**默认**不是默认 DNS 策略。而是使用**ClusterFirst**了。
      + **ClusterFirst**— 任何与配置的集群域后缀不匹配的 DNS 查询都将转发到继承自该节点的上游域名服务器。
      + **ClusterFirstWithHostNet**— 如果**主机网络**已开启，则使用。

   1. （可选）对于**卷**，选择**添加卷**，然后执行以下操作：

      1. 为您的卷添加一个**名称**。

      1. （可选）添加主机该目录的**主机路径**。

      1. （可选）添加**中等**和**大小限制**来配置 [Kubernetes emptyDir](https://kubernetes.io/docs/concepts/storage/volumes/#emptydir)。

      1. （可选）提供容器组的**密钥名称**并选择该密钥是否为**可选**。

      1. （可选）定义一个**声明名称**以将 Kubernetes [持久卷声明](https://kubernetes.io/docs/concepts/storage/persistent-volumes/)附加到该容器组，并选择该容器组是否为**只读**。

   1. （可选）对于**容器组（pod）标签**，选择**添加容器组（pod）标签**，然后输入名称/值对。
**重要**  
容器组（pod）标签的前缀不能包含 `kubernetes.io/`、`k8s.io/` 或 `batch.amazonaws.com/`。

   1. （可选）对于**容器组注释**，选择**添加注释**，然后输入名称-值对。
**重要**  
容器组标注的前缀不能包含 `kubernetes.io/`、`k8s.io/` 或 `batch.amazonaws.com/`。

   1. 选择**下一页**。

   1. 在**容器配置**部分：

      1. 对于**名称**，输入容器的名称。该名称必须以字母或数字开头，并且最多可以包含 25 个字符。可以包含大小写字母、数字和连字符。

      1. 对于**映像**，选择要用于您的作业的 Docker 映像。默认情况下，Docker Hub 注册表中的映像可用。也可以使用`repository-url/image:tag`指定其他存储库。名称最多可以有 255 个字符。可以包含大小写字母、数字、连字符（-）、下划线（\$1）、冒号（:）、句点（.）、正斜杠（/）和数字符号（\$1）。此参数可映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的[创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的 `Image` 和 [https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/) 的 `IMAGE` 参数。
**注意**  
Docker 映像架构必须与为它们安排的计算资源的处理器架构相匹配。例如，基于 ARM 的 Docker 镜像只能在基于 ARM 的计算资源上运行。
         + Amazon ECR 公有存储库中的映像使用完整的`registry/repository[:tag]`或`registry/repository[@digest]`命名惯例（例如，`public.ecr.aws/registry_alias/my-web-app:latest`）。
         + Amazon ECR 存储库中的映像使用完整的`registry/repository[:tag]`命名惯例（例如，`aws_account_id.dkr.ecr.region.amazonaws.com``/my-web-app:latest`）。
         + Docker Hub 上的官方存储库中的映像使用单一名称 (例如，`ubuntu` 或 `mongo`)。
         + Docker Hub 上其他存储库中的映像通过组织名称（例如，`amazon/amazon-ecs-agent`）进行限定。
         + 其他在线存储库中的映像由域名（例如，`quay.io/assemblyline/ubuntu`）进行进一步限定。

      1. （可选）对于**映像提取策略**，请选择何时提取映像。

      1. （可选）对于**命令**，输入要传递到容器的 JSON 命令。

      1. （可选）在**参数**中输入要传递给容器的参数。如果未提供参数，则使用容器映像命令。

   1. （可选）您可以将参数作为名称值映射添加到作业定义中，以覆盖作业定义的默认值。若要添加参数：

      1. 在**参数**中，输入名称/值对，然后选择**添加参数**。
**重要**  
如果选择**添加参数**，则必须至少配置一个参数或选择**移除参数**。

   1. 在**环境配置**部分：

      1. 对于 **v CPUs**，输入CPUs 要为容器保留的 v 数。此参数将映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的[创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的`CpuShares`以及[https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/)的`--cpu-shares`选项。每个 vCPU 相当于 1024 个 CPU 份额。您必须指定至少一个 vCPU。

      1. 对于**内存**，输入容器可用的内存限制。如果您的容器尝试使用超出此处指定的内存，该容器将被终止。此参数将映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的[创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的`Memory`以及[https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/)的`--memory`选项。您必须为作业指定至少 4 MiB 内存。
**注意**  
要最大限度地提高资源利用率，请为特定实例类型的作业确定内存优先级。有关更多信息，请参阅 [计算资源内存管理](memory-management.md)。

   1. （可选）对于**环境变量**，选择**添加环境变量**以名称-值对的形式添加环境变量。这些变量传递给容器。

   1. （可选）对于**卷装载**：

      1. 选择**添加卷装载**。

      1. 输入**名称**，然后在装入卷的容器中输入**装载路径**。输入 a **SubPath**以指定被引用卷内的子路径，而不是其根路径。

      1. 选择**只读**可删除该卷的写入权限。

      1. 选择**添加卷装载**。

   1. （可选）在**以用户身份运行**中，输入用户 ID 以运行容器进程。
**注意**  
映像中必须存在用户 ID，容器才能运行。

   1. （可选）在**分组运行**中，输入组 ID 以运行容器进程。
**注意**  
映像中必须存在群组 ID，容器才能运行。

   1. （可选）要为您的作业容器授予对主机实例的提升权限（类似于 `root` 用户），请选择 **特权**。此参数将映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的[创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的`Privileged`以及[https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/)的`--privileged`选项。

   1. （可选）打开**只读根文件系统**以删除对根文件系统的写入权限。

   1. （可选）开启**以非根用户身份运行**，从而以非根用户身份运行 pod 中的容器。
**注意**  
如果启用**以非根用户身份运行**，则 kubelet 会在运行时验证映像以查证该映像不是以 UID 0 运行的。

   1. 选择**下一页**。

1. 对于**作业定义查看**，请查看配置步骤。如果需要进行更改，请选择 **Edit**（编辑）。完成后，选择**创建作业定义**。

# 在 Amazon EC2 资源上创建使用多个容器的单节点作业定义
<a name="create-job-definition-single-node-multi-container"></a>

完成以下步骤，在 Amazon Elastic Compute Cloud（Amazon EC2）资源上创建具有多个容器的单节点作业定义。

**要在 Amazon EC2 资源上创建新的作业定义，请执行以下操作：**

1. 打开 AWS Batch 控制台，网址为[https://console.aws.amazon.com/batch/](https://console.aws.amazon.com/batch/)。

1. 从导航栏中选择 AWS 区域 要使用的。

1. 在左侧导航窗格中，选择**作业定义**。

1. 选择**创建**。

1. 对于**编排类型**，选择 **Amazon Elastic Compute Cloud (Amazon EC2)**。

1. 对于**作业定义结构**，请禁**使用传统的 containerProperties 结构**处理。

1. 对于 **EC2 平台配置**，请关闭**启用多节点并行**处理。

1. 选择**下一步**。

1. 在**常规配置**部分中，输入以下内容：

   1. 对于**名称**，为您的作业定义输入唯一名称。名称长度不超过 128 个字符。可以包含大小写字母、数字、连字符（-）和下划线（\$1）。

   1. 对于**执行超时 – *可选***，输入超时值（以秒为单位）。执行超时是指未完成的作业终止之前的时间长度。如果某次尝试超过了超时时间，该尝试将停止，状态将转为 `FAILED`。有关更多信息，请参阅 [作业超时](job_timeouts.md)。最小值为 60 秒。

   1. 开启**调度优先级 – *可选***。输入介于 0 到 100 之间的计划优先级值。值越高，优先级越高。

   1. 展开**标签 – *可选***，然后选择**添加标签**以向该资源添加标签。输入键和可选的值，然后选择**添加标签**。

   1. 开启**传播标签**，以将标签从作业和作业定义传播到 Amazon ECS 任务。

1. 在**重试策略 – *可选***部分中，输入以下内容：

   1. 对于**作业尝试**，请输入 AWS Batch 尝试将作业移至 `RUNNABLE` 状态的次数。请输入 1 到 10 之间的数字。

   1. 对于**重试策略条件**，选择**添加退出时评估**。至少输入一个参数值，然后选择一个**操作**。对于每组条件，必须将**操作**设置为**重试**或**退出**。这些操作意味着以下几点：
      + **重试** — AWS Batch 重试，直到达到您指定的任务尝试次数。
      + **退出** — AWS Batch 停止重试作业。
**重要**  
如果选择**退出时添加评估**，则必须至少配置一个参数并选择一个**操作**或选择**退出时移除评估**。

1. 在**任务属性**部分中，输入以下内容：

   1. 对于**执行角色（视情况而*定***），选择一个角色以允许 Amazon ECS 代理代表您进行 AWS API 调用。有关创建**执行角色**的更多信息，请参阅[教程：创建 IAM 执行角色](create-execution-role.md)。

   1. 选择**启用 ECS execute 命令**，以实现直接访问 Amazon ECS 容器 Shell 并绕过主机操作系统。必须选择一个**任务角色**。
**重要**  
**ECS execute** 命令要求文件系统是可写的。

   1. 对于**任务角色**，选择一个 Amazon ECS 身份和访问管理 (IAM) Access Management 角色以允许容器代表 AWS 您进行 API 调用。有关更多信息，请参阅《Amazon Elastic Container Service 开发人员指南》中的 [Amazon ECS 任务 IAM 角色](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html)**。

   1. 对于 **IPC 模式**，选择 `host`、`task` 或 `none`。如果指定了 `host`，则在同一容器实例上指定了主机 IPC 模式的任务中的所有容器将与主机 Amazon EC2 实例共享相同的 IPC 资源。如果指定了任务，则指定任务中的所有容器将共享相同的 IPC 资源。如果指定了任何选项，则任务的容器中的 IPC 资源是私有的，不与任务中或容器实例上的其他容器共享。如果未指定任何值，则 IPC 资源命名空间共享取决于容器实例上的 Docker 进程守护程序设置。

   1. 对于 **PID 模式**，选择 `host` 或 `task`。例如，监控 sidecar 可能需要 `pidMode` 访问有关在同一任务中运行的其他容器的信息。如果指定了 `host`，则在同一容器实例上指定了主机 PID 模式的任务中的所有容器将与主机 Amazon EC2 实例共享相同的进程命名空间。如果指定了 `task`，则指定任务中的所有容器将共享相同的过程命名空间。如果未指定任何值，则默认值为每个容器的私有命名空间。

1. 在**消耗性资源**部分中，输入以下内容：

   1. 输入唯一的**名称**和**已请求的值**。

   1. 您可以通过选择**添加消耗性资源**来添加更多消耗性资源。

1. 在**存储**部分中，输入以下设置：

   1. 输入卷的**名称**和**源路径**，然后选择**添加卷**。您也可以选择开启启用 EFS。

   1. 您可以通过选择**添加卷**来添加更多卷。

1. 对于**参数**，选择**添加参数**以添加参数替换占位符，作为**键**（可选的）**值**对。

1. 选择**下一页**。

1. 在**容器配置**部分：

   1. 对于 **Name**（名称），输入容器的名称。

   1. 对于**基本容器**，如果该容器为必需，则启用该容器。

   1. 对于**映像**，选择要用于您的作业的 Docker 映像。默认情况下，Docker Hub 注册表中的映像可用。也可以使用`repository-url/image:tag`指定其他存储库。名称长度不超过 225 个字符。可以包含大小写字母、数字、连字符（-）、下划线（\$1）、冒号（:）、正斜杠（/）和数字符号（\$1）。此参数可映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的[创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的`Image`和[https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/)的`IMAGE`参数。
**注意**  
Docker 映像架构必须与为它们安排的计算资源的处理器架构相匹配。例如，基于 ARM 的 Docker 镜像只能在基于 ARM 的计算资源上运行。
      + Amazon ECR 公有存储库中的映像使用完整的`registry/repository[:tag]`或`registry/repository[@digest]`命名惯例（例如，`public.ecr.aws/registry_alias/my-web-app:latest`）。
      + Amazon ECR 存储库中的映像使用完整的`registry/repository[:tag]`命名惯例（例如，`aws_account_id.dkr.ecr.region.amazonaws.com``/my-web-app:latest`）。
      + Docker Hub 上的官方存储库中的映像使用单一名称 (例如，`ubuntu` 或 `mongo`)。
      + Docker Hub 上其他存储库中的映像通过组织名称（例如，`amazon/amazon-ecs-agent`）进行限定。
      + 其他在线存储库中的映像由域名（例如，`quay.io/assemblyline/ubuntu`）进行进一步限定。

   1. 对于**资源要求**，配置以下各项参数：

      1. 对于 **v CPUs**，选择容 CPUs 器的编号。

      1. 对于**内存**，选择容器的内存量。

      1. 对于 **GPU-*可选***，选择容 GPUs 器的数量。

   1. 对于 **User**，输入要在容器内使用的用户名。

   1. 开启**启用只读文件系统**以移除对卷的写入权限。

   1. 开启**特权**，以在主机实例上授予作业容器升级权限，类似于根用户。

   1. 对于**命令**，将命令的等效 **JSON** 字符串数组输入到该字段中。

      此参数映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) [创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的`Cmd`，以及[https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/)的`COMMAND`参数。有关该Docker`CMD`参数的更多信息，请参阅 reference [https://docs.docker.com/engine//builder/ \$1cmd](https://docs.docker.com/engine/reference/builder/#cmd)。
**注意**  
您可以在命令中使用参数替代默认值和占位符。有关更多信息，请参阅 [Parameters](job_definition_parameters.md#parameters)。

   1. 对于**存储库凭证 – *可选***，输入包含您的凭证的密钥的 ARN。

   1. 对于**环境变量 *可选***，选择**添加环境变量**以添加要传递到容器的环境变量。

   1. 在 **Linux 参数 – *可选***部分中：

      1. 开启**启用初始化进程**以在容器内运行初始化进程。

      1. 对于**共享内存大小**，输入 /dev/shm 卷的大小（以 MiB 为单位）。

      1. 在**最大交换大小**中，输入容器可使用的总交换内存量（以 MiB 为单位）。

      1. 在 **Swappiness** 中输入一个介于 0 和 100 之间的值，以指示容器的 swappiness 行为。如果不指定值且启用了交换，则值默认值为 60。

      1. 对于**设备**，选择**添加设备**以添加设备：

         1. 对于**容器路径**，指定容器实例中的路径以公开映射到主机实例的设备。如果将其留空，则在容器中使用主机路径。

         1. 对于**主机路径**，指定主机实例中设备的路径。

         1. 对于**权限**，选择要应用于设备的一个或多个权限。可用权限包括**读取**、**写入**和 **MKNOD**。

      1. 对于 **Tmpfs**，请选择**添加 tmpfs** 以添加 `tmpfs` 挂载。

   1. 
**注意**  
Firelens 日志记录必须在专用容器中进行。配置 Firelens 日志记录：  
在除专用 firelens 容器之外的每个容器中，将**日志记录驱动程序**设置为 `awsfirelens`
在您的 Firelens 容器中，将 **Firelens 配置 – 可选**和**日志记录配置 – *可选***设置为日志记录的目标

      在 **Linux 配置 – 可选**部分中：
**重要**  
AWS Batch 在非 MNP、非 Fargate 的 Amazon ECS 作业上强制执行`host`网络模式。Amazon ECS Firelen [必须使用根用户](https://github.com/aws/aws-for-fluent-bit/blob/mainline/troubleshooting/debugging.md#amazon-ecs-firelens-root-is-required)。运行使用 `host` 网络模式的作业时，Amazon ECS 建议不要使用根用户（UID 0）运行容器，以[提供安全性](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#network_mode)。因此，所有使用 Firelens 日志记录的非 MNP、非 Fargate ECS 作业都不符合安全最佳实践。

      1. 对于**类型**，选择 `fluentd`或 `fluentbit`。

      1. 在 **“选项**” 中，输入选项的 name/value 配对。您可以使用**已添加的选项**来添加其他**选项**。

   1.  在**日志记录配置 – *可选***部分中：

      1. 对于**日志驱动程序**，请选择要使用的日志驱动程序。[有关可用日志驱动程序的更多信息，请参阅:LogConfigurationlogDriver。](https://docs.aws.amazon.com/batch/latest/APIReference/API_LogConfiguration.html#Batch-Type-LogConfiguration-logDriver)
**注意**  
默认情况下，使用 `awslogs` 日志驱动程序。

      1. 在**选项**中，选择**添加选项**以添加选项。输入名称-值对，然后选择**添加选项**。

      1. 对于**密钥**，选择**添加密钥**。输入名称-值对，然后选择**添加密钥**以添加密钥。
**提示**  
[欲了解更多信息，请参阅：LogConfiguration秘密选项。](https://docs.aws.amazon.com/batch/latest/APIReference/API_LogConfiguration.html#Batch-Type-LogConfiguration-secretOptions)

   1. 对于**挂载点 – *可选***，选择**添加挂载点**以添加数据卷的挂载点。您必须指定源卷和容器路径。

   1. 对于**密钥 – *可选***，选择**添加密钥**以添加密钥。然后，输入名称-值对，并选择**添加密钥**。
**提示**  
[欲了解更多信息，请参阅：LogConfiguration秘密选项。](https://docs.aws.amazon.com/batch/latest/APIReference/API_LogConfiguration.html#Batch-Type-LogConfiguration-secretOptions)

   1. 对于 **Ulimits – *可选***，选择**添加 ulimit** 为容器添加一个 `ulimits` 值。输入**名称**、**软限制**和**硬限制**值，然后选择**添加 ulimit**。

   1. 对于**依赖项 – *可选***，选择**添加容器依赖项**。选择容器名称，其状态决定了此容器何时会启动。

1. 如果只配置了一个容器，则必须选择**添加容器**并完成新容器的配置。否则，请选择**下一步**进行检查。

# 创建多节点并行作业定义
<a name="create-multi-node-job-def"></a>

必须先创建作业定义 AWS Batch，然后才能在中运行作业。对于单节点并行作业和多节点并行作业，此过程略有不同。本主题专门介绍如何为 AWS Batch 多节点 parallel 作业（也称为*群组调度*）创建任务定义。有关更多信息，请参阅 [多节点并行作业](multi-node-parallel-jobs.md)。

**注意**  
AWS Fargate 不支持多节点并行作业。

**Topics**
+ [教程：在 Amazon EC2 资源上创建多节点并行作业定义](multi-node-job-def-ec2.md)

# 教程：在 Amazon EC2 资源上创建多节点并行作业定义
<a name="multi-node-job-def-ec2"></a>

在 Amazon Elastic Compute Cloud（Amazon EC2）资源上创建多节点并行作业定义。

**注意**  
要创建*单节点*作业定义，请参阅 [在 Amazon EC2 资源上创建单节点作业定义](create-job-definition-EC2.md)。

**要在 Amazon EC2 资源上创建多节点并行作业定义，请执行以下操作：**

1. 打开 AWS Batch 控制台，网址为[https://console.aws.amazon.com/batch/](https://console.aws.amazon.com/batch/)。

1. 在导航栏中，选择 AWS 区域 要使用的。

1. 在导航窗格中，选择**作业定义**。

1. 选择**创建**。

1. 对于**编排类型**，选择 **Amazon Elastic Compute Cloud (Amazon EC2)**。

1. 对于**启用多节点并行**，请打开多节点并行。

1. 对于**名称**，为您的作业定义输入唯一名称。名称可以长达 128 个字符，并且可以包含大小写字母、数字、连字符 (-) 和下划线 (\$1)。

1. （可选）对于 **执行超时**，指定您希望作业尝试运行的最大秒数。如果某次尝试超过了超时时间，该尝试将停止，状态将转为 `FAILED`。有关更多信息，请参阅 [作业超时](job_timeouts.md)。

1. （可选）开启**计划优先级**。输入介于 0 到 100 之间的计划优先级值。值越高，相较于较低值的优先级越高。

1. （可选）对于**作业尝试**，请输入 AWS Batch 尝试将作业移至 `RUNNABLE` 状态的次数。请输入 1 到 10 之间的数字。

1. （可选）对于**重试策略条件**，选择**退出时添加评估**。至少输入一个参数值，然后选择一个**操作**。对于每组条件，必须将**操作**设置为**重试**或**退出**。这些操作意味着以下几点：
   + **重试** — AWS Batch 重试，直到达到您指定的任务尝试次数。
   + **退出** — AWS Batch 停止重试作业。
**重要**  
如果选择**退出时添加评估**，则必须至少配置一个参数并选择一个**操作**或选择**退出时移除评估**。

1. （可选）展开**标签**，然后选择**添加标签**以向资源添加标签。输入键和可选的值，然后选择**添加标签**。（可选）您也可开启**传播标签**，将标签从作业和作业定义传播到 Amazon ECS 任务。

1. 选择**下一页**。

1. 对于 **Number of nodes (节点数)**，输入要用于作业的节点的总数。

1. 对于 **Main node (主节点)**，输入要用于主节点的节点索引。默认主节点索引为 `0`。

1. 对于**实例类型**，选择实例类型。
**注意**  
您选择的实例类型适用于所有节点。

1. 对于**参数**，选择**添加参数**以添加参数替换占位符，作为**键**（可选的）**值**对。

1. 在**节点范围**部分中：

   1. 选择**添加节点范围**。这将创建**节点范围**部分。

   1. 对于 **Target nodes (目标节点)**，使用 `range_start:range_end` 表示法为节点组指定范围。

      对于您为作业指定的节点，您可以创建最多 5 个节点范围。节点范围使用节点的索引值，并且节点索引从 0 开始。确保最终节点组的范围结束索引值比您指定的节点数少一。例如，假设您指定了 10 个节点，并且想要使用单个节点组。然后，您的终止范围是 9。

   1. 对于**映像**，选择要用于您的作业的 Docker 映像。默认情况下，Docker Hub 注册表中的映像可用。也可以使用`repository-url/image:tag`指定其他存储库。名称最多可以有 255 个字符。可以包含大小写字母、数字、连字符（-）、下划线（\$1）、冒号（:）、正斜杠（/）和数字符号（\$1）。此参数可映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的[创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的`Image`和[https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/)的`IMAGE`参数。
**注意**  
Docker 映像架构必须与为它们安排的计算资源的处理器架构相匹配。例如，基于 ARM 的 Docker 镜像只能在基于 ARM 的计算资源上运行。
      + Amazon ECR 公有存储库中的映像使用完整的`registry/repository[:tag]`或`registry/repository[@digest]`命名惯例（例如，`public.ecr.aws/registry_alias/my-web-app:latest`）。
      + Amazon ECR 存储库中的映像使用完整的`registry/repository[:tag]`命名惯例。例如，`aws_account_id.dkr.ecr.region.amazonaws.com``/my-web-app:latest`
      + Docker Hub 上的官方存储库中的映像使用单一名称 (例如，`ubuntu` 或 `mongo`)。
      + Docker Hub 上其他存储库中的映像通过组织名称（例如，`amazon/amazon-ecs-agent`）进行限定。
      + 其他在线存储库中的映像由域名（例如，`quay.io/assemblyline/ubuntu`）进行进一步限定。

   1. 对于**命令**，将命令的等效 **JSON** 字符串数组输入到该字段中。

      此参数映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) [创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的`Cmd`，以及[https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/)的`COMMAND`参数。有关该Docker`CMD`参数的更多信息，请参阅 reference [https://docs.docker.com/engine//builder/ \$1cmd](https://docs.docker.com/engine/reference/builder/#cmd)。
**注意**  
您可以在命令中使用参数替代默认值和占位符。有关更多信息，请参阅 [Parameters](job_definition_parameters.md#parameters)。

   1. 对于 **v CPUs**，指定要为容器保留的 v CPUs 数。此参数将映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的[创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的`CpuShares`以及[https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/)的`--cpu-shares`选项。每个 vCPU 相当于 1024 个 CPU 份额。您必须指定至少一个 vCPU。

   1. 对于 **Memory**，指定要提供给作业容器的内存硬限制 (以 MiB 为单位)。如果您的容器尝试使用超出此处指定的内存，该容器将被终止。此参数将映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的[创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的`Memory`以及[https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/)的`--memory`选项。您必须为作业指定至少 4 MiB 内存。
**注意**  
您可以尝试通过为作业提供尽可能多的用于特定实例类型的内存来最大程度地利用资源。有关更多信息，请参阅 [计算资源内存管理](memory-management.md)。

   1. （可选）在 “**数量**” 中 GPUs，指定 GPUs 您的作业使用次数。该作业在一个容器上运行，该容器上固定了指定数量的 GPUs 容器。

   1. （可选）对于 **Job 角色**，您可以指定一个 IAM 角色，为任务中的容器提供使用权限 AWS APIs。此功能使用 Amazon ECS IAM 角色来执行任务功能。有关更多信息（包括配置先决条件），请参阅 *Amazon Elastic Container Service 开发人员指南*中的[任务中的 IAM 角色](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html)。
**注意**  
对于在 Fargate 资源上运行的作业，需要作业角色。
**注意**  
此处仅显示具有 **Amazon Elastic Container Service Task Role** 信任关系的角色。有关为您的 AWS Batch 任务创建 IAM 角色的更多信息，请参阅 A *mazon Elastic Container 服务开发者指南*[中的为任务创建 IAM 角色和策略](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html#create_task_iam_policy_and_role)。

   1. （可选）对于**执行角色**，请指定一个 IAM 角色，该角色授予 Amazon ECS 容器代理代表您进行 AWS API 调用的权限。此功能使用 Amazon ECS IAM 角色来执行任务功能。有关更多信息，请参阅 *Amazon Elastic Container Service 开发人员指南*中的 [Amazon ECS 任务执行 IAM 角色](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_execution_IAM_role.html)。

1. （可选）展开**其他配置**：

   1. 对于**环境变量**，选择**添加环境变量**以名称-值对的形式添加环境变量。这些变量传递给容器。

   1. 要**配置 Job 角色**，您可以指定一个 IAM 角色，为任务中的容器提供使用权限 AWS APIs。此功能使用 Amazon ECS IAM 角色来执行任务功能。有关更多信息（包括配置先决条件），请参阅 *Amazon Elastic Container Service 开发人员指南*中的[任务中的 IAM 角色](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html)。
**注意**  
对于在 Fargate 资源上运行的作业，需要作业角色。
**注意**  
此处仅显示具有 **Amazon Elastic Container Service Task Role** 信任关系的角色。有关为 AWS Batch 作业创建 IAM 角色的更多信息，请参阅 *Amazon Elastic Container Service 开发人员指南*中的[为任务创建 IAM 角色和策略](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html#create_task_iam_policy_and_role)。

   1. 对于**执行角色**，请指定一个 IAM 角色，该角色授予 Amazon ECS 容器代理代表您进行 AWS API 调用的权限。此功能使用 Amazon ECS IAM 角色来执行任务功能。有关更多信息，请参阅 *Amazon Elastic Container Service 开发人员指南*中的 [Amazon ECS 任务执行 IAM 角色](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_execution_IAM_role.html)。

1. 在**安全配置**部分：

   1. （可选）要为您的作业容器授予对主机实例的提升权限（类似于 `root` 用户），请启用 **特权**。此参数将映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的[创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的`Privileged`以及[https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/)的`--privileged`选项。

   1. （可选）对于**用户名**，输入要在容器内使用的用户名。此参数将映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的[创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的`User`以及[https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/)的`--user`选项。

   1. （可选）对于**密钥**，选择**添加密钥**，将密钥添加为名称-值对。这些密钥暴露在容器中。[欲了解更多信息，请参阅：LogConfiguration秘密选项。](https://docs.aws.amazon.com/batch/latest/APIReference/API_LogConfiguration.html#Batch-Type-LogConfiguration-secretOptions)

1. 在 **Linux 配置**部分中：

   1. 开启**启用只读文件系统**以移除对卷的写入权限。

   1. （可选）开启**启用 init 进程**以在容器内运行 `init` 进程。该进程转发信号和获得进程。

   1. 在**共享内存大小**中，输入 `/dev/shm` 卷的大小（以 MiB 为单位）。

   1. 在**最大交换大小**中，输入容器可使用的总交换内存量（以 MiB 为单位）。

   1. 在 **Swappiness** 中输入一个介于 0 和 100 之间的值，以指示容器的 swappiness 行为。如果不指定值且启用了交换，则值默认值为 60。[有关更多信息，请参阅:交换性LinuxParameters。](https://docs.aws.amazon.com/batch/latest/APIReference/API_LinuxParameters.html#Batch-Type-LinuxParameters-swappiness)

   1. （可选）对于**设备**，选择**添加设备**以添加设备：

      1. 对于**容器路径**，指定容器实例中的路径以公开映射到主机实例的设备。如果将其留空，则在容器中使用主机路径。

      1. 对于**主机路径**，指定主机实例中设备的路径。

      1. 对于**权限**，选择要应用于设备的一个或多个权限。可用权限包括**读取**、**写入**和 **MKNOD**。

1. （可选）对于**挂载点**，请选择**添加挂载点配置**以添加数据卷的挂载点。您必须指定源卷和容器路径。这些挂载点会传递到容器实例上的 Docker 进程守护程序。您也可以选择将卷设为**只读**。

1. （可选）对于 **Ulimits 配置**，请选择**添加 ulimit** 为容器添加一个 `ulimits` 值。输入**名称**、**软限制**和**硬限制**值，然后选择**添加 ulimit**。

1. （可选）对于**卷配置**，请选择**添加卷**以创建要传递到容器的卷列表。输入卷的**名称**和**源路径**，然后选择**添加卷**。您也可以选择开启**启用 EFS**。

1. （可选）对于 **Tmpfs**，请选择**添加 tmpfs** 以添加 `tmpfs` 挂载。

1. 在**任务属性**部分中：

   1. 对于**执行角色（视情况而定**），选择一个角色以允许 Amazon ECS 代理代表您进行 AWS API 调用。有关创建**执行角色**的更多信息，请参阅[教程：创建 IAM 执行角色](create-execution-role.md)。

   1. 
**重要**  
要使用 **ECS execute 命令**，您的计算环境必须满足[多节点并行作业的计算环境注意事项](mnp-ce.md)部分的说明。

      选择**启用 ECS execute 命令**，以实现直接访问 Amazon ECS 容器 Shell 并绕过主机操作系统。必须选择一个**任务角色**。
**重要**  
**ECS execute** 命令要求文件系统是可写的。

   1. 对于**任务角色**，选择一个 Amazon ECS 身份和访问管理 (IAM) Access Management 角色以允许容器代表 AWS 您进行 API 调用。有关更多信息，请参阅《Amazon Elastic Container Service 开发人员指南》中的 [Amazon ECS 任务 IAM 角色](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html)**。

1. （可选）在**日志记录配置**部分：

   1. 对于**日志驱动程序**，请选择要使用的日志驱动程序。[有关可用日志驱动程序的更多信息，请参阅:LogConfigurationlogDriver。](https://docs.aws.amazon.com/batch/latest/APIReference/API_LogConfiguration.html#Batch-Type-LogConfiguration-logDriver)
**注意**  
默认情况下，使用 `awslogs` 日志驱动程序。

   1. 在**选项**中，选择**添加选项**以添加选项。输入名称-值对，然后选择**添加选项**。

   1. 对于**密钥**，选择**添加密钥**。输入名称-值对，然后选择**添加密钥**以添加密钥。
**提示**  
[欲了解更多信息，请参阅：LogConfiguration秘密选项。](https://docs.aws.amazon.com/batch/latest/APIReference/API_LogConfiguration.html#Batch-Type-LogConfiguration-secretOptions)

1. 选择**下一页**。

1. 对于**作业定义查看**，请查看配置步骤。如果需要进行更改，请选择 **Edit**（编辑）。完成后，选择**创建作业定义**。

# 使用 ContainerProperties 的作业定义模板
<a name="job-definition-template"></a>

以下是一个空的作业定义模板，其中包含一个容器。您可以使用此模板创建任务定义，随后可将任务定义保存到文件并与 AWS CLI `--cli-input-json` 选项结合使用。有关这些参数的更多信息，请参阅 [JobDefinition](https://docs.aws.amazon.com/batch/latest/APIReference/API_JobDefinition.html)。

**注意**  
您可以使用以下 AWS CLI 命令生成单容器作业定义模板：  

```
$ aws batch register-job-definition --generate-cli-skeleton
```

```
{
    "jobDefinitionName": "",
    "type": "container",
    "parameters": {
        "KeyName": ""
    },
    "schedulingPriority": 0,
    "containerProperties": {
        "image": "",
        "vcpus": 0,
        "memory": 0,
        "command": [
            ""
        ],
        "jobRoleArn": "",
        "executionRoleArn": "",
        "volumes": [
            {
                "host": {
                    "sourcePath": ""
                },
                "name": "",
                "efsVolumeConfiguration": {
                    "fileSystemId": "",
                    "rootDirectory": "",
                    "transitEncryption": "ENABLED",
                    "transitEncryptionPort": 0,
                    "authorizationConfig": {
                        "accessPointId": "",
                        "iam": "DISABLED"
                    }
                }
            }
        ],
        "environment": [
            {
                "name": "",
                "value": ""
            }
        ],
        "mountPoints": [
            {
                "containerPath": "",
                "readOnly": true,
                "sourceVolume": ""
            }
        ],
        "readonlyRootFilesystem": true,
        "privileged": true,
        "ulimits": [
            {
                "hardLimit": 0,
                "name": "",
                "softLimit": 0
            }
        ],
        "user": "",
        "instanceType": "",
        "resourceRequirements": [
            {
                "value": "",
                "type": "MEMORY"
            }
        ],
        "linuxParameters": {
            "devices": [
                {
                    "hostPath": "",
                    "containerPath": "",
                    "permissions": [
                        "WRITE"
                    ]
                }
            ],
            "initProcessEnabled": true,
            "sharedMemorySize": 0,
            "tmpfs": [
                {
                    "containerPath": "",
                    "size": 0,
                    "mountOptions": [
                        ""
                    ]
                }
            ],
            "maxSwap": 0,
            "swappiness": 0
        },
        "logConfiguration": {
            "logDriver": "syslog",
            "options": {
                "KeyName": ""
            },
            "secretOptions": [
                {
                    "name": "",
                    "valueFrom": ""
                }
            ]
        },
        "secrets": [
            {
                "name": "",
                "valueFrom": ""
            }
        ],
        "networkConfiguration": {
            "assignPublicIp": "DISABLED"
        },
        "fargatePlatformConfiguration": {
            "platformVersion": ""
        }
    },
    "nodeProperties": {
        "numNodes": 0,
        "mainNode": 0,
        "nodeRangeProperties": [
            {
                "targetNodes": "",
                "container": {
                    "image": "",
                    "vcpus": 0,
                    "memory": 0,
                    "command": [
                        ""
                    ],
                    "jobRoleArn": "",
                    "executionRoleArn": "",
                    "volumes": [
                        {
                            "host": {
                                "sourcePath": ""
                            },
                            "name": "",
                            "efsVolumeConfiguration": {
                                "fileSystemId": "",
                                "rootDirectory": "",
                                "transitEncryption": "DISABLED",
                                "transitEncryptionPort": 0,
                                "authorizationConfig": {
                                    "accessPointId": "",
                                    "iam": "ENABLED"
                                }
                            }
                        }
                    ],
                    "environment": [
                        {
                            "name": "",
                            "value": ""
                        }
                    ],
                    "mountPoints": [
                        {
                            "containerPath": "",
                            "readOnly": true,
                            "sourceVolume": ""
                        }
                    ],
                    "readonlyRootFilesystem": true,
                    "privileged": true,
                    "ulimits": [
                        {
                            "hardLimit": 0,
                            "name": "",
                            "softLimit": 0
                        }
                    ],
                    "user": "",
                    "instanceType": "",
                    "resourceRequirements": [
                        {
                            "value": "",
                            "type": "MEMORY"
                        }
                    ],
                    "linuxParameters": {
                        "devices": [
                            {
                                "hostPath": "",
                                "containerPath": "",
                                "permissions": [
                                    "WRITE"
                                ]
                            }
                        ],
                        "initProcessEnabled": true,
                        "sharedMemorySize": 0,
                        "tmpfs": [
                            {
                                "containerPath": "",
                                "size": 0,
                                "mountOptions": [
                                    ""
                                ]
                            }
                        ],
                        "maxSwap": 0,
                        "swappiness": 0
                    },
                    "logConfiguration": {
                        "logDriver": "awslogs",
                        "options": {
                            "KeyName": ""
                        },
                        "secretOptions": [
                            {
                                "name": "",
                                "valueFrom": ""
                            }
                        ]
                    },
                    "secrets": [
                        {
                            "name": "",
                            "valueFrom": ""
                        }
                    ],
                    "networkConfiguration": {
                        "assignPublicIp": "DISABLED"
                    },
                    "fargatePlatformConfiguration": {
                        "platformVersion": ""
                    }
                }
            }
        ]
    },
    "retryStrategy": {
        "attempts": 0,
        "evaluateOnExit": [
            {
                "onStatusReason": "",
                "onReason": "",
                "onExitCode": "",
                "action": "RETRY"
            }
        ]
    },
    "propagateTags": true,
    "timeout": {
        "attemptDurationSeconds": 0
    },
    "tags": {
        "KeyName": ""
    },
    "platformCapabilities": [
        "EC2"
    ],
    "eksProperties": {
        "podProperties": {
            "serviceAccountName": "",
            "hostNetwork": true,
            "dnsPolicy": "",
            "containers": [
                {
                    "name": "",
                    "image": "",
                    "imagePullPolicy": "",
                    "command": [
                        ""
                    ],
                    "args": [
                        ""
                    ],
                    "env": [
                        {
                            "name": "",
                            "value": ""
                        }
                    ],
                    "resources": {
                        "limits": {
                            "KeyName": ""
                        },
                        "requests": {
                            "KeyName": ""
                        }
                    },
                    "volumeMounts": [
                        {
                            "name": "",
                            "mountPath": "",
                            "readOnly": true
                        }
                    ],
                    "securityContext": {
                        "runAsUser": 0,
                        "runAsGroup": 0,
                        "privileged": true,
                        "readOnlyRootFilesystem": true,
                        "runAsNonRoot": true
                    }
                }
            ],
            "volumes": [
                {
                    "name": "",
                    "hostPath": {
                        "path": ""
                    },
                    "emptyDir": {
                        "medium": "",
                        "sizeLimit": ""
                    },
                    "secret": {
                        "secretName": "",
                        "optional": true
                    }
                }
            ]
        }
    }
}
```

# ContainerProperties 的作业定义参数
<a name="job_definition_parameters"></a>

使用 [https://docs.aws.amazon.com/batch/latest/APIReference/API_ContainerProperties.html](https://docs.aws.amazon.com/batch/latest/APIReference/API_ContainerProperties.html) 的作业定义分为几个部分：
+ 作业定义名称
+ 作业定义的类型
+ 参数替换占位符默认值
+ 作业的容器属性
+ 在 Amazon EKS 资源上运行的作业所需的作业定义的 Amazon EKS 属性
+ 多节点并行作业所需的节点属性
+ 在 Fargate 资源上运行的作业所需的平台功能
+ 作业定义的默认标签传播详细信息
+ 作业定义的默认重试策略
+ 作业定义的默认计划优先级
+ 作业定义的默认标签
+ 作业定义的默认超时

**Contents**
+ [作业定义名称](#jobDefinitionName)
+ [类型](#type)
+ [Parameters](#parameters)
+ [容器属性](#containerProperties)
+ [Amazon EKS 属性](#job-definition-parameters-eks-properties)
+ [平台功能](#job-definition-parameters-platform-capabilities)
+ [传播标签](#job-definition-parameters-propagate-tags)
+ [节点属性](#nodeProperties)
+ [重试策略](#retryStrategy)
+ [计划优先级](#job-definition-parameters-schedulingPriority)
+ [Tags](#job-definition-parameters-tags)
+ [Timeout](#timeout)

## 作业定义名称
<a name="jobDefinitionName"></a>

`jobDefinitionName`  
注册作业定义时，需要指定一个名称。名称长度不超过 128 个字符。可以包含大小写字母、数字、连字符（-）和下划线（\$1）。使用该名称注册的第一个作业定义的修订版本为 1。任何使用该名称注册的后续作业定义都会有一个增量修订号。  
类型：字符串  
必需：是

## 类型
<a name="type"></a>

`type`  
当您注册作业定义时，需要指定作业类型。如果作业在 Fargate 资源上运行，则不支持`multinode`。有关多节点并行作业的更多信息，请参阅[创建多节点并行作业定义](create-multi-node-job-def.md)。  
类型：字符串  
有效值：`container` \$1 `multinode`  
必需：是

## Parameters
<a name="parameters"></a>

`parameters`  
提交作业时，可以指定应替换占位符或覆盖默认作业定义参数的参数。作业提交请求中的参数优先于作业定义中的默认值。这意味着可以对使用相同格式的多个作业使用相同的作业定义。还可以在提交时以编程方式更改命令中的值。  
类型：字符串到字符串映射  
必需：否  
注册作业定义时，可以在作业容器属性的`command`字段中使用参数替代占位符。语法如下所示。  

```
"command": [
    "ffmpeg",
    "-i",
    "Ref::inputfile",
    "-c",
    "Ref::codec",
    "-o",
    "Ref::outputfile"
]
```
在上面的示例中，命令中包含参数替代占位符`Ref::inputfile`、`Ref::codec`和`Ref::outputfile`。您可以使用作业定义中的`parameters`对象为这些占位符设置默认值。例如，要为`Ref::codec`占位符设置默认值，可以在作业定义中指定以下内容：  

```
"parameters" : {"codec" : "mp4"}
```
在提交此作业定义以运行时，容器命令中的`Ref::codec`参数将被替换为默认值。`mp4`

## 容器属性
<a name="containerProperties"></a>

注册作业定义时，指定容器属性列表，在置放作业时，需要将这些容器属性传递给容器实例上的 Docker 进程守护程序。作业定义中允许使用以下容器属性。对于单节点作业，这些容器属性是在作业定义级别设置的。对于多节点并行作业，每个节点组的容器属性是在[节点属性](#nodeProperties)级别设置的。

`command`  
传递给容器的命令。此参数映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) [创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的`Cmd`，以及[https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/)的`COMMAND`参数。有关 Docker `CMD`参数的更多信息，请参阅 [https://docs.docker.com/engine/reference/builder/\$1cmd](https://docs.docker.com/engine/reference/builder/#cmd)。  

```
"command": ["string", ...]
```
类型：字符串数组  
必需：否

`environment`  
要传递给容器的环境变量。此参数将映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的[创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的`Env`以及[https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/)的`--env`选项。  
建议不要对敏感信息（如凭证数据）使用纯文本环境变量。
环境变量不得以`AWS_BATCH`开头。这种命名惯例是为AWS Batch服务所设置的变量保留的。
类型：键/值对的数组  
必需：否    
`name`  
环境变量的名称。  
类型：字符串  
必需：是，当使用`environment`时。  
`value`  
环境变量的值。  
类型：字符串  
必需：是，当使用`environment`时。

```
"environment" : [
    { "name" : "envName1", "value" : "envValue1" },
    { "name" : "envName2", "value" : "envValue2" }
]
```

`executionRoleArn`  
注册作业定义时，可以指定 IAM 角色。该角色为 Amazon ECS 容器代理提供了代表您调用其关联策略中指定的 API 操作的权限。对于在 Fargate 资源上运行的作业，必须提供执行角色。有关更多信息，请参阅 [AWS Batch IAM 执行角色](execution-IAM-role.md)。  
类型：字符串  
必需：否

`fargatePlatformConfiguration`  
适用于在 Fargate 资源上运行的作业的平台配置。在 EC2 资源上运行的作业不得指定此参数。  
类型：[FargatePlatformConfiguration](https://docs.aws.amazon.com/batch/latest/APIReference/API_FargatePlatformConfiguration.html) 对象  
必需：否    
`platformVersion`  
作业所使用的AWS Fargate 平台版本，或`LATEST`使用最近批准的AWS Fargate 平台版本。  
类型：字符串  
默认：`LATEST`  
必需：否

`image`  
用于启动作业的映像。此字符串将直接传递给 Docker 进程守护程序。默认情况下，Docker Hub 注册表中的映像可用。也可以使用`repository-url/image:tag`指定其他存储库。允许最多 255 个字母（大写和小写字母）、数字、连字符、下划线、冒号、句点、正斜杠和井号。此参数可映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的[创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的`Image`和[https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/)的`IMAGE`参数。  
Docker 映像架构必须与为它们安排的计算资源的处理器架构相匹配。例如，基于 ARM 的 Docker 映像只能在基于 ARM 的计算资源上运行。
+ Amazon ECR 公有存储库中的映像使用完整的`registry/repository[:tag]`或`registry/repository[@digest]`命名惯例（例如，`public.ecr.aws/registry_alias/my-web-app:latest`）。
+ Amazon ECR 存储库中的映像使用完整的`registry/repository:[tag]`命名惯例。例如，`aws_account_id.dkr.ecr.region.amazonaws.com``/my-web-app:latest`。
+ Docker Hub 上的官方存储库中的映像使用一个名称 (例如，`ubuntu`或`mongo`)。
+ Docker Hub 上其他存储库中的映像通过组织名称 (例如，`amazon/amazon-ecs-agent`) 进行限定。
+ 其他在线存储库中的映像由域名 (例如，`quay.io/assemblyline/ubuntu`) 进行进一步限定。
类型：字符串  
必需：是

`instanceType`  
要用于多节点并行作业的实例类型。多节点并行作业中的所有节点组必须使用相同的实例类型。此参数不适用于单节点容器作业或在 Fargate 资源上运行的作业。  
类型：字符串  
必需：否

`jobRoleArn`  
注册作业定义时，可以指定 IAM 角色。该角色为作业容器提供了代表您调用其关联的策略中指定的 API 操作的权限。有关更多信息，请参阅 *Amazon Elastic Container Service 开发人员指南*中的[任务的 IAM 角色](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html)。  
类型：字符串  
必需：否

`linuxParameters`  
特定于 Linux 的修改应用于容器的详细信息，如设备映射的详细信息。  

```
"linuxParameters": {
    "devices": [
        {
            "hostPath": "string",
            "containerPath": "string",
            "permissions": [
                "READ", "WRITE", "MKNOD"
            ]
        }
    ],
    "initProcessEnabled": true|false,
    "sharedMemorySize": 0,
    "tmpfs": [
        {
            "containerPath": "string",
            "size": integer,
            "mountOptions": [
                "string"
            ]
        }
    ],
    "maxSwap": integer,
    "swappiness": integer
}
```
类型：[LinuxParameters](https://docs.aws.amazon.com/batch/latest/APIReference/API_LinuxParameters.html) 对象  
必需：否    
`devices`  
映射到容器的设备列表。此参数将映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的[创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的`Devices`以及 [Docker 运行](https://docs.docker.com/engine/reference/run/)的`--device`选项。  
此参数不适用于在 Fargate 资源上运行的作业。
类型：[设备](https://docs.aws.amazon.com/batch/latest/APIReference/API_Device.html)对象数组  
必需：否    
`hostPath`  
主机容器实例中可用设备的路径。  
类型：字符串  
必需：是  
`containerPath`  
在容器中公开设备的路径。如果未指定，则设备将在与主机路径相同的路径上公开。  
类型：字符串  
必需：否  
`permissions`  
容器中设备的权限。如果未指定，则将权限设置为`READ`、`WRITE`和`MKNOD`。  
类型：字符串数组  
必需：否  
有效值：`READ` \$1`WRITE` \$1`MKNOD`  
`initProcessEnabled`  
如果为 true，则在容器内运行`init`进程，以转发信号和获得进程。此参数会将`--init`选项映射到 [Docker 运行](https://docs.docker.com/engine/reference/run/)。此参数要求容器实例上的 Docker Remote API 版本为 1.25 或更高版本。要检查容器实例上的 Docker Remote API 版本，请登录到容器实例并运行以下命令：`sudo docker version | grep "Server API version"`  
类型：布尔值  
必需：否  
`maxSwap`  
作业可以使用的交换内存总量（以 MiB 为单位）。该参数会转换为 [Docker 运行](https://docs.docker.com/engine/reference/run/)的`--memory-swap`选项，其中，该值为容器内存和`maxSwap`值之和。有关更多信息，请参阅 Docker 文档中的[`--memory-swap`详细信息](https://docs.docker.com/config/containers/resource_constraints/#--memory-swap-details)。  
如果指定`maxSwap`值为`0`，则该容器不使用交换。接受的值为`0`或任何正整数。如果省略`maxSwap`参数，该容器将为其运行所在的容器实例使用交换配置。必须为要使用的`swappiness`参数设置`maxSwap`值。  
此参数不适用于在 Fargate 资源上运行的作业。
类型：整数  
必需：否  
`sharedMemorySize`  
`/dev/shm`卷的大小值 (以 MiB 为单位)。此参数会将`--shm-size`选项映射到 [Docker 运行](https://docs.docker.com/engine/reference/run/)。  
此参数不适用于在 Fargate 资源上运行的作业。
类型：整数  
必需：否  
`swappiness`  
可以使用此功能调整容器的内存交换行为。除非绝对必要，否则`0`的一个`swappiness`值将导致交换不会发生。`swappiness`值为`100`将导致页面被积极地交换。接受的值为`0`到`100`之间的整数。如果未指定`swappiness`参数，则使用默认值`60`。如果未指定`maxSwap`的值，则此参数将被忽略。如果`maxSwap`设置为 0，则容器不使用交换。此参数会将`--memory-swappiness`选项映射到 [Docker 运行](https://docs.docker.com/engine/reference/run/)。  
在使用每个容器交换配置时，请考虑以下事项。  
+ 必须在容器实例上启用并分配交换空间才能供容器使用。
**注意**  
默认情况下，Amazon ECS 优化 AMI 没有启用交换功能。必须在实例上启用交换才能使用此功能。有关更多信息，请参阅《Amazon EC2 用户指南》的中的[实例存储交换卷](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-store-swap-volumes.html)**或[如何使用交换文件分配内存以便在 Amazon EC2 实例中用作交换空间？](https://aws.amazon.com/premiumsupport/knowledge-center/ec2-memory-swap-file/)。
+ 只有使用 EC2 资源的作业定义才支持交换空间参数。
+ 如果作业定义中忽略了`maxSwap`和`swappiness`参数，每个容器都有默认的`swappiness`值：60。总的交换使用量限制为容器的内存预留量的两倍。
此参数不适用于在 Fargate 资源上运行的作业。
类型：整数  
必需：否  
`tmpfs`  
tmpfs挂载的容器路径、挂载选项和大小。  
类型：[Tmpfs](https://docs.aws.amazon.com/batch/latest/APIReference/API_Tmpfs.html) 对象数组  
此参数不适用于在 Fargate 资源上运行的作业。
必需：否    
`containerPath`  
挂载tmpfs卷的容器中的绝对文件路径。  
类型：字符串  
必需：是  
`mountOptions`  
tmpfs卷挂载选项列表。  
有效值："`defaults`" \$1 "`ro`" \$1 "`rw`" \$1 "`suid`" \$1 "`nosuid`" \$1 "`dev`" \$1 "`nodev`" \$1 "`exec`" \$1 "`noexec`" \$1 "`sync`" \$1 "`async`" \$1 "`dirsync`" \$1 "`remount`" \$1 "`mand`" \$1 "`nomand`" \$1 "`atime`" \$1 "`noatime`" \$1 "`diratime`" \$1 "`nodiratime`" \$1 "`bind`" \$1 "`rbind`" \$1 "`unbindable`" \$1 "`runbindable`" \$1 "`private`" \$1 "`rprivate`" \$1 "`shared`" \$1 "`rshared`" \$1 "`slave`" \$1 "`rslave`" \$1 "`relatime`" \$1 "`norelatime`" \$1 "`strictatime`" \$1 "`nostrictatime`" \$1 "`mode`" \$1 "`uid`" \$1 "`gid`" \$1 "`nr_inodes`" \$1 "`nr_blocks`" \$1 "`mpol`"  
类型：字符串数组  
必需：否  
`size`  
tmpfs卷的大小 (以 MiB 为单位)。  
类型：整数  
必需：是

`logConfiguration`  
作业的日志配置规范。  
此参数将映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的[创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的`LogConfig`以及 [Docker 运行](https://docs.docker.com/engine/reference/run/)的`--log-driver`选项。默认情况下，容器使用与 Docker 进程守护程序相同的日志记录驱动程序。但容器可能通过在容器定义中使用此参数指定日志驱动程序，以此来使用不同于 Docker 进程守护程序的日志记录驱动程序。要对容器使用另一个日志记录驱动程序，必须在容器实例或另一个日志服务器上配置日志系统，以提供远程日志记录选项。有关其他支持的日志驱动程序选项的更多信息，请参阅 Docker 文档中的[配置日志记录驱动程序](https://docs.docker.com/engine/admin/logging/overview/)。  
AWS Batch目前支持提供给 Docker 进程守护程序的一小部分日志记录驱动程序（在 [LogConfiguration](https://docs.aws.amazon.com/batch/latest/APIReference/API_LogConfiguration.html) 数据类型中显示）。
此参数要求容器实例上的 Docker Remote API 版本为 1.18 或更高版本。要检查容器实例上的 Docker Remote API 版本，请登录到容器实例并运行以下命令：`sudo docker version | grep "Server API version"`  

```
"logConfiguration": {
    "devices": [
        {
            "logDriver": "string",
            "options": {
                "optionName1" : "optionValue1",
                "optionName2" : "optionValue2"
            }
            "secretOptions": [
              {
                  "name" : "secretOptionName1",
                  "valueFrom" : "secretOptionArn1"
              },
              {
                  "name" : "secretOptionName2",
                  "valueFrom" : "secretOptionArn2"
              }
            ]
        }
    ]
}
```
类型：[LogConfiguration](https://docs.aws.amazon.com/batch/latest/APIReference/API_LogConfiguration.html) 对象  
必需：否    
`logDriver`  
要用于作业的日志驱动程序。默认情况下，AWS Batch会启用`awslogs`日志驱动程序。为此参数列出的有效值是默认情况下 Amazon ECS 容器代理可与之通信的日志驱动程序。  
此参数将映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的[创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的`LogConfig`以及 [Docker 运行](https://docs.docker.com/engine/reference/run/)的`--log-driver`选项。默认情况下，作业使用与 Docker 进程守护程序相同的日志记录驱动程序。但作业可能通过在作业定义中使用此参数指定日志驱动程序，以此来使用不同于 Docker 进程守护程序的日志记录驱动程序。如果要为作业指定另一个日志记录驱动程序，则必须在计算环境中的容器实例上配置日志系统。或者，也可以在另一台日志服务器上对其进行配置，以提供远程日志记录选项。有关其他支持的日志驱动程序选项的更多信息，请参阅 Docker 文档中的[配置日志记录驱动程序](https://docs.docker.com/engine/admin/logging/overview/)。  
AWS Batch目前支持提供给 Docker 进程守护程序的一小部分日志记录驱动程序。可能会在 Amazon ECS 容器代理的未来版本中提供其他日志驱动程序。
支持的日志驱动程序为`awslogs`、`fluentd`、`gelf`、`json-file`、`journald`、`logentries`、`syslog`和`splunk`。  
在 Fargate 资源上运行的作业仅限于`awslogs`和`splunk`日志驱动程序。
此参数要求容器实例上的 Docker Remote API 版本为 1.18 或更高版本。要检查容器实例上的 Docker Remote API 版本，请登录到容器实例并运行以下命令：`sudo docker version | grep "Server API version"`  
在容器实例上运行的 Amazon ECS 容器代理必须将该实例上的可用日志记录驱动程序注册到`ECS_AVAILABLE_LOGGING_DRIVERS`环境变量。否则，放置在该实例上的容器将无法使用这些日志配置选项。有关更多信息，请参阅*《Amazon Elastic Container Service 开发人员指南》*中的 [Amazon ECS 容器代理配置](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-config.html)。  
`awslogs`  
指定 Amazon CloudWatch Logs 日志记录驱动程序。有关更多信息，请参阅[使用 awslogs 日志驱动程序](using_awslogs.md)和 Docker 文档中的[ Amazon CloudWatch Logs 日志记录驱动程序](https://docs.docker.com/config/containers/logging/awslogs/)。  
`fluentd`  
指定 Fluentd 日志记录驱动程序。有关更多信息（包括用法和选项），请参阅 Docker 文档中的 [Fluentd 日志记录驱动程序](https://docs.docker.com/config/containers/logging/fluentd/)。  
`gelf`  
指定 Graylog Extended Format (GELF) 日志记录驱动程序。有关更多信息（包括用法和选项），请参阅 Docker 文档中的 [Graylog Extended Format 日志记录驱动程序](https://docs.docker.com/config/containers/logging/gelf/)。  
`journald`  
指定 journald 日志记录驱动程序。有关更多信息（包括用法和选项），请参阅 Docker 文档中的 [Journald 日志记录驱动程序](https://docs.docker.com/config/containers/logging/journald/)。  
`json-file`  
指定 JSON 文件日志记录驱动程序。有关更多信息（包括用法和选项），请参阅 Docker 文档中的 [JSON 文件日志记录驱动程序](https://docs.docker.com/config/containers/logging/json-file/)。  
`splunk`  
指定 Splunk 日志记录驱动程序。有关更多信息（包括用法和选项），请参阅 Docker 文档中的 [Splunk 日志记录驱动程序](https://docs.docker.com/config/containers/logging/splunk/)。  
`syslog`  
指定 syslog 日志记录驱动程序。有关更多信息（包括用法和选项），请参阅 Docker 文档中的 [Syslog 日志记录驱动程序](https://docs.docker.com/config/containers/logging/syslog/)。
类型：字符串  
必需：是  
有效值：`awslogs` \$1`fluentd` \$1`gelf` \$1`journald` \$1`json-file` \$1`splunk` \$1`syslog`   
如果有之前未列出但您希望与 Amazon ECS 容器代理一起使用的自定义驱动程序，则可使 [GitHub 上提供](https://github.com/aws/amazon-ecs-agent)的 Amazon ECS 容器代理项目分支，并对其进行自定义以便与该驱动程序结合使用。我们鼓励您针对要包含的更改提交拉取请求。但是，亚马逊云科技当前不支持运行此软件修改后副本的请求。  
`options`  
要发送到作业的日志驱动程序中的日志配置选项。  
此参数要求容器实例上的 Docker Remote API 版本为 1.19 或更高版本。  
类型：字符串到字符串映射  
必需：否  
`secretOptions`  
表示要传递到日志配置的密文的对象。有关更多信息，请参阅 [指定敏感数据](specifying-sensitive-data.md)。  
类型：对象数组  
必需：否    
`name`  
要在作业中设置的日志驱动程序选项的名称。  
类型：字符串  
必需：是  
`valueFrom`  
要向容器的日志配置公开的秘钥的 Amazon 资源名称（ARN）。支持的值为 Secrets Manager 秘钥的完整 ARN 或 SSM Parameter Store 中参数的完整 ARN。  
如果 SSM Parameter Store 参数存在于要启动的任务所在的同一AWS 区域中，则可以使用参数的完整 ARN 或名称。如果参数存在于不同的区域，则必须指定完整的 ARN。
类型：字符串  
必需：是

`memory`  
*已弃用此参数，请改用`resourceRequirements`。*  
为作业预留的 MiB 内存的数量。  
例如，如果您的作业定义包含类似于以下内容的语法，则说明如何使用`resourceRequirements`。  

```
"containerProperties": {
  "memory": 512
}
```
使用`resourceRequirements`的等效语法如下。  

```
"containerProperties": {
  "resourceRequirements": [
    {
      "type": "MEMORY",
      "value": "512"
    }
  ]
}
```
类型：整数  
必需：是

`mountPoints`  
容器中数据卷的挂载点。此参数将映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的[创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的 `Volumes` 以及 [https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/) 的 `--volume` 选项。  

```
"mountPoints": [
                {
                  "sourceVolume": "string",
                  "containerPath": "string",
                  "readOnly": true|false
                }
              ]
```
类型：对象数组  
必需：否    
`sourceVolume`  
要挂载的卷的名称。  
类型：字符串  
必需：是，当使用`mountPoints`时。  
`containerPath`  
要将主机卷挂载到的容器上的路径。  
类型：字符串  
必需：是，当使用`mountPoints`时。  
`readOnly`  
如果此值为`true`，则容器具有对卷的只读访问权。如果此值为`false`，则容器可对卷进行写入。  
类型：布尔值  
必需：否  
默认值：False

`networkConfiguration`  
适用于在 Fargate 资源上运行的作业的网络配置。在 EC2 资源上运行的作业不得指定此参数。  

```
"networkConfiguration": { 
   "assignPublicIp": "string"
}
```
类型：对象数组  
必需：否    
`assignPublicIp`  
指示作业是否具有公有 IP 地址。如果作业需要出站网络访问权限，则必须这样做。  
类型：字符串  
有效值：`ENABLED` \$1 `DISABLED`  
必需：否  
默认值：`DISABLED`

`privileged`  
当此参数为 true 时，将对此容器提供对主机容器实例的提升的权限（类似于`root`用户）。此参数将映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的[创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的`Privileged`以及[https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/)的`--privileged`选项。此参数不适用于在 Fargate 资源上运行的作业。请勿提供或将其指定为 false。  

```
"privileged": true|false
```
类型：布尔值  
必需：否

`readonlyRootFilesystem`  
当此参数为 true 时，将对此容器提供对其根文件系统的只读访问权。此参数将映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的[创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的 `ReadonlyRootfs` 以及 [https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/) 的 `--read-only` 选项。  

```
"readonlyRootFilesystem": true|false
```
类型：布尔值  
必需：否

`resourceRequirements`  
要分配给容器的资源的类型和数量。支持的资源包括`GPU`、`MEMORY`和`VCPU`。  

```
"resourceRequirements" : [
  {
    "type": "GPU",
    "value": "number"
  }
]
```
类型：对象数组  
必需：否    
`type`  
要分配给容器的资源类型。支持的资源包括`GPU`、`MEMORY`和`VCPU`。  
类型：字符串  
必需：是，当使用`resourceRequirements`时。  
`value`  
要为容器预留的指定资源的数量。这些值根据`type`指定的不同而有所不同。    
type="GPU"  
为容器预留的物理 GPU 数量。为作业中所有容器预留的 GPU 数量不能超过启动作业的计算资源上可用 GPU 的数量。  
type="MEMORY"  
要提供给容器的内存的硬限制（以 MiB 为单位）。如果容器尝试使用超出此处指定的内存，该容器将被终止。此参数将映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的 [Create a container](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)（创建容器）部分中的 `Memory` 以及 [docker run](https://docs.docker.com/engine/reference/run/) 的 `--memory` 选项。您必须为作业指定至少 4 MiB 内存。对于多节点并行 (MNP) 作业来说，这是必需的，但可以在多个位置指定。必须至少为每个节点指定一次。此参数将映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的 [Create a container](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)（创建容器）部分中的 `Memory` 以及 [docker run](https://docs.docker.com/engine/reference/run/) 的 `--memory` 选项。  
如果要通过为特定实例类型的作业提供尽可能多的内存来最大化资源利用率，请参阅[计算资源内存管理](memory-management.md)。
对于在 Fargate 资源上运行的作业，`value`必须与受支持的值之一匹配。此外，这些`VCPU`值必须是该内存值支持的值之一。      
<a name="Fargate-memory-vcpu"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/batch/latest/userguide/job_definition_parameters.html)  
type="VCPU"  
为作业预留的 vCPU 的数量。此参数将映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的 [Create a container](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)（创建容器）部分中的 `CpuShares` 以及 [docker run](https://docs.docker.com/engine/reference/run/) 的 `--cpu-shares` 选项。每个 vCPU 相当于 1024 个 CPU 份额。对于在 EC2 资源上运行的作业，必须至少指定一个 vCPU。这是必需的，但可以在多个位置指定。必须至少为每个节点指定一次。  
对于在 Fargate 资源上运行的作业，`value`必须与受支持的值之一匹配，且`MEMORY`值必须是该 VCPU 值支持的值之一。支持的值为 0.25、0.5、1、2、4、8 和 16。  
Fargate 按需 vCPU 资源计数配额的默认值为 6 个 vCPU。有关 Fargate 配额的更多信息，请参阅*Amazon Web Services 一般参考*中[AWS Fargate 配额](https://docs.aws.amazon.com/general/latest/gr/ecs-service.html#service-quotas-fargate)。
类型：字符串  
必需：是，当使用`resourceRequirements`时。

`secrets`  
作为环境变量公开的作业密文。有关更多信息，请参阅 [指定敏感数据](specifying-sensitive-data.md)。  

```
"secrets": [
    {
      "name": "secretName1",
      "valueFrom": "secretArn1"
    },
    {
      "name": "secretName2",
      "valueFrom": "secretArn2"
    }
    ...
]
```
类型：对象数组  
必需：否    
`name`  
包含密文的环境变量的名称。  
类型：字符串  
必需：是，当使用`secrets`时。  
  
`valueFrom`  
要向容器公开的密文。支持的值是 Secrets Manager 密文的完整 Amazon 资源名称（ARN）或 SSM Parameter Store 中参数的完整 ARN。  
如果 SSM Parameter Store 参数存在于要启动的作业所在的同一AWS 区域中，则可以使用参数的完整 ARN 或名称。如果参数存在于不同的区域，则必须指定完整的 ARN。
类型：字符串  
必需：是，当使用`secrets`时。

`ulimits`  
要在容器中设置的`ulimits`值的列表。此参数将映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的[创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的 `Ulimits` 以及 [https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/) 的 `--ulimit` 选项。  

```
"ulimits": [
  {
    "name": string,
    "softLimit": integer,
    "hardLimit": integer
  }
  ...
]
```
类型：对象数组  
必需：否    
`name`  
`ulimit`的`type`。  
类型：字符串  
必需：是，当使用`ulimits`时。  
  
`hardLimit`  
`ulimit`类型的硬限制。  
类型：整数  
必需：是，当使用`ulimits`时。  
  
`softLimit`  
`ulimit`类型的软限制。  
类型：整数  
必需：是，当使用`ulimits`时。  


`user`  
要在容器内使用的用户名。此参数将映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的[创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的 `User` 以及 [https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/) 的 `--user` 选项。  

```
"user": "string"
```
类型：字符串  
必需：否

`vcpus`  
*已弃用此参数，请改用`resourceRequirements`。*  
为容器预留的 vCPU 的数量。  
作为`resourceRequirements`使用方法的示例，如果作业定义包含类似于以下的行：  

```
"containerProperties": {
  "vcpus": 2
}
```
使用`resourceRequirements`的等效行如下所示。  

```
"containerProperties": {
  "resourceRequirements": [
    {
      "type": "VCPU",
      "value": "2"
    }
  ]
}
```
类型：整数  
必需：是

`volumes`  
注册作业定义时，可以指定需传递给容器实例上的 Docker 进程守护程序的卷的列表。容器属性中允许以下参数：  

```
"volumes": [
  {
    "name": "string",
    "host": {
      "sourcePath": "string"
    },
    "efsVolumeConfiguration": {
      "authorizationConfig": {
        "accessPointId": "string",
        "iam": "string"
      },
      "fileSystemId": "string",
      "rootDirectory": "string",
      "transitEncryption": "string",
      "transitEncryptionPort": number
    }
  }
]
```  
`name`  
卷的名称。最多能包含 255 个字母 (大写和小写字母)、数字、连字符和下划线。此名称已在容器定义`sourceVolume`的`mountPoints`参数中引用。  
类型：字符串  
必需：否  
`host`  
`host`参数的内容确定数据卷是否一直保存在主机容器实例上以及存储它的位置上。如果`host`参数为空，则 Docker 进程守护程序将为数据卷分配一个主机路径。但是，在与该卷关联的容器停止运行后，不保证保存数据。  
此参数不适用于在 Fargate 资源上运行的作业。
类型：对象  
必需：否    
`sourcePath`  
向容器提供的主机容器实例上的路径。如果此参数为空，则 Docker 进程守护程序将分配一个主机路径。  
如果`host`参数包含`sourcePath`文件位置，则数据卷将在主机容器实例上的指定位置保留，除非手动将其删除。如果主机容器实例上不存在`sourcePath`值，则 Docker 进程守护程序将创建该值。如果该位置不存在，则将导出源路径文件夹的内容。  
类型：字符串  
必需：否  
`efsVolumeConfiguration`  
使用 Amazon Elastic File System 文件系统进行任务存储时，指定此参数。有关更多信息，请参阅 [Amazon EFS 卷](efs-volumes.md)。  
类型：对象  
必需：否    
`authorizationConfig`  
Amazon EFS 文件系统的授权配置详细信息。  
类型：字符串  
必需：否    
`accessPointId`  
要使用的 Amazon EFS 接入点 ID。如果指定了接入点，则必须省略在`EFSVolumeConfiguration`中指定的根目录值，或者将其设置为`/`。这将强制执行 EFS 接入点上设置的路径。如果使用接入点，则必须在`EFSVolumeConfiguration`中启用传输加密。有关更多信息，请参阅*《Amazon Elastic File System 用户指南》*中的[使用 Amazon EFS 接入点](https://docs.aws.amazon.com/efs/latest/ug/efs-access-points.html)。  
类型：字符串  
必需：否  
`iam`  
确定在挂载 Amazon EFS 文件系统时是否使用在作业定义中定义的AWS Batch作业 IAM 角色。如果启用，则必须在`EFSVolumeConfiguration`中启用传输加密。如果忽略此参数，将使用默认值`DISABLED`。有关更多信息，请参阅 [使用 Amazon EFS 接入点](efs-volumes.md#efs-volume-accesspoints)。  
类型：字符串  
有效值：`ENABLED` \$1 `DISABLED`  
必需：否  
`fileSystemId`  
要使用的 Amazon EFS 文件系统 ID。  
类型：字符串  
必需：否  
`rootDirectory`  
Amazon EFS 文件系统中要作为主机内的根目录挂载的目录。如果忽略此参数，将使用 Amazon EFS 卷的根目录。如果指定，`/`这与忽略此参数效果相同。最大长度为 4096 个字符。  
如果在`authorizationConfig`中指定了 EFS 接入点，则必须省略根目录参数，或者将其设置为`/`。这将在 Amazon EFS 接入点上强制执行设置的路径。
类型：字符串  
必需：否  
`transitEncryption`  
确定是否对 Amazon ECS 主机和 Amazon EFS 服务器之间传输的 Amazon EFS 数据启用加密。如果使用 Amazon EFS IAM 授权，则必须启用传输加密。如果忽略此参数，将使用默认值`DISABLED`。有关更多信息，请参阅[《Amazon Elastic File System 用户指南》](https://docs.aws.amazon.com/efs/latest/ug/encryption-in-transit.html)中的*加密传输中数据*。  
类型：字符串  
有效值：`ENABLED` \$1 `DISABLED`  
必需：否  
`transitEncryptionPort`  
在 Amazon ECS 主机和 Amazon EFS 服务器之间发送加密数据时要使用的端口。如果未指定传输加密端口，将使用 Amazon EFS 挂载帮助程序使用的端口选择策略。该值必须在 0 到 65535 之间。有关更多信息，请参阅[《Amazon Elastic File System 用户指南》](https://docs.aws.amazon.com/efs/latest/ug/efs-mount-helper.html)中的 *EFS 挂载帮助程序*。  
类型：整数  
必需：否

## Amazon EKS 属性
<a name="job-definition-parameters-eks-properties"></a>

具有各种属性的对象，这些属性特定于基于 Amazon EKS 的作业。不得为基于 Amazon ECS 的作业定义指定此项。

`podProperties`  
作业的Kubernetes容器组（pod）资源的属性。  
类型：[EksPodProperties](https://docs.aws.amazon.com/batch/latest/APIReference/API_EksPodProperties.html) 对象  
必需：否    
`containers`  
在 Amazon EKS 容器组上使用的容器属性。  
类型：[EksContainer](https://docs.aws.amazon.com/batch/latest/APIReference/API_EksContainer.html) 对象  
必需：否    
`args`  
入口点的参数数组。如果未指定，则使用容器映像的`CMD`。这对应Kubernetes中[容器组（pod）](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/) [入口点](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#entrypoint) 部分的`args`成员。使用容器的环境扩展环境变量引用。  
如果引用的环境变量不存在，则命令中的引用不会更改。例如，如果引用是“`$(NAME1)`”且`NAME1`环境变量不存在，则命令字符串将保留“`$(NAME1)`”。`$$`替换为`$`，并且生成的字符串未扩展。例如，无论`VAR_NAME`环境变量是否存在，`$$(VAR_NAME)`都会作为`$(VAR_NAME)`传递。有关更多信息，请参阅*《Dockerfile 参考》*中的 [CMD](https://docs.docker.com/engine/reference/builder/#cmd) 和 *Kubernetes文档*中的[为容器组（pod）定义命令和参数](https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/)。  
类型：字符串数组  
必需：否  
`command`  
容器的入口点。这不是在 Shell 中运行。如果未指定，则使用容器映像的`ENTRYPOINT`。使用容器的环境扩展环境变量引用。  
如果引用的环境变量不存在，则命令中的引用不会更改。例如，如果引用是“`$(NAME1)`”且`NAME1`环境变量不存在，则命令字符串将保留“`$(NAME1)`”。`$$`替换为`$`，并且生成的字符串未扩展。例如，无论`VAR_NAME`环境变量是否存在，`$$(VAR_NAME)`都会作为`$(VAR_NAME)`传递。无法更新入口点。有关更多信息，请参阅 *《Dockerfile 参考》*中的[入口点](https://docs.docker.com/engine/reference/builder/#entrypoint)和 *Kubernetes文档*中的[为容器设置启动时要执行的命令和参数](https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/)和[入口点](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#entrypoint)。  
类型：字符串数组  
必需：否  
`env`  
要传递给容器的环境变量。  
环境变量不得以 `AWS_BATCH` 开头。这种命名惯例是为AWS Batch所设置的变量保留的。
类型：[EksContainerEnvironmentVariable](https://docs.aws.amazon.com/batch/latest/APIReference/API_EksContainerEnvironmentVariable.html) 对象数组  
必需：否    
`name`  
环境变量的名称。  
类型：字符串  
必需：是  
`value`  
环境变量的值。  
类型：字符串  
必需：否  
`image`  
用于启动容器的 Docker 映像。  
类型：字符串  
必需：是  
`imagePullPolicy`  
容器的图像提取策略。支持的值有`Always`、`IfNotPresent`和`Never`。此参数默认为`IfNotPresent`。但是，如果指定了`:latest`标签，则默认为`Always`。有关更多信息，请参阅*Kubernetes文档*中的[更新映像](https://kubernetes.io/docs/concepts/containers/images/#updating-images)。  
类型：字符串  
必需：否  
`name`  
容器的名称。如果未指定名称，则使用默认名称“`Default`”。容器组中的每个容器必须具有唯一的名称。  
类型：字符串  
必需：否  
`resources`  
要分配给容器的资源的类型和数量。支持的资源包括`memory`、`cpu`和`nvidia.com/gpu`。有关更多信息，请参阅*Kubernetes文档*中的[容器组（pod）和容器的资源管理](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/)。  
类型：[EksContainerResourceRequirements](https://docs.aws.amazon.com/batch/latest/APIReference/API_EksContainerResourceRequirements.html) 对象  
必需：否    
`limits`  
为容器预留的资源类型和数量。这些值因指定的`name`而异。可以使用`limits`或`requests`对象请求资源。    
memory  
容器的内存硬限值（以 MiB 为单位）用整数表示，带“Mi”后缀。如果容器试图超出指定的内存，则容器将终止。必须为作业指定至少 4MiB 的内存。可以在`limits`、`requests`或两者中指定`memory`。如果在这两个位置中指定了`memory`，则`limits`中指定的值必须等于`requests`中指定的值。  
为了最大程度地利用资源，请为作业提供尽可能多的内存，以用于正在使用的具体实例类型。要了解如何操作，请参阅[计算资源内存管理](memory-management.md)。  
cpu  
为容器预留的 CPU 的数量。值必须是`0.25`的偶数倍。可以在`limits`、`requests`或两者中指定`cpu`。如果在这两个位置中指定了`cpu`，则`limits`中指定的值必须至少与`requests`中指定的值一样大。  
nvidia.com/gpu  
为容器预留的 GPU 的数量。值必须是整数。可以在`limits`、`requests`或两者中指定`memory`。如果在这两个位置中指定了 `memory`，则 `limits` 中指定的值必须等于 `requests` 中指定的值。
类型：字符串到字符串映射  
值长度限制：最小长度为 1。长度上限为 256。  
必需：否  
`requests`  
为容器请求的资源类型和数量。这些值因指定的`name`而异。可以使用`limits`或`requests`对象请求资源。    
memory  
容器的内存硬限值（以 MiB 为单位）用整数表示，带“Mi”后缀。如果容器试图超出指定的内存，则容器将终止。必须为作业指定至少 4MiB 的内存。可以在`limits`、`requests`或两者中指定`memory`。如果在两者中均指定了`memory`，则`limits`中指定的值必须等于`requests`中指定的值。  
如果要通过为特定实例类型的作业提供尽可能多的内存来最大化资源利用率，请参阅[计算资源内存管理](memory-management.md)。  
cpu  
为容器预留的 CPU 的数量。值必须是`0.25`的偶数倍。可以在`limits`、`requests`或两者中指定`cpu`。如果在两者中均指定了`cpu`，则`limits`中指定的值必须至少与`requests`中指定的值一样大。  
nvidia.com/gpu  
为容器预留的 GPU 的数量。值必须是整数。可以在`limits`、`requests`或两者中指定`nvidia.com/gpu`。如果在两者中均指定了 `nvidia.com/gpu`，则 `limits` 中指定的值必须等于 `requests` 中指定的值。
类型：字符串到字符串映射  
值长度限制：最小长度为 1。长度上限为 256。  
必需：否  
`securityContext`  
作业的安全上下文。有关更多信息，请参阅*Kubernetes文档*中的[为容器组（pod）或容器配置安全上下文](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/)。  
类型：[EksContainerSecurityContext](https://docs.aws.amazon.com/batch/latest/APIReference/API_EksContainerSecurityContext.html) 对象  
必需：否    
`privileged`  
当此参数为`true`时，将对此容器提供对主机容器实例的提升权限。权限级别与`root`用户权限类似。默认值为 `false`。该参数映射到*Kubernetes文档*中[特权容器组（pod）安全策略](https://kubernetes.io/docs/concepts/security/pod-security-policy/#privileged)中的`privileged`策略。  
类型：布尔值  
必需：否  
`readOnlyRootFilesystem`  
当此参数为`true`时，将对此容器提供对其根文件系统的只读访问权。默认值为 `false`。该参数映射到*Kubernetes文档*中[卷和文件系统容器组（pod）安全策略](https://kubernetes.io/docs/concepts/security/pod-security-policy/#volumes-and-file-systems)中的`ReadOnlyRootFilesystem`策略。  
类型：布尔值  
必需：否  
`runAsGroup`  
指定此参数时，容器将作为指定的组 ID (`gid`) 运行。如果未指定此参数，则默认为映像元数据中指定的群组。该参数映射到*Kubernetes文档*中[用户和群组容器组（pod）安全策略](https://kubernetes.io/docs/concepts/security/pod-security-policy/#users-and-groups)中的`RunAsGroup`和`MustRunAs`策略。  
类型：长整型  
必需：否  
`runAsNonRoot`  
指定此参数时，容器是以`uid`用户（非 0）身份运行的。如果未指定此参数，则会强制执行此规则。该参数映射到*Kubernetes文档*中[用户和群组容器组（pod）安全策略](https://kubernetes.io/docs/concepts/security/pod-security-policy/#users-and-groups)中的`RunAsUser`和`MustRunAsNonRoot`策略。  
类型：长整型  
必需：否  
`runAsUser`  
指定此参数时，容器将作为指定的用户 ID (`uid`) 运行。如果未指定此参数，则默认为映像元数据中指定的用户。该参数映射到*Kubernetes文档*中[用户和群组容器组（pod）安全策略](https://kubernetes.io/docs/concepts/security/pod-security-policy/#users-and-groups)中的`RunAsUser`和`MustRanAs`策略。  
类型：长整型  
必需：否  
`volumeMounts`  
用于 Amazon EKS 作业容器的卷挂载。有关Kubernetes中卷和卷挂载的更多信息，请参阅*Kubernetes文档*中的[卷](https://kubernetes.io/docs/concepts/storage/volumes/)。  
类型：[EksContainerVolumeMount](https://docs.aws.amazon.com/batch/latest/APIReference/API_EksContainerVolumeMount.html) 对象数组  
必需：否    
`mountPath`  
挂载卷的容器上的路径。  
类型：字符串  
必需：否  
`name`  
卷挂载的名称。这必须与容器组中其中一个卷的名称相匹配。  
类型：字符串  
必需：否  
`readOnly`  
如果此值为`true`，则容器具有对卷的只读访问权。否则，容器可以写入卷。默认值为 `false`。  
类型：布尔值  
必需：否  
`dnsPolicy`  
容器组的 DNS 策略。默认值为 `ClusterFirst`。如果未指定`hostNetwork`参数，则默认值为`ClusterFirstWithHostNet`。`ClusterFirst`指示任何与配置的集群域后缀不匹配的 DNS 查询都将转发到继承自节点的上游名称服务器。如果在 [RegisterJobDefinition](https://docs.aws.amazon.com/batch/latest/APIReference/API_RegisterJobDefinition.html) API 操作中没有为 `dnsPolicy` 指定任何值，那么 [DescribeJobDefinitions](https://docs.aws.amazon.com/batch/latest/APIReference/API_DescribeJobDefinitions.html) 或 [DescribeJobs](https://docs.aws.amazon.com/batch/latest/APIReference/API_DescribeJobs.html) API 操作都不会为 `dnsPolicy` 返回任何值。容器组规格设置将包含`ClusterFirst`或`ClusterFirstWithHostNet`，具体取决于`hostNetwork`参数的值。有关更多信息，请参阅*Kubernetes文档*中的[容器组（pod）的 DNS 策略](https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pod-s-dns-policy)。  
有效值：`Default` \$1`ClusterFirst` \$1`ClusterFirstWithHostNet`  
类型：字符串  
必需：否  
`hostNetwork`  
指示容器组是否使用主机的网络 IP 地址。默认值为 `true`。将其设置为`false`将启用Kubernetes容器组（pod）联网模型。大多数AWS Batch工作负载为仅出口，不需要为传入连接的每个容器组分配 IP 的开销。有关更多信息，请参阅*Kubernetes文档*中的[主机命名空间](https://kubernetes.io/docs/concepts/security/pod-security-policy/#host-namespaces)和[容器组（pod）网络](https://kubernetes.io/docs/concepts/workloads/pods/#pod-networking)。  
类型：布尔值  
必需：否  
`serviceAccountName`  
用于运行容器组的服务账户的名称。有关更多信息，请参阅*《Amazon EKS 用户指南》*中的[Kubernetes服务账户](https://docs.aws.amazon.com/eks/latest/userguide/service-accounts.html)和[配置Kubernetes服务账户以代入 IAM 角色](https://docs.aws.amazon.com/eks/latest/userguide/associate-service-account-role.html)，以及*Kubernetes文档*中的[为容器组（pod）配置服务账号](https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/)。  
类型：字符串  
必需：否  
`volumes`  
为使用 Amazon EKS 资源的作业定义指定卷。  
类型：[EksVolume](https://docs.aws.amazon.com/batch/latest/APIReference/API_EksVolume.html) 对象数组  
必需：否    
emptyDir  
指定Kubernetes `emptyDir`卷的配置。将容器组分配给节点时，会先创建`emptyDir`卷。只要容器组（pod）在该节点上运行，该卷就会存在。`emptyDir` 卷最初是空的。容器组中的所有容器都可以读取和写入`emptyDir`卷中的文件。但是，`emptyDir`卷可以挂载在每个容器中的相同或不同的路径上。出于任何原因将容器组从节点中移除时，将永久删除`emptyDir`中的数据。有关更多信息，请参阅*Kubernetes文档*中的 [emptyDir](https://kubernetes.io/docs/concepts/storage/volumes/#emptydir)。  
类型：[EksEmptyDir](https://docs.aws.amazon.com/batch/latest/APIReference/API_EksEmptyDir.html) 对象  
必需：否    
medium  
存储卷的介质。默认值为空字符串，该字符串使用节点的存储。    
""  
**（默认）**使用节点的磁盘存储。  
“Memory”  
使用由节点 RAM 支持的`tmpfs`卷。节点重新启动时，卷的内容会丢失，并且该卷上的任何存储都将计入容器的内存限制。
类型：字符串  
必需：否  
sizeLimit  
卷的最大大小。默认情况下，未定义最大大小。  
类型：字符串  
长度限制：最小长度为 1。最大长度为 256。  
必需：否  
hostPath  
指定Kubernetes `hostPath`卷的配置。`hostPath`卷将主机节点文件系统中的现有文件或目录挂载到容器组中。有关更多信息，请参阅*Kubernetes文档*中的 [hostPath](https://kubernetes.io/docs/concepts/storage/volumes/#hostpath)。  
类型：[EksHostPath](https://docs.aws.amazon.com/batch/latest/APIReference/API_EksHostPath.html) 对象  
必需：否    
path  
主机上要挂载到容器组中的文件或目录的路径。  
类型：字符串  
必需：否  
名称  
卷的名称。必须允许该名称作为 DNS 子域名。有关更多信息，请参阅*Kubernetes文档*中的 [DNS 子域名](https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#dns-subdomain-names)。  
类型：字符串  
必需：是  
secret  
指定Kubernetes `secret`卷的配置。有关更多信息，请参阅*Kubernetes文档*中的[密文](https://kubernetes.io/docs/concepts/storage/volumes/#secret)。  
类型：[EksSecret](https://docs.aws.amazon.com/batch/latest/APIReference/API_EksSecret.html) 对象  
必需：否    
optional  
指定是否必须定义密文或密文的密钥。  
类型：布尔值  
必需：否  
secretName  
密文的名称。必须允许该名称作为 DNS 子域名。有关更多信息，请参阅*Kubernetes文档*中的 [DNS 子域名](https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#dns-subdomain-names)。  
类型：字符串  
必需：是

## 平台功能
<a name="job-definition-parameters-platform-capabilities"></a>

`platformCapabilities`  
作业定义所需的平台功能。如果未指定任何值，则默认为`EC2`。对于在 Fargate 资源上运行的作业，指定了`FARGATE`。  
如果作业在 Amazon EKS 资源上运行，则不得指定`platformCapabilities`。
类型：字符串  
有效值：`EC2` \$1 `FARGATE`  
必需：否

## 传播标签
<a name="job-definition-parameters-propagate-tags"></a>

`propagateTags`  
指定是否将标签从作业或作业定义传播到相应的 Amazon ECS 任务。如果未指定任何值，则不会传播标签。只能在创建任务后将标签传播到任务。对于名称相同的标签，作业标签的优先级高于作业定义标签。如果作业和作业定义的组合标签总数超过 50 个，则作业将转为`FAILED`状态。  
如果作业在 Amazon EKS 资源上运行，则不得指定`propagateTags`。
类型：布尔值  
必需：否

## 节点属性
<a name="nodeProperties"></a>

`nodeProperties`  
注册多节点并行作业定义时，必须指定节点属性的列表。这些节点属性定义了作业中要使用的节点数量、主节点索引以及要使用的不同节点范围。如果作业在 Fargate 资源上运行，则不能指定`nodeProperties`。请改用`containerProperties`。作业定义中允许使用以下节点属性。有关更多信息，请参阅 [多节点并行作业](multi-node-parallel-jobs.md)。  
如果作业在 Amazon EKS 资源上运行，则不得指定`nodeProperties`。
类型：[NodeProperties](https://docs.aws.amazon.com/batch/latest/APIReference/API_NodeProperties.html) 对象  
必需：否    
`mainNode`  
指定多节点并行作业的主节点的节点索引。此节点索引值必须小于节点数。  
类型：整数  
必需：是  
`numNodes`  
与多节点并行任务关联的节点数。  
类型：整数  
必需：是  
`nodeRangeProperties`  
与多节点并行作业关联的节点范围及其属性的列表。  
节点组即共享相同容器属性的一组完全相同的作业节点。您可以使用 AWS Batch 为每个作业指定最多五个不同的节点组。
类型：[NodeRangeProperty](https://docs.aws.amazon.com/batch/latest/APIReference/API_NodeRangeProperty.html) 对象数组  
必需：是    
`targetNodes`  
节点范围（使用节点索引值）。`0:3`范围表示索引值为 `0` 到 `3` 的节点。如果省略起始范围值 (`:n`)，则使用 0 开始范围。如果省略结束范围值 (`n:`)，则使用可能的最高节点索引结束范围。累积节点范围必须考虑所有节点 (`0:n`)。可以嵌套节点范围，例如`0:10`和`4:5`。在这种情况下，`4:5`范围属性会覆盖`0:10`属性。  
类型：字符串  
必需：否  
`container`  
节点范围的容器详细信息。有关更多信息，请参阅 [容器属性](#containerProperties)。  
类型：[ContainerProperties](https://docs.aws.amazon.com/batch/latest/APIReference/API_ContainerProperties.html) 对象   
必需：否

## 重试策略
<a name="retryStrategy"></a>

`retryStrategy`  
在注册作业定义时，针对使用此作业定义提交的失败作业，可以选择性地指定要用于这些作业的重试策略。在 [SubmitJob](https://docs.aws.amazon.com/batch/latest/APIReference/API_SubmitJob.html) 操作期间，指定的任何重试策略都将覆盖此处定义的重试策略。默认情况下，每个作业尝试一次。如果指定多次尝试，则在作业失败的情况下，则会重试该作业。失败尝试的示例包括：作业返回非零退出代码或容器实例终止。有关更多信息，请参阅 [自动作业重试](job_retries.md)。  
类型：[RetryStrategy](https://docs.aws.amazon.com/batch/latest/APIReference/API_RetryStrategy.html) 对象  
必需：否    
`attempts`  
让作业进入`RUNNABLE`状态的次数。可以指定 1 到 10 之间的尝试次数。如果`attempts`大于 1，则当作业失败时将重试多次，直到它进入`RUNNABLE`状态。  

```
"attempts": integer
```
类型：整数  
必需：否  
`evaluateOnExit`  
最多由 5 个对象组成的数组，指定了在哪些条件下重试作业或作业失败。如果指定了此参数，则还必须指定`attempts`参数。如果指定了`evaluateOnExit`但没有匹配的条目，则会重试该作业。  

```
"evaluateOnExit": [
   {
      "action": "string",
      "onExitCode": "string",
      "onReason": "string",
      "onStatusReason": "string"
   }
]
```
类型：[EvaluateOnExit](https://docs.aws.amazon.com/batch/latest/APIReference/API_EvaluateOnExit.html) 对象数组  
必需：否    
`action`  
指定在满足所有指定条件（`onStatusReason`、`onReason`和`onExitCode`）时要执行的操作。这些值不区分大小写。  
类型：字符串  
必需：是  
有效值：`RETRY` \$1 `EXIT`  
`onExitCode`  
包含 glob 模式，用于与作业返回的`ExitCode`十进制表示法进行匹配。模式最多可包含 512 个字符。其中只能包含数字。不能包含字母或特殊字符。可以选择以星号 (\$1) 结束，这样只有字符串的开头需要完全匹配。  
类型：字符串  
必需：否  
`onReason`  
包含 glob 模式，用于与作业返回的`Reason`进行匹配。模式最多可包含 512 个字符。可以包含字母、数字、句点 (.)、冒号 (:) 和空格（空格、制表符）。可以选择以星号 (\$1) 结束，这样只有字符串的开头需要完全匹配。  
类型：字符串  
必需：否  
`onStatusReason`  
包含 glob 模式，用于与作业返回的`StatusReason`进行匹配。模式最多可包含 512 个字符。可以包含字母、数字、句点 (.)、冒号 (:) 和空格（空格、制表符）。可以选择以星号 (\$1) 结束，这样只有字符串的开头需要完全匹配。  
类型：字符串  
必需：否

## 计划优先级
<a name="job-definition-parameters-schedulingPriority"></a>

`schedulingPriority`  
使用此作业定义提交的作业的计划优先级。此项仅影响具有公平份额策略的作业队列中的作业。具有较高计划优先级的作业在具有较低计划优先级的作业之前计划。  
支持的最小值为 0，支持的最大值为 9999。  
类型：整数  
必需：否

## Tags
<a name="job-definition-parameters-tags"></a>

`tags`  
与作业定义关联的键值配对标签。有关更多信息，请参阅 [标记 AWS Batch 资源](using-tags.md)。  
类型：字符串到字符串映射  
必需：否

## Timeout
<a name="timeout"></a>

`timeout`  
可以为作业配置超时时间，以便在某个作业运行的时间超过超时时间时让AWS Batch终止该作业。有关更多信息，请参阅 [作业超时](job_timeouts.md)。如果作业是因超时而终止，则不会重试。在 [SubmitJob](https://docs.aws.amazon.com/batch/latest/APIReference/API_SubmitJob.html) 操作期间指定的任何超时配置将覆盖此处定义的超时配置。有关更多信息，请参阅 [作业超时](job_timeouts.md)。  
类型：[JobTimeout](https://docs.aws.amazon.com/batch/latest/APIReference/API_JobTimeout.html) 对象  
必需：否    
`attemptDurationSeconds`  
`startedAt`终止未完成作业后的持续时间（从作业尝试的AWS Batch时间戳开始计算），以秒为单位。超时时间的最小值为 60 秒。  
对于数组作业，超时适用于子作业，不适用于父数组作业。  
对于多节点并行（MNP）作业，超时适用于整个作业，不适用于单个节点。  
类型：整数  
必需：否

# 使用创建作业定义 EcsProperties
<a name="multi-container-jobs"></a>

使用 AWS Batch 作业定义后 [https://docs.aws.amazon.com/batch/latest/APIReference/API_EcsProperties.html](https://docs.aws.amazon.com/batch/latest/APIReference/API_EcsProperties.html)，可以在单独的容器中对硬件、传感器、3D 环境和其他模拟进行建模。您可以使用此功能从逻辑上整理工作负载组件，并将它们与主应用程序分开。此功能可在亚马逊弹性容器服务 (Amaz AWS Batch on ECS)、亚马逊 Elastic Kubernetes Service (Amazon EKS) 和 AWS Fargate

## `ContainerProperties` 与 `EcsProperties` 作业定义对比
<a name="containerpropertions-vs-ecsproperties"></a>

您可以根据应用场景的规定选择使用 [https://docs.aws.amazon.com/batch/latest/APIReference/API_ContainerProperties.html](https://docs.aws.amazon.com/batch/latest/APIReference/API_ContainerProperties.html) 或 [https://docs.aws.amazon.com/batch/latest/APIReference/API_EcsProperties.html](https://docs.aws.amazon.com/batch/latest/APIReference/API_EcsProperties.html) 作业定义。简而言之，使用运行 AWS Batch 作业与使用`EcsProperties`运行作业类似`ContainerProperties`。

仍然支持使用 `ContainerProperties` 的旧版作业定义结构。如果您当前有使用此结构的工作流，则可以继续运行这些工作流。

主要区别在于，在作业定义中添加了一个新对象以适应基于 `EcsProperties` 的定义。

例如，在 Amazon ECS 和 Fargate 上使用 `ContainerProperties` 的作业定义具有以下结构：

```
{
   "containerProperties": {
     ...
     "image": "my_ecr_image1",
     ...
  },
...
}
```

在 Amazon ECS 和 Fargate 上使用 `EcsProperties` 的作业定义具有以下结构：

```
{
  "ecsProperties": {
    "taskProperties": [{
      "containers": [
        { 
          ...
          "image": "my_ecr_image1",
          ...
        },
        { 
          ...
          "image": "my_ecr_image2",
          ...
        },
```

## 的一般更改 AWS Batch APIs
<a name="multi-container-general"></a>

以下内容进一步概述了使用 `ContainerProperties` 和 `EcsProperties` API 数据类型时的一些主要区别：
+ `ContainerProperties` 内所使用的许多参数出现在 `TaskContainerProperties` 中。一些示例包括 `command`、`image`、`privileged`、`secrets` 和 `users`。它们都可以在里面找到[TaskContainerProperties](https://docs.aws.amazon.com/batch/latest/APIReference/API_TaskContainerProperties.html)。
+ 有些 `TaskContainerProperties` 参数在旧版结构中没有功能等效项。一些示例包括 `dependsOn`、`essential`、`name`、`ipcMode` 和 `pidMode`。有关更多信息，请参阅[EcsTaskDetails](https://docs.aws.amazon.com/batch/latest/APIReference/API_EcsTaskDetails.html)和[TaskContainerProperties](https://docs.aws.amazon.com/batch/latest/APIReference/API_TaskContainerProperties.html)。

  此外，有些 `ContainerProperties` 参数在 `EcsProperties` 结构中没有等效项或应用。在 [https://docs.aws.amazon.com/batch/latest/APIReference/API_EcsProperties.html#Batch-Type-EcsProperties-taskProperties](https://docs.aws.amazon.com/batch/latest/APIReference/API_EcsProperties.html#Batch-Type-EcsProperties-taskProperties) 中，`container` 已替换为 `containers`，因此新对象最多可以接受十个元素。[https://docs.aws.amazon.com/batch/latest/APIReference/API_RegisterJobDefinition.html#Batch-RegisterJobDefinition-request-containerProperties](https://docs.aws.amazon.com/batch/latest/APIReference/API_RegisterJobDefinition.html#Batch-RegisterJobDefinition-request-containerProperties)
+ `taskRoleArn` 在功能上与 `jobRoleArn` 等效。有关更多信息，请参阅[EcsTaskProperties:taskRoleArn](https://docs.aws.amazon.com/batch/latest/APIReference/API_EcsTaskProperties.html)和[ContainerProperties:jobRoleArn](https://docs.aws.amazon.com/batch/latest/APIReference/API_ContainerProperties.html)。
+ 您可以在 `EcsProperties` 结构中包含一（1）到十（10）个容器。[更多信息请参阅:容器EcsTaskProperties。](https://docs.aws.amazon.com/batch/latest/APIReference/API_EcsTaskProperties.html)
+ `taskProperties` 和 instanceTypes 对象是数组，但目前只接受一个元素。[https://docs.aws.amazon.com/batch/latest/APIReference/API_EcsProperties.html](https://docs.aws.amazon.com/batch/latest/APIReference/API_EcsProperties.html)

## Amazon ECS 的多容器作业定义
<a name="multi-container-ecs-updates"></a>

为了适应 Amazon ECS 的多容器结构，其中某些 API 数据类型有所不同。例如，
+ [https://docs.aws.amazon.com/batch/latest/APIReference/API_RegisterJobDefinition.html#Batch-RegisterJobDefinition-request-ecsProperties](https://docs.aws.amazon.com/batch/latest/APIReference/API_RegisterJobDefinition.html#Batch-RegisterJobDefinition-request-ecsProperties) 与单容器定义中的 `containerProperties` 级别相同。有关更多信息，请参阅 [EcsProperties API 参考指南](https://docs.aws.amazon.com/batch/latest/APIReference/API_EcsProperties.html) 中的 *AWS Batch *。
+ [https://docs.aws.amazon.com/batch/latest/APIReference/API_EcsProperties.html#Batch-Type-EcsProperties-taskProperties](https://docs.aws.amazon.com/batch/latest/APIReference/API_EcsProperties.html#Batch-Type-EcsProperties-taskProperties) 包含为 Amazon ECS 任务定义的属性。有关更多信息，请参阅 [EcsProperties API 参考指南](https://docs.aws.amazon.com/batch/latest/APIReference/API_EcsProperties.html) 中的 *AWS Batch *。
+ [https://docs.aws.amazon.com/batch/latest/APIReference/API_EcsTaskProperties.html#Batch-Type-EcsTaskProperties-containers](https://docs.aws.amazon.com/batch/latest/APIReference/API_EcsTaskProperties.html#Batch-Type-EcsTaskProperties-containers) 包含与单容器定义中的 `containerProperties` 类似的信息。主要区别在于，`containers` 使您可以最多定义十个容器。有关更多信息，请参阅 *AWS Batch API* 参考指南中的[ECSTask属性:容器](https://docs.aws.amazon.com/batch/latest/APIReference/API_EcsTaskProperties.html)。
+ [https://docs.aws.amazon.com/batch/latest/APIReference/API_TaskContainerProperties.html#Batch-Type-TaskContainerProperties-essential](https://docs.aws.amazon.com/batch/latest/APIReference/API_TaskContainerProperties.html#Batch-Type-TaskContainerProperties-essential) 参数指示容器如何影响作业。所有关键容器都必须成功完成（以 0 退出），作业才能继续进行。如果标记为关键的容器失败（以非 0 退出），则作业将会失败。

  默认值为 `true`，并且必须至少将一个容器标记为 `essential`。有关更多信息，请参阅 [`essential` API 参考指南](https://docs.aws.amazon.com/batch/latest/APIReference/API_TaskContainerProperties.html#Batch-Type-TaskContainerProperties-essential) 中的 *AWS Batch *。
+ 使用 [https://docs.aws.amazon.com/batch/latest/APIReference/API_TaskContainerProperties.html#Batch-Type-TaskContainerProperties-dependsOn](https://docs.aws.amazon.com/batch/latest/APIReference/API_TaskContainerProperties.html#Batch-Type-TaskContainerProperties-dependsOn) 参数，您可以定义容器依赖项列表。有关更多信息，请参阅 [`dependsOn` API 参考指南](https://docs.aws.amazon.com/batch/latest/APIReference/API_TaskContainerProperties.html#Batch-Type-TaskContainerProperties-dependsOn) 中的 *AWS Batch *。
**注意**  
`dependsOn` 列表的复杂性以及相关的容器运行时可能会影响作业的开始时间。如果依赖项需要很长时间才能运行，则作业将保持 `STARTING` 状态，直到它们完成。

有关`ecsProperties`和结构的更多信息，请参阅 [ecs](https://docs.aws.amazon.com/batch/latest/APIReference/API_RegisterJobDefinition.html#Batch-RegisterJobDefinition-request-ecsProperties) Properties 的[RegisterJobDefinition](https://docs.aws.amazon.com/batch/latest/APIReference/API_RegisterJobDefinition.html#API_RegisterJobDefinition_RequestBody)请求语法。

## Amazon EKS 的多容器作业定义
<a name="multi-container-eks-updates"></a>

为了适应 Amazon EKS 的多容器结构，其中某些 API 数据类型有所不同。例如，
+ [https://docs.aws.amazon.com/batch/latest/APIReference/API_EksContainer.html#Batch-Type-EksContainer-name](https://docs.aws.amazon.com/batch/latest/APIReference/API_EksContainer.html#Batch-Type-EksContainer-name) 是容器的唯一标识符。此对象不是单个容器所必需的，但是，当在一个容器组（pod）中定义多个容器时，它是必需的。如果未为单个容器定义 `name`，则应用默认名称 `default`。
+ [https://docs.aws.amazon.com/batch/latest/APIReference/API_EksPodProperties.html#Batch-Type-EksPodProperties-initContainers](https://docs.aws.amazon.com/batch/latest/APIReference/API_EksPodProperties.html#Batch-Type-EksPodProperties-initContainers)是在[eksPodProperties](https://docs.aws.amazon.com/batch/latest/APIReference/API_EksPodProperties.html)数据类型中定义的。它们在应用程序容器之前运行，将始终运行到完成，并且必须在下一个容器启动之前成功完成。

  这些容器已在 Amazon EKS Connector 代理中注册，并将注册信息保存在 Amazon Elastic Kubernetes Service 后端数据存储中。`initContainers` 对象最多可以接受十（10）个元素。有关更多信息，请参阅 *Kubernetes 文档*中的 [Init 容器](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/)。
**注意**  
`initContainers` 对象可能会影响作业的开始时间。如果 `initContainers` 需要很长时间才能运行，则作业将保持 `STARTING` 状态，直到它们完成。
+ [https://docs.aws.amazon.com/batch/latest/APIReference/API_EksPodProperties.html#Batch-Type-EksPodProperties-shareProcessNamespace](https://docs.aws.amazon.com/batch/latest/APIReference/API_EksPodProperties.html#Batch-Type-EksPodProperties-shareProcessNamespace) 指示容器组（pod）中的容器是否可以共享相同的进程命名空间。默认值为 `false`。将其设置为 `true` 可以让容器看到位于同一容器组（pod）中的其他容器中的进程并发出信号。
+ 每个容器都很重要。所有容器必须成功完成（以 0 退出），作业才能成功。如果一个容器失败（以非 0 退出），则作业将失败。

有关`eksProperties`和结构的更多信息，请参阅 [eks](https://docs.aws.amazon.com/batch/latest/APIReference/API_RegisterJobDefinition.html#Batch-RegisterJobDefinition-request-eksProperties) Properties 的[RegisterJobDefinition](https://docs.aws.amazon.com/batch/latest/APIReference/API_RegisterJobDefinition.html#API_RegisterJobDefinition_RequestBody)请求语法。

# 参考：使用 EcsProperties 的 AWS Batch 作业场景
<a name="multi-container-jobs-scenarios"></a>

为了说明如何根据您的需求来构造使用 `EcsProperties` 的 AWS Batch 作业定义，本主题介绍了以下 [https://docs.aws.amazon.com/batch/latest/APIReference/API_RegisterJobDefinition.html](https://docs.aws.amazon.com/batch/latest/APIReference/API_RegisterJobDefinition.html) 有效载荷。您可以将这些示例复制到文件中，根据需要对其进行自定义，然后使用 AWS Command Line Interface（AWS CLI）调用 `RegisterJobDefinition`。

## Amazon EC2 上的 Amazon ECS 的 AWS Batch 作业
<a name="multi-container-scenario-on-ec2"></a>

以下是 Amazon Elastic Compute Cloud 上的 Amazon Elastic Container Service 的 AWS Batch 作业示例：

```
{
    "jobDefinitionName": "multicontainer-ecs-ec2",
    "type": "container",
    "ecsProperties": {
        "taskProperties": [
          {
            "containers": [
              {
                "name": "c1",
                "essential": false,
                "command": [
                  "echo",
                  "hello world"
                ],
                "image": "public.ecr.aws/amazonlinux/amazonlinux:latest",
                "resourceRequirements": [
                  {
                    "type": "VCPU",
                    "value": "2"
                  },
                  {
                    "type": "MEMORY",
                    "value": "4096"
                  }
                ]
              },
              {
                "name": "c2",
                "essential": false,
                "command": [
                  "echo",
                  "hello world"
                ],
                "image": "public.ecr.aws/amazonlinux/amazonlinux:latest",
                "resourceRequirements": [
                  {
                    "type": "VCPU",
                    "value": "2"
                  },
                  {
                    "type": "MEMORY",
                    "value": "4096"
                  }
                ]
              },
              {
                "name": "c3",
                "essential": true,
                "command": [
                  "echo",
                  "hello world"
                ],
                "image": "public.ecr.aws/amazonlinux/amazonlinux:latest",
                "firelensConfiguration": {
                  "type": "fluentbit",
                  "options": {
                    "enable-ecs-log-metadata": "true"
                  }
                 },
                "resourceRequirements": [
                  {
                    "type": "VCPU",
                    "value": "6"
                  },
                  {
                    "type": "MEMORY",
                    "value": "12288"
                  }
                ]
              }
            ]
          }
        ]
  }
}
```

## Fargate 上的 Amazon ECS 的 AWS Batch 作业
<a name="multi-containers-ecs-on-fargate"></a>

以下是 AWS Fargate 上的 Amazon Elastic Container Service 的 AWS Batch 作业示例：

```
{
    "jobDefinitionName": "multicontainer-ecs-fargate",
    "type": "container",
    "platformCapabilities": [
        "FARGATE"
    ],
    "ecsProperties": {
        "taskProperties": [
          {
            "containers": [
              {
                "name": "c1",
                "command": [
                  "echo",
                  "hello world"
                ],
                "image": "public.ecr.aws/amazonlinux/amazonlinux:latest",
                "resourceRequirements": [
                  {
                    "type": "VCPU",
                    "value": "2"
                  },
                  {
                    "type": "MEMORY",
                    "value": "4096"
                  }
                ]
              },
              {
                "name": "c2",
                "essential": true,
                "command": [
                  "echo",
                  "hello world"
                ],
                "image": "public.ecr.aws/amazonlinux/amazonlinux:latest",
                "resourceRequirements": [
                  {
                    "type": "VCPU",
                    "value": "6"
                  },
                  {
                    "type": "MEMORY",
                    "value": "12288"
                  }
                ]
              }
            ],
            "executionRoleArn": "arn:aws:iam::1112223333:role/ecsTaskExecutionRole"
          }
        ]
  }
}
```

## 适用于 Amazon EKS 的 AWS Batch 作业
<a name="multi-containers-eks-example"></a>

以下是 Amazon Elastic Kubernetes Service 的 AWS Batch 作业示例：

```
{
  "jobDefinitionName": "multicontainer-eks",
  "type": "container",
  "eksProperties": {
    "podProperties": {
      "shareProcessNamespace": true,
      "initContainers": [
        {
          "name": "init-container",
          "image": "public.ecr.aws/amazonlinux/amazonlinux:2",
          "command": [
            "echo"
          ],
          "args": [
            "hello world"
          ],
          "resources": {
            "requests": {
              "cpu": "1",
              "memory": "512Mi"
            }
          }
        },
        {
          "name": "init-container-2",
          "image": "public.ecr.aws/amazonlinux/amazonlinux:2",
          "command": [
            "echo",
            "my second init container"
          ],
          "resources": {
            "requests": {
              "cpu": "1",
              "memory": "512Mi"
            }
          }
        }
      ],
      "containers": [
        {
          "name": "c1",
          "image": "public.ecr.aws/amazonlinux/amazonlinux:2",
          "command": [
            "echo world"
         ],
          "resources": {
            "requests": {
              "cpu": "1",
              "memory": "512Mi"
            }
          }
        },
        {
          "name": "sleep-container",
          "image": "public.ecr.aws/amazonlinux/amazonlinux:2",
          "command": [
            "sleep",
            "20"
          ],
          "resources": {
            "requests": {
              "cpu": "1",
              "memory": "512Mi"
            }
          }
        }
      ]
    }
  }
}
```

## 每个节点具有多个容器的 MNP AWS Batch 作业
<a name="multi-container-ecs-mnp"></a>

以下是每个节点具有多个容器的多节点并行（MNP）AWS Batch 作业的示例：

```
{
  "jobDefinitionName": "multicontainer-mnp",
  "type": "multinode",
  "nodeProperties": {
    "numNodes": 6,
    "mainNode": 0,
    "nodeRangeProperties": [
      {
        "targetNodes": "0:5",
        "ecsProperties": {
          "taskProperties": [
            {
              "containers": [
                {
                  "name": "range05-c1",
                  "command": [
                    "echo",
                    "hello world"
                  ],
                  "image": "public.ecr.aws/amazonlinux/amazonlinux:latest",
                  "resourceRequirements": [
                    {
                      "type": "VCPU",
                      "value": "2"
                    },
                    {
                      "type": "MEMORY",
                      "value": "4096"
                    }
                  ]
                },
                {
                  "name": "range05-c2",
                  "command": [
                    "echo",
                    "hello world"
                  ],
                  "image": "public.ecr.aws/amazonlinux/amazonlinux:latest",
                  "resourceRequirements": [
                    {
                      "type": "VCPU",
                      "value": "2"
                    },
                    {
                      "type": "MEMORY",
                      "value": "4096"
                    }
                  ]
                }
              ]
            }
          ]
        }
      }
    ]
  }
}
```

# 使用 awslogs 日志驱动程序
<a name="using_awslogs"></a>

默认情况下， AWS Batch 允许`awslogs`日志驱动程序向日志发送 CloudWatch 日志信息。可以使用此功能在同一个方便的位置查看容器中的不同日志，并防止容器日志占用容器实例上的磁盘空间。本主题可帮助在作业定义中配置`awslogs`日志驱动程序。

**注意**  
在 AWS Batch 控制台中，创建作业定义时，可以在**日志配置部分配置日志**驱动程序。`awslogs`

**注意**  
作业中的容器所记录的信息类型主要取决于其`ENTRYPOINT`命令。默认情况下，捕获的日志会显示您在本地运行容器时通常在交互式终端中看到的命令输出，即`STDOUT`和`STDERR` I/O 流。`awslogs`日志驱动程序只需将这些日志从 Docker 传递到 Lo CloudWatch gs 即可。有关如何处理 Docker 日志的更多信息，包括捕获不同文件数据或流的替代方法，请参阅 Docker 文档中的[查看容器或服务的日志](https://docs.docker.com/config/containers/logging/)。

要将系统日志从您的容器实例发送到 CloudWatch 日志，请参阅[将 CloudWatch 日志与配合使用 AWS Batch](using_cloudwatch_logs.md)。有关 CloudWatch 日志的更多信息，请参阅 *Amazon [日志用户指南中的监控日志文件](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/WhatIsCloudWatchLogs.html)和CloudWatch CloudWatch 日志*[配额](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/cloudwatch_limits_cwl.html)。

## awslogs 在数据类型中记录驱动程序选项 AWS Batch JobDefiniton
<a name="create_awslogs_logdriver_options"></a>

`awslogs`日志驱动程序支持 AWS Batch 作业定义中的以下选项。有关更多信息，请参阅 Docker 文档中的[CloudWatch 日志记录驱动程序](https://docs.docker.com/config/containers/logging/awslogs/)。

`awslogs-region`  
必需：否  
指定`awslogs`日志驱动程序应将 Docker 日志发送到的区域。默认情况下，使用的区域与作业的区域相同。您可以选择将来自不同区域任务的所有日志发送到 CloudWatch 日志中的单个区域。这样，所有这些信息在同一个位置可见。或者，也可以按区域将它们分开，以获得更高粒度。但是，选择此选项时，请确保指定的日志组存在于指定的区域中。

`awslogs-group`  
必需：可选  
可以使用`awslogs-group`选项，以指定`awslogs`日志驱动程序将其日志流发送到的日志组。如果未指定，则将使用`aws/batch/job`。

`awslogs-stream-prefix`  
必需：可选  
使用该`awslogs-stream-prefix`选项，您可以将日志流与指定的前缀以及容器所属任务的 Amazon ECS 任务 ID 相关联。 AWS Batch 如果使用此选项指定前缀，则日志流将采用以下格式：  

```
prefix-name/default/ecs-task-id
```

`awslogs-datetime-format`  
必需：否  
此选项以 Python `strftime` 格式定义多行开始位置模式。日志消息由与模式匹配的行以及与模式不匹配的任何以下行组成。因此，匹配行是日志消息之间的分隔符。  
使用此格式的一个使用案例示例是用于解析输出（如堆栈转储），这可能记录在多个条目中。正确模式允许它捕获在单个条目中。  
有关更多信息，请参阅 [awslogs-datetime-format](https://docs.docker.com/config/containers/logging/awslogs/#awslogs-datetime-format)。  
如果同时配置了`awslogs-datetime-format`和`awslogs-multiline-pattern`，此选项始终优先。  
多行日志记录对所有日志消息执行正则表达式解析和匹配。这可能会对日志记录性能产生负面影响。

`awslogs-multiline-pattern`  
必需：否  
此选项使用正则表达式定义多行开始位置模式。日志消息由与模式匹配的行以及与模式不匹配的任何以下行组成。因此，匹配行是日志消息之间的分隔符。  
有关更多信息，请参阅 Docker 文档[awslogs-multiline-pattern](https://docs.docker.com/config/containers/logging/awslogs/#awslogs-multiline-pattern)中的。  
如果还配置了`awslogs-datetime-format`，则会忽略此选项。  
多行日志记录对所有日志消息执行正则表达式解析和匹配。这可能会对日志记录性能产生负面影响。

`awslogs-create-group`  
必需：否  
指定是否要自动创建日志组。如果未指定此选项，则默认为`false`。  
不建议使用该选项。我们建议您在每个作业尝试创建日志组时使用 Lo CloudWatch gs [CreateLogGroup](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateLogGroup.html)API 操作提前创建日志组，这会增加任务失败的机会。
执行角色的 IAM policy 必须包含`logs:CreateLogGroup`权限，然后才能尝试使用`awslogs-create-group`。

## 在作业定义中指定日志配置
<a name="specify-log-config"></a>

默认情况下， AWS Batch 启用`awslogs`日志驱动程序。本节介绍如何为作业自定义`awslogs`日志配置。有关更多信息，请参阅 [创建单节点作业定义](create-job-definition.md)。

以下日志配置 JSON 片段为每个作业指定了一个`logConfiguration`对象。一种用于向名为的日志组发送日志的 WordPress 作业`awslogs-wordpress`，另一种用于向名为的日志组发送日志的 MySQL 容器`awslogs-mysql`。两个容器都使用`awslogs-example`日志流前缀。

```
"logConfiguration": {
    "logDriver": "awslogs",
    "options": {
        "awslogs-group": "awslogs-wordpress",
        "awslogs-stream-prefix": "awslogs-example"
    }
}
```

```
"logConfiguration": {
    "logDriver": "awslogs",
    "options": {
        "awslogs-group": "awslogs-mysql",
        "awslogs-stream-prefix": "awslogs-example"
    }
}
```

在 AWS Batch 控制台中，为`wordpress`作业定义指定日志配置，如下图所示。

![\[Log configuration interface showing awslogs driver with group and stream prefix options.\]](http://docs.aws.amazon.com/zh_cn/batch/latest/userguide/images/awslogs-console-config.png)


在作业定义日志配置中向`awslogs`日志驱动程序注册任务定义后，可以提交包含该作业定义的作业，开始向日志发送日 CloudWatch 志。有关更多信息，请参阅 [教程：提交作业](submit_job.md)。

# 指定敏感数据
<a name="specifying-sensitive-data"></a>

使用 AWS Batch，您可以将敏感数据注入作业，方法是将敏感数据存储在 AWS Secrets Manager 密钥或 Paramet AWS Systems Manager er Store 参数中，然后在作业定义中引用它们。

可以按以下方式将密钥对作业开放：
+ 要将敏感数据作为环境变量注入容器，请使用 `secrets` 作业定义参数。
+ 要引用作业的日志配置中的敏感信息，请使用 `secretOptions` 作业定义参数。

**Topics**
+ [使用 Secrets Manager 指定敏感数据](specifying-sensitive-data-secrets.md)
+ [使用 Systems Manager Parameter Store 指定敏感数据](specifying-sensitive-data-parameters.md)

# 使用 Secrets Manager 指定敏感数据
<a name="specifying-sensitive-data-secrets"></a>

使用 AWS Batch，您可以将敏感数据注入作业，方法是将敏感数据存储在 AWS Secrets Manager 机密中，然后在作业定义中引用它们。存储在 Secrets Manager 密钥中的敏感数据可以作为环境变量或作为日志配置的一部分提供给作业。

在将密钥注入为环境变量时，可以指定 JSON 密钥或要注入的密钥的版本。此过程将帮助您控制提供给作业的敏感数据。有关密钥版本控制的更多信息，请参阅**《AWS Secrets Manager 用户指南》中的 [AWS Secrets Manager的主要术语和概念](https://docs.aws.amazon.com/secretsmanager/latest/userguide/terms-concepts.html#term_secret)。

## 使用 Secrets Manager 指定敏感数据时的注意事项
<a name="secrets-considerations"></a>

在使用 Secrets Manager 指定作业的敏感数据时，应考虑以下事项。
+ 要使用特定的 JSON 密钥或密钥版本注入密钥，您的计算环境中的容器实例必须安装版本 1.37.0 或更高版本的 Amazon ECS 容器代理。但是，我们建议使用最新的容器代理版本。有关检查您的代理版本和更新到最新版本的信息，请参阅 *Amazon Elastic Container Service 开发人员指南* 中的 [更新 Amazon ECS 容器代理](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-update.html)。

  要将密钥的完整内容注入为环境变量或将密钥注入日志配置中，您的容器实例必须具有版本 1.23.0 或更高版本的容器代理。
+ 仅支持存储文本数据的密钥，即使用 [CreateSecret](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_CreateSecret.html)API 的`SecretString`参数创建的密钥。不支持存储二进制数据的密钥，即使用 [CreateSecret](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_CreateSecret.html)API 的`SecretBinary`参数创建的密钥。
+ 当使用引用 Secrets Manager 密钥的作业定义以检索作业的敏感数据时，如果您还在使用接口 VPC 端点，则必须为 Secrets Manager 创建接口 VPC 端点。有关更多信息，请参阅 *AWS Secrets Manager 用户指南*中的[将 Secrets Manager 与 VPC 端点结合使用](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html)。
+ 最初启动作业时，会将敏感数据注入作业中。如果随后更新或轮换密钥，则作业将不会自动接收更新后的值。您必须启动一个新作业，才能强制服务启动具有更新的密钥值的新作业。

## AWS Batch 密钥所需的 IAM 权限
<a name="secrets-iam"></a>

要使用此功能，您必须具有作业执行角色，并在作业定义中引用它。这允许容器代理提取必要的 Secrets Manager 资源。有关更多信息，请参阅 [AWS Batch IAM 执行角色](execution-IAM-role.md)。

要提供对您创建的 Secrets Manager 密钥的访问权限，请将以下权限作为内联策略手动添加到执行角色。有关更多信息，请参阅 *IAM 用户指南*中的[添加和删除 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)。
+ `secretsmanager:GetSecretValue`– 引用 Secrets Manager 密钥时的必填项。
+ `kms:Decrypt` - 仅当您的密钥使用自定义 KMS 密钥而不是原定设置密钥时才需要。您的自定义密钥的 ARN 应添加为资源。

以下示例内联策略会添加所需权限。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue",
                "kms:Decrypt"
            ],
            "Resource": [
                "arn:aws:secretsmanager:us-east-2:777777777777:secret:<secret_name>",
                "arn:aws:kms:us-east-2:777777777777:key/<key_id>"
            ]
        }
    ]
}
```

------

## 作为环境变量注入敏感数据
<a name="secrets-envvar"></a>

您可以在作业定义中指定以下项目：
+ `secrets` 对象包含要在作业中设置的环境变量的名称
+ Secrets Manager 密钥的 Amazon 资源名称（ARN）
+ 包含要提供给作业的敏感数据的其他参数

以下示例显示必须为 Secrets Manager 密钥指定的完整语法。

```
arn:aws:secretsmanager:region:aws_account_id:secret:secret-name:json-key:version-stage:version-id
```

下一部分介绍了其他参数。这些参数是可选的。但如果您不使用它们，则必须包含冒号 `:` 以使用默认值。下面提供了示例，以便您了解更多上下文。

`json-key`  
使用要设置为环境变量值的值指定密钥-值对中密钥的名称。仅支持 JSON 格式的值。如果未指定 JSON 密钥，则使用密钥的完整内容。

`version-stage`  
指定要使用的密钥版本的暂存标签。如果指定了版本的暂存标签，则无法指定版本 ID。如果未指定版本阶段，则默认行为是使用 `AWSCURRENT` 暂存标签检索密钥。  
暂存标签用于在更新或轮换密钥的各个版本时对其进行跟踪。密钥的每个版本均有一个或多个暂存标签和一个 ID。有关更多信息，请参阅《*AWS Secrets Manager 用户指南》*中的 S [AWS ecrets Manager 的关键术语和概念](https://docs.aws.amazon.com/secretsmanager/latest/userguide/terms-concepts.html#term_secret)。

`version-id`  
指定要使用的密钥版本的唯一标识符。如果指定了版本 ID，则无法指定版本暂存标签。如果未指定版本 ID，则默认行为是使用 `AWSCURRENT` 暂存标签检索密钥。  
版本 IDs 用于在密钥的不同版本更新或轮换时对其进行跟踪。密码的每个版本均有一个 ID。有关更多信息，请参阅《*AWS Secrets Manager 用户指南》*中的 S [AWS ecrets Manager 的关键术语和概念](https://docs.aws.amazon.com/secretsmanager/latest/userguide/terms-concepts.html#term_secret)。

### 示例容器定义
<a name="secrets-examples"></a>

以下示例说明了可用于在容器定义中引用 Secrets Manager 密钥的方法。

**Example 引用完整密钥**  
以下是任务定义的片段，其中显示引用 Secrets Manager 密钥的完全文本时的格式。  

```
{
  "containerProperties": [{
    "secrets": [{
      "name": "environment_variable_name",
      "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:secret_name-AbCdEf"
    }]
  }]
}
```

**Example 引用密钥中的特定密钥**  
以下显示了 [> get-secret-value](https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/get-secret-value.html) 命令的输出示例，该命令显示了密钥的内容以及与之关联的版本暂存标签和版本 ID。  

```
{
    "ARN": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf",
    "Name": "appauthexample",
    "VersionId": "871d9eca-18aa-46a9-8785-981dd39ab30c",
    "SecretString": "{\"username1\":\"password1\",\"username2\":\"password2\",\"username3\":\"password3\"}",
    "VersionStages": [
        "AWSCURRENT"
    ],
    "CreatedDate": 1581968848.921
}
```
通过在 ARN 的末尾指定密钥名称，引用容器定义中的上一个输出中的特定密钥。  

```
{
  "containerProperties": [{
    "secrets": [{
      "name": "environment_variable_name",
      "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf:username1::"
    }]
  }]
}
```

**Example 引用特定的密钥版本**  
下面显示了 [>describe-secret](https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/describe-secret.html) 命令中的示例输出，其中显示了密钥的未加密内容以及密钥的所有版本的元数据。  

```
{
    "ARN": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf",
    "Name": "appauthexample",
    "Description": "Example of a secret containing application authorization data.",
    "RotationEnabled": false,
    "LastChangedDate": 1581968848.926,
    "LastAccessedDate": 1581897600.0,
    "Tags": [],
    "VersionIdsToStages": {
        "871d9eca-18aa-46a9-8785-981dd39ab30c": [
            "AWSCURRENT"
        ],
        "9d4cb84b-ad69-40c0-a0ab-cead36b967e8": [
            "AWSPREVIOUS"
        ]
    }
}
```
通过在 ARN 的末尾指定密钥名称，引用容器定义中的上一个输出中的特定版本暂存标签。  

```
{
  "containerProperties": [{
    "secrets": [{
      "name": "environment_variable_name",
      "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf::AWSPREVIOUS:"
    }]
  }]
}
```
通过在 ARN 的末尾指定密钥名称，引用容器定义中的上一个输出中的特定版本 ID。  

```
{
  "containerProperties": [{
    "secrets": [{
      "name": "environment_variable_name",
      "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf::9d4cb84b-ad69-40c0-a0ab-cead36b967e8"
    }]
  }]
}
```

**Example 引用密钥的特定密钥和版本暂存标签**  
以下内容说明如何同时引用密钥中的特定密钥和特定版本暂存标签。  

```
{
  "containerProperties": [{
    "secrets": [{
      "name": "environment_variable_name",
      "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf:username1:AWSPREVIOUS:"
    }]
  }]
}
```
要指定特定密钥和版本 ID，请使用以下语法。  

```
{
  "containerProperties": [{
    "secrets": [{
      "name": "environment_variable_name",
      "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf:username1::9d4cb84b-ad69-40c0-a0ab-cead36b967e8"
    }]
  }]
}
```

## 在日志配置中注入敏感数据
<a name="secrets-logconfig"></a>

在作业定义中指定 `logConfiguration` 时，您可以同时指定 `secretOptions`，方法是使用要在容器中设置的日志驱动程序选项的名称，以及包含要提供给容器的敏感数据的 Secrets Manager 密钥的完整 ARN。

以下是作业定义的片段，其中显示引用 Secrets Manager 密钥时的格式。

```
{
  "containerProperties": [{
    "logConfiguration": [{
      "logDriver": "splunk",
      "options": {
        "splunk-url": "https://cloud.splunk.com:8080"
      },
      "secretOptions": [{
        "name": "splunk-token",
        "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:secret_name-AbCdEf"
      }]
    }]
  }]
}
```

## 创建密 AWS Secrets Manager 钥
<a name="secrets-create-secret"></a>

您可以使用 Secrets Manager 控制台为您的敏感数据创建密钥。有关更多信息，请参阅 *AWS Secrets Manager 用户指南*中的[创建基本密钥](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_create-basic-secret.html)。

**创建基本密钥**

使用 Secrets Manager 为您的敏感数据创建密钥。

1. 打开 Secrets Manager 控制台，网址为[https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/)。

1. 选择**存储新密钥**。

1. 对于**选择密钥类型**，选择**其他密钥类型**。

1. 以 **Key (键)** 和 **Value (值)** 对的形式指定自定义密钥的详细信息。例如，您可以指定键 `UserName`，然后提供适当的用户名作为其值。添加名为 `Password` 的第二个键并将密码文本作为其值。您还可以为数据库名称、服务器地址、TCP 端口等添加条目。您可以添加所需数量的对以存储所需的信息。

   或者，您也可以选择 **Plaintext (明文)** 选项卡，并以所需的任何方式输入密钥值。

1. 选择要用于 AWS KMS 加密密钥中受保护文本的加密密钥。如果您没有选择一个，则 Secrets Manager 会检查账户是否存在原定设置密钥并在存在时使用它。如果不存在原定设置密钥，则 Secrets Manager 将自动为您创建一个。您也可以选择**添加新密钥**以创建专用于该密钥的自定义 KMS 键。要创建您自己的 KMS 键，您必须具有在您的账户中创建 KMS 键的权限。

1. 选择**下一步**。

1. 对于**密钥名称**，请键入可选的路径和名称，如 **production/MyAwesomeAppSecret** 或 **development/TestSecret**，然后选择**下一步**。您可以选择添加描述以帮助记住该密钥以后的用途。

   密钥名称应仅包含 ASCII 字母、数字或以下任意字符：/\$1\$1=.@-

1. (可选) 此时，您可以为密钥配置轮换。对于此程序，请将其保留为**禁用自动轮换**，然后选择**下一步**。

   有关如何配置新密钥或现有密钥的轮换的信息，请参阅[轮换您的 AWS Secrets Manager 密钥](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets.html)。

1. 检查您的设置，然后选择 **Store secret** (存储密钥) 以将输入的所有内容作为新密钥保存在 Secrets Manager 中。

# 使用 Systems Manager Parameter Store 指定敏感数据
<a name="specifying-sensitive-data-parameters"></a>

使用 AWS Batch，您可以将敏感数据注入容器，方法是将敏感数据存储在 P AWS Systems Manager arameter Store 参数中，然后在容器定义中引用它们。

**Topics**
+ [使用 Systems Manager Parameter Store 指定敏感数据时的注意事项](#secrets--parameterstore-considerations)
+ [AWS Batch 密钥所需的 IAM 权限](#secrets-iam-parameters)
+ [作为环境变量注入敏感数据](#secrets-envvar-parameters)
+ [在日志配置中注入敏感数据](#secrets-logconfig-parameters)
+ [创建 AWS Systems Manager 参数存储参数](#secrets-create-parameter)

## 使用 Systems Manager Parameter Store 指定敏感数据时的注意事项
<a name="secrets--parameterstore-considerations"></a>

使用 Systems Manager Parameter Store 参数指定容器的敏感数据时，应考虑以下事项。
+ 此功能要求您的容器实例具有 1.23.0 版或更高版本的容器代理。但是，我们建议使用最新的容器代理版本。有关检查您的代理版本和更新到最新版本的信息，请参阅 *Amazon Elastic Container Service 开发人员指南* 中的 [更新 Amazon ECS 容器代理](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-update.html)。
+ 最初启动容器时，会为您的作业将敏感数据注入容器中。如果随后更新或轮换密钥或 Parameter Store 参数，则容器将不会自动接收已更新的值。您必须启动一个新作业，才能强制启动一个包含更新的密钥的新作业。

## AWS Batch 密钥所需的 IAM 权限
<a name="secrets-iam-parameters"></a>

要使用此功能，您必须具有作业执行角色，并在作业定义中引用它。这允许 Amazon ECS 容器代理提取必要的 AWS Systems Manager 资源。有关更多信息，请参阅 [AWS Batch IAM 执行角色](execution-IAM-role.md)。

要提供对您创建的 P AWS Systems Manager arameter Store 参数的访问权限，请手动将以下权限作为内联策略添加到执行角色。有关更多信息，请参阅 *IAM 用户指南*中的[添加和删除 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)。
+ `ssm:GetParameters`— 当您在任务定义中引用 Systems Manager Parameter Store 参数时，这是必填项。
+ `secretsmanager:GetSecretValue`— 当您直接引用 Secrets Manager 密钥或者您的 System Manager Parameter Store 参数在任务定义中引用 Secrets Manager 密钥时，这是必填项。
+ `kms:Decrypt`- 仅当您的密钥使用自定义 KMS 密钥而不是默认密钥时才需要。您的自定义密钥的 ARN 应添加为资源。

以下示例内联策略添加所需权限：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:GetParameters",
                "secretsmanager:GetSecretValue",
                "kms:Decrypt"
            ],
            "Resource": [
                "arn:aws:ssm:us-east-2:999999999999:parameter/<parameter_name>",
                "arn:aws:secretsmanager:us-east-2:999999999999:secret:<secret_name>",
                "arn:aws:kms:us-east-2:999999999999:key/<key_id>"
            ]
        }
    ]
}
```

------

## 作为环境变量注入敏感数据
<a name="secrets-envvar-parameters"></a>

在容器定义中，使用要在容器中设置的环境变量的名称和包含要提供给容器的敏感数据的 Systems Manager Parameter Store 参数的完整 ARN 指定 `secrets`。

以下是任务定义的片段，其中显示引用 Systems Manager Parameter Store 参数时的格式。如果 Systems Manager Parameter Store 参数存在于要启动的任务所在的区域，则可以使用参数的完整 ARN 或名称。如果参数存在于不同的区域，则必须指定完整的 ARN。

```
{
  "containerProperties": [{
    "secrets": [{
      "name": "environment_variable_name",
      "valueFrom": "arn:aws:ssm:region:aws_account_id:parameter/parameter_name"
    }]
  }]
}
```

## 在日志配置中注入敏感数据
<a name="secrets-logconfig-parameters"></a>

在容器定义中，当指定 `logConfiguration` 时，您可以使用要在容器中设置的日志驱动程序选项的名称以及包含要提供给容器的敏感数据的 Systems Manager Parameter Store 参数的完整 ARN 指定 `secretOptions`。

**重要**  
如果 Systems Manager Parameter Store 参数存在于要启动的任务所在的区域，则可以使用参数的完整 ARN 或名称。如果参数存在于不同的区域，则必须指定完整的 ARN。

以下是任务定义的片段，其中显示引用 Systems Manager Parameter Store 参数时的格式。

```
{
  "containerProperties": [{
    "logConfiguration": [{
      "logDriver": "fluentd",
      "options": {
        "tag": "fluentd demo"
      },
      "secretOptions": [{
        "name": "fluentd-address",
        "valueFrom": "arn:aws:ssm:region:aws_account_id:parameter/parameter_name"
      }]
    }]
  }]
}
```

## 创建 AWS Systems Manager 参数存储参数
<a name="secrets-create-parameter"></a>

您可以使用 AWS Systems Manager 控制台为敏感数据创建 Systems Manager 参数存储参数。有关更多信息，请参见 *AWS Systems Manager 用户指南* 中的 [演练：在命令（控制台）中创建和使用参数](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-paramstore-console.html)。

**创建 Parameter Store 参数**

1. 打开 AWS Systems Manager 控制台，网址为[https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)。

1. 在导航窗格中，依次选择 **Parameter Store** 和 **Create parameter (创建参数)**。

1. 对于 **Name (名称)**，键入层次结构和参数名称。例如，键入 `test/database_password`。

1. 对于 **Description (描述)**，键入可选描述。

1. 对于 “**类型**”，选择 “**字符串**” **StringList**、“或” **SecureString**。
**注意**  
如果您选择 **SecureString**，则会出现 **KMS 密钥 ID** 字段。如果您没有提供 KMS 密钥 ID、KMS 密钥 ARN、别名或别名 ARN，则系统将使用 `alias/aws/ssm`。这是 Systems Manager 的默认 KMS 密钥。要避免使用此密钥，请选择自定义密钥。有关安全字符串的更多信息，请参阅 *AWS Systems Manager 用户指南*中的[使用安全字符串参数](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-paramstore-about.html)。
在控制台中使用具有自定义 KMS 键 别名或别名 ARN 的 `key-id` 参数创建安全字符串参数时，您必须在别名前面指定前缀 `alias/`。以下是 ARN 示例：  

     ```
     arn:aws:kms:us-east-2:123456789012:alias/MyAliasName
     ```
以下是别名示例：  

     ```
     alias/MyAliasName
     ```

1. 对于 **Value (值)**，键入一个值。例如 `MyFirstParameter`。如果您选择 **SecureString**，则该值将完全按照您输入的值进行屏蔽。

1. 选择**创建参数**。

# 作业的私有注册表身份验证
<a name="private-registry"></a>

使用对作业进行私有注册表身份验证 AWS Secrets Manager 使您能够安全地存储凭证，然后在作业定义中引用这些凭证。这提供了一种引用私有注册表中存在的容器镜像的方法 AWS ，这些镜像需要在任务定义中进行身份验证。此功能仅受 Amazon EC2 实例和 Fargate 上托管的作业支持。

**重要**  
如果您的作业定义引用了存储在 Amazon ECR 中的映像，则此主题不适用。有关更多信息，请参阅 *Amazon Elastic Container Registry 用户指南*中的[使用 Amazon ECR 和 Amazon ECS](https://docs.aws.amazon.com/AmazonECR/latest/userguide/ECR_on_ECS.html)。

对于 Amazon EC2 实例上托管的作业，此功能要求您具有版本 `1.19.0` 或更高版本的容器代理。但是，我们建议使用最新的容器代理版本。有关如何检查您的代理版本和更新到最新版本的信息，请参阅《Amazon Elastic Container Service 开发人员指南》**中的 [更新 Amazon ECS 容器代理](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-update.html)。

对于 Fargate 上托管的作业，此功能需要平台版本 `1.2.0` 或更高版本。有关信息，请参阅《Amazon Elastic Container Service 开发人员指南》**中的 [AWS Fargate Linux 平台版本](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/platform-linux-fargate.html)。

在容器定义中，使用您创建的密钥的详细信息指定 `repositoryCredentials` 对象。你引用的密钥可以来自与使用它的工作不同的账户， AWS 区域 也可以来自不同的账户。

**注意**  
使用 AWS Batch API AWS CLI、或 AWS SDK 时，如果密钥与您启动的任务 AWS 区域 相同，则可以使用密钥的完整 ARN 或名称。如果密钥存在于另一个账户中，则必须指定密钥的完整 ARN。使用时 AWS 管理控制台，必须始终指定密钥的完整 ARN。

下面是显示必需参数的作业定义代码段：

```
"containerProperties": [
  {
    "image": "private-repo/private-image",
    "repositoryCredentials": {
      "credentialsParameter": "arn:aws:secretsmanager:region:123456789012:secret:secret_name"
    }
  }
]
```

# 私有注册表身份验证所需的 IAM 权限
<a name="private-auth-iam"></a>

使用此功能需要执行角色。这允许容器代理拉取容器映像。有关更多信息，请参阅 [AWS Batch IAM 执行角色](execution-IAM-role.md)。

要提供对您创建的密钥的访问权限，请将以下权限作为内联策略添加到执行角色。有关更多信息，请参阅[添加和删除 IAM policy](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)。
+ `secretsmanager:GetSecretValue`
+ `kms:Decrypt` - 仅当密钥使用自定义 KMS 密钥而不是原定设置密钥时才需要。您的自定义密钥的 Amazon 资源名称（ARN）必须添加为资源。

下面是添加所需权限的示例内联策略。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "secretsmanager:GetSecretValue"
            ],
            "Resource": [
                "arn:aws:secretsmanager:us-east-1:123456789012:secret:secret_name",
                "arn:aws:kms:us-east-1:123456789012:key/key_id"
            ]
        }
    ]
}
```

------

# 教程：创建私有注册表身份验证的密钥
<a name="private-auth-enable"></a>

完成以下步骤，使用为您的私有注册表凭证创建密钥 AWS Secrets Manager。

**创建基本密钥**

1. 打开 AWS Secrets Manager 控制台，网址为[https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/)。

1. 选择**存储新密钥**。

1. 对于**选择密钥类型**，选择**其他密钥类型**。

1. 选择**纯文本文件**并使用以下格式输入您的私有注册表凭证：

   ```
   {
     "username" : "privateRegistryUsername",
     "password" : "privateRegistryPassword"
   }
   ```

1. 选择**下一步**。

1. 对于 **Secret name**（密钥名称），请输入可选的路径和名称，如 **production/MyAwesomeAppSecret** 或 **development/TestSecret**，然后选择 **Next**（下一步）。您可以选择添加描述以帮助记住该密钥以后的用途。

   密钥名称应仅包含 ASCII 字母、数字或以下任意字符：`/_+=.@-`。

1. (可选) 此时，您可以为密钥配置轮换。对于此程序，请将其保留为**禁用自动轮换**，然后选择**下一步**。

   有关如何配置新密钥或现有密钥轮换的说明，请参阅[轮换您的 AWS Secrets Manager 密钥](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets.html)。

1. 检查您的设置，然后选择 **Store secret**（存储密钥）以将输入的所有内容作为新密钥保存在 Secrets Manager 中。

注册作业定义，然后在**私有注册表**下打开**私有注册表身份验证**。然后，在 **Secrets Manager ARN 或名称**中，输入密钥的 Amazon 资源名称（ARN）。有关更多信息，请参阅 [私有注册表身份验证所需的 IAM 权限](private-auth-iam.md)。

# Amazon EFS 卷
<a name="efs-volumes"></a>

Amazon Elastic File System (Amazon EFS) 提供简单的可扩展文件存储以供AWS Batch作业使用。使用 Amazon EFS 时，存储容量是弹性的。它会随着添加和删除文件而自动扩展。应用程序可在需要时获得所需存储。

可以将 Amazon EFS 文件系统与AWS Batch配合使用，以便导出跨容器实例的实例集的文件系统数据。这样，作业就可以访问相同的永久存储。但是，必须将容器实例 AMI 配置为在 Docker 进程守护程序启动前挂载 Amazon EFS 文件系统。此外，作业定义必须引用容器实例上的卷挂载才能使用该文件系统。下面几个部分可帮助开始使用 Amazon EFS 与AWS Batch配合使用。

## Amazon EFS 卷注意事项
<a name="efs-volume-considerations"></a>

使用 Amazon EFS 卷时应注意以下事项：
+ 对于使用 EC2 资源的作业，已将 Amazon EFS 文件系统支持作为公开预览版添加，其中包括 Amazon ECS 优化 AMI 版本`20191212`以及容器代理版本 1.35.0。但是，Amazon EFS 文件系统支持通过 Amazon ECS 优化 AMI 版本`20200319`和容器代理版本 1.38.0 正式推出，该版本包含 Amazon EFS 接入点和 IAM 授权功能。建议使用 Amazon ECS 优化 AMI 版本`20200319`或更高版本以利用这些功能。有关更多信息，请参阅*《Amazon Elastic Container Service 开发人员指南》*中的[ Amazon ECS 优化 AMI 版本](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-ami-versions.html)。
**注意**  
如果创建自己的 AMI，则必须使用容器代理 1.38.0 或更高版本、`ecs-init`版本 1.38.0-1 或更高版本，并在 Amazon EC2 实例上运行以下命令。这一切都是为了启用 Amazon ECS 卷插件。命令取决于将 Amazon Linux 2 还是 Amazon Linux 用作基本映像。  

Amazon Linux 2  

  ```
  $ yum install amazon-efs-utils
  systemctl enable --now amazon-ecs-volume-plugin
  ```

Amazon Linux  

  ```
  $ yum install amazon-efs-utils
  sudo shutdown -r now
  ```
+ 对于 Fargate 资源的作业，使用 1.4.0 或更高的平台版本时，添加了 Amazon EFS 文件系统支持。有关更多信息，请参阅*《Amazon Elastic Container Service 开发人员指南》*中的[AWS Fargate 平台版本](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/platform_versions.html)。
+ 在使用 Fargate 资源的作业中指定 Amazon EFS 卷时，Fargate 会创建负责管理 Amazon EFS 卷的主管容器。主管容器使用少量的作业内存。主管容器在查询任务元数据版本 4 端点时可见。有关更多信息，请参阅《Amazon Elastic Container Service *AWS Fargate用户指南》*中的[任务元数据端点版本 4](https://docs.aws.amazon.com/AmazonECS/latest/userguide/task-metadata-endpoint-v4-fargate.html)。

## 使用 Amazon EFS 接入点
<a name="efs-volume-accesspoints"></a>

Amazon EFS 接入点是 EFS 文件系统中特定于应用程序的入口点，便于轻松地管理应用程序对共享数据集的访问。有关 Amazon EFS 接入点以及如何控制访问的更多信息，请参阅[《Amazon Elastic File System 用户指南》](https://docs.aws.amazon.com/efs/latest/ug/efs-access-points.html)中的*使用 Amazon EFS 接入点*。

接入点可以为通过接入点发出的所有文件系统请求强制执行用户身份（包括用户的 POSIX 组）。接入点还可以为文件系统强制执行不同的根目录，以便客户端只能访问指定目录或其子目录中的数据。

**注意**  
创建 EFS 接入点时，可以在文件系统上指定用作根目录的路径。在AWS Batch作业定义中引用具有接入点 ID 的 EFS 文件系统时，必须忽略根目录或将根目录设置为`/`，以便在 EFS 接入点上强制执行设置的路径。

可以使用AWS Batch作业 IAM 角色强制特定应用程序使用某个具体的接入点。可以通过将 IAM 策略与接入点相结合轻松地为应用程序提供对特定数据集的安全访问。此功能使用 Amazon ECS IAM 角色来执行任务功能。有关更多信息，请参阅 *Amazon Elastic Container Service 开发人员指南*中的[任务的 IAM 角色](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html)。

## 在作业定义中指定 Amazon EFS 文件系统
<a name="specify-efs-config"></a>

要为容器使用 Amazon EFS 文件系统卷，必须在作业定义中指定卷和挂载点配置。以下作业定义 JSON 代码段显示容器的`volumes`和`mountPoints`对象的语法：

```
{
    "containerProperties": [
        {
            "image": "amazonlinux:2",
            "command": [
                "ls",
                "-la",
                "/mount/efs"
            ],
            "mountPoints": [
                {
                    "sourceVolume": "myEfsVolume",
                    "containerPath": "/mount/efs",
                    "readOnly": true
                }
            ],
            "volumes": [
                {
                    "name": "myEfsVolume",
                    "efsVolumeConfiguration": {
                        "fileSystemId": "fs-12345678",
                        "rootDirectory": "/path/to/my/data",
                        "transitEncryption": "ENABLED",
                        "transitEncryptionPort": integer,
                        "authorizationConfig": {
                            "accessPointId": "fsap-1234567890abcdef1",
                            "iam": "ENABLED"
                        }
                    }
                }
            ]
        }
    ]
}
```

`efsVolumeConfiguration`  
类型：对象  
必需：否  
使用 Amazon EFS 卷时将指定此参数。    
`fileSystemId`  
类型：字符串  
必需：是  
要使用的 Amazon EFS 文件系统 ID。  
`rootDirectory`  
类型：字符串  
必需：否  
Amazon EFS 文件系统中要作为主机内的根目录挂载的目录。如果忽略此参数，将使用 Amazon EFS 卷的根目录。指定`/`与忽略此参数效果相同。其长度最多为 4096 个字符。  
如果在`authorizationConfig`中指定了 EFS 接入点，则必须省略根目录参数，或者将其设置为`/`。这将强制执行 EFS 接入点上设置的路径。  
`transitEncryption`  
类型：字符串  
有效值：`ENABLED` \$1 `DISABLED`  
必需：否  
确定是否对AWS Batch主机和 Amazon EFS 服务器之间传输的 Amazon EFS 数据启用加密。如果使用 Amazon EFS IAM 授权，则必须启用传输加密。如果忽略此参数，将使用默认值`DISABLED`。有关更多信息，请参阅[《Amazon Elastic File System 用户指南》](https://docs.aws.amazon.com/efs/latest/ug/encryption-in-transit.html)中的*加密传输中数据*。  
`transitEncryptionPort`  
类型：整数  
必需：否  
在AWS Batch主机和 Amazon EFS 服务器之间发送加密数据时要使用的端口。如果未指定传输加密端口，将使用 Amazon EFS 挂载帮助程序使用的端口选择策略。该值必须在 0 到 65535 之间。有关更多信息，请参阅[《Amazon Elastic File System 用户指南》](https://docs.aws.amazon.com/efs/latest/ug/efs-mount-helper.html)中的 *EFS 挂载帮助程序*。  
`authorizationConfig`  
类型：对象  
必需：否  
Amazon EFS 文件系统的授权配置详细信息。    
`accessPointId`  
类型：字符串  
必需：否  
要使用的接入点 ID。如果指定了接入点，则必须省略在`efsVolumeConfiguration`中的根目录值，或者将其设置为`/`。这将强制执行 EFS 接入点上设置的路径。如果使用接入点，则必须在`EFSVolumeConfiguration`中启用传输加密。有关更多信息，请参阅*《Amazon Elastic File System 用户指南》*中的[使用 Amazon EFS 接入点](https://docs.aws.amazon.com/efs/latest/ug/efs-access-points.html)。  
`iam`  
类型：字符串  
有效值：`ENABLED` \$1 `DISABLED`  
必需：否  
确定在挂载 Amazon EFS 文件系统时是否使用在作业定义中定义的AWS Batch作业 IAM 角色。如果启用，则必须在`EFSVolumeConfiguration`中启用传输加密。如果忽略此参数，将使用默认值`DISABLED`。有关 IAM 执行角色的更多信息，请参阅 [AWS Batch IAM 执行角色](execution-IAM-role.md)。

# 作业定义示例
<a name="example-job-definitions"></a>

以下主题中的作业定义示例展示了如何使用环境变量、参数替换和卷挂载等常用模式。

**Topics**
+ [环境变量](example-use-envvars.md)
+ [参数替换](example-use-parameters.md)
+ [测试 GPU 功能](example-test-gpu.md)
+ [多节点并行作业](example-mnp-job-definition.md)

# 环境变量
<a name="example-use-envvars"></a>

以下作业定义示例使用环境变量来指定文件类型和 Amazon S3 URL。该特定示例来自[创建简单的“Fetch & Run”AWS Batch 作业](https://aws.amazon.com/blogs/compute/creating-a-simple-fetch-and-run-aws-batch-job/)计算博客文章。博客文章中描述的[https://github.com/awslabs/aws-batch-helpers/blob/master/fetch-and-run/fetch_and_run.sh](https://github.com/awslabs/aws-batch-helpers/blob/master/fetch-and-run/fetch_and_run.sh)脚本使用这些环境变量从 S3 下载`myjob.sh`脚本并声明其文件类型。

尽管在本示例中，命令和环境变量被硬编码到作业定义中，但仍可指定命令和环境变量覆盖，使作业定义更具通用性。

```
{
    "jobDefinitionName": "fetch_and_run",
    "type": "container",
    "containerProperties": {
        "image": "123456789012.dkr.ecr.us-east-1.amazonaws.com/fetch_and_run",
        "resourceRequirements": [
            {
                "type": "MEMORY",
                "value": "2000"
            },
            {
                "type": "VCPU",
                "value": "2"
            }
        ],
        "command": [
            "myjob.sh",
            "60"
        ],
        "jobRoleArn": "arn:aws:iam::123456789012:role/AWSBatchS3ReadOnly",
        "environment": [
            {
                "name": "BATCH_FILE_S3_URL",
                "value": "s3://amzn-s3-demo-source-bucket/myjob.sh"
            },
            {
                "name": "BATCH_FILE_TYPE",
                "value": "script"
            }
        ],
        "user": "nobody"
    }
}
```

# 参数替换
<a name="example-use-parameters"></a>

以下示例作业定义说明了如何允许参数替代和设置默认值。

`Ref::`一节中的`command`声明用于设置参数替代的占位符。提交使用此作业定义的作业时，可以指定参数覆盖以填充这些值，例如`inputfile`和`outputfile`。下面的`parameters`一节设置了`codec`默认值，但可以根据需要覆盖该参数。

有关更多信息，请参阅 [Parameters](job_definition_parameters.md#parameters)。

```
{
    "jobDefinitionName": "ffmpeg_parameters",
    "type": "container",
    "parameters": {"codec": "mp4"},
    "containerProperties": {
        "image": "my_repo/ffmpeg",
        "resourceRequirements": [
            {
                "type": "MEMORY",
                "value": "2000"
            },
            {
                "type": "VCPU",
                "value": "2"
            }
        ],
        "command": [
            "ffmpeg",
            "-i",
            "Ref::inputfile",
            "-c",
            "Ref::codec",
            "-o",
            "Ref::outputfile"
        ],
        "jobRoleArn": "arn:aws:iam::123456789012:role/ECSTask-S3FullAccess",
        "user": "nobody"
    }
}
```

# 测试 GPU 功能
<a name="example-test-gpu"></a>

在以下示例中，作业定义测试[使用 GPU 工作负载 AMI](batch-gpu-ami.md)中所述的 GPU 工作负载 AMI 是否正确配置。此示例作业定义运行来自 GitHub 的 Tensorflow deep MNIST 分类器[示例](https://github.com/tensorflow/tensorflow/blob/r1.8/tensorflow/examples/tutorials/mnist/mnist_deep.py)。

```
{
    "containerProperties": {
        "image": "tensorflow/tensorflow:1.8.0-devel-gpu",
        "resourceRequirements": [
            {
                "type": "MEMORY",
                "value": "32000"
            },
            {
                "type": "VCPU",
                "value": "8"
            }
        ],
        "command": [
            "sh",
            "-c",
            "cd /tensorflow/tensorflow/examples/tutorials/mnist; python mnist_deep.py"
        ]
    },
    "type": "container",
    "jobDefinitionName": "tensorflow_mnist_deep"
}
```

可以创建名为`tensorflow_mnist_deep.json`的文件来包含上面的 JSON 文本，然后使用以下命令注册AWS Batch作业定义：

```
aws batch register-job-definition --cli-input-json file://tensorflow_mnist_deep.json
```

# 多节点并行作业
<a name="example-mnp-job-definition"></a>

以下作业定义示例描述了多节点并行作业。有关更多信息，请参阅*AWS计算*博客中的[使用多节点并行作业构建紧密耦合AWS Batch的分子动力学工作流程](https://aws.amazon.com/blogs/compute/building-a-tightly-coupled-molecular-dynamics-workflow-with-multi-node-parallel-jobs-in-aws-batch/)。

```
{
  "jobDefinitionName": "gromacs-jobdef",
  "jobDefinitionArn": "arn:aws:batch:us-east-2:123456789012:job-definition/gromacs-jobdef:1",
  "revision": 6,
  "status": "ACTIVE",
  "type": "multinode",
  "parameters": {},
  "nodeProperties": {
    "numNodes": 2,
    "mainNode": 0,
    "nodeRangeProperties": [
      {
        "targetNodes": "0:1",
        "container": {
          "image": "123456789012.dkr.ecr.us-east-2.amazonaws.com/gromacs_mpi:latest",
          "resourceRequirements": [
              {
                  "type": "MEMORY",
                  "value": "24000"
              },
              {
                  "type": "VCPU",
                  "value": "8"
              }
          ],
          "command": [],
          "jobRoleArn": "arn:aws:iam::123456789012:role/ecsTaskExecutionRole",
          "ulimits": [],
          "instanceType": "p3.2xlarge"
        }
      }
    ]
  }
}
```