

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

# 在 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. 对于**执行超时 – *可选***，输入超时值（以秒为单位）。执行超时是指未完成的作业终止之前的时间长度。如果某次尝试超过了超时时间，该尝试将停止，状态将转为 `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 个字符。可以包含大小写字母、数字、连字符（-）、下划线（\_）、冒号（:）、正斜杠（/）和数字符号（\#）。此参数可映射到 [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/ \#cmd](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. 如果只配置了一个容器，则必须选择**添加容器**并完成新容器的配置。否则，请选择**下一步**进行检查。