

# 适用于 EC2 工作负载的 Amazon ECS 容量提供程序
<a name="asg-capacity-providers"></a>

当您将 Amazon EC2 实例用于容量时，您可以使用自动扩缩组来管理注册到其集群的 Amazon EC2 实例。Auto Scaling 可帮助确保具有正确数量的 Amazon EC2 实例以处理应用程序负载。

您可以使用托管式扩缩功能来让 Amazon ECS 管理自动扩缩组的横向缩减和横向扩展操作，您也可以自行管理扩缩操作。有关更多信息，请参阅 [通过集群自动扩缩功能自动管理 Amazon ECS 容量](cluster-auto-scaling.md)。

建议您创建新的空自动扩缩组。如果您使用现有 自动扩缩组，则在自动扩缩组用于创建容量提供程序之前，与已在运行并注册到 Amazon ECS 集群的组关联的任何 Amazon EC2 实例都可能无法正确注册到该容量提供程序。使用容量提供程序策略中的容量提供程序时，这可能会引发问题。使用 `DescribeContainerInstances` 可以确认容器实例是否与容量提供程序关联。

**注意**  
要创建空的 自动扩缩组，请将所需计数设置为零。创建容量提供程序并将其与集群关联后，可以扩展它。  
当您使用 Amazon ECS 控制台时，Amazon ECS 将代表您创建一个 Amazon EC2 启动模板和自动扩缩组，作为 CloudFormation 堆栈的一部分。它们的前缀为 `EC2ContainerService-<ClusterName>`。您可以将自动扩缩组用作该集群的容量提供程序。

建议您使用托管式实例耗尽功能，以便在不中断工作负载的情况下平稳终止 Amazon EC2 实例。此功能默认启用。有关更多信息，请参阅 [安全停止在 EC2 实例上运行的 Amazon ECS 工作负载](managed-instance-draining.md)。

在控制台中使用自动扩缩组容量提供程序时应考虑以下因素：
+ 自动扩缩组必须具有大于零的 `MaxSize` 才能横向扩展。
+ 自动扩缩组不能有实例权重设置。
+ 如果自动扩缩组无法横向扩展以适应运行的任务数，则任务将无法转换到 `PROVISIONING` 状态。
+ 请勿修改与由容量提供程序管理的自动扩缩组关联的扩展策略资源。
+ 如果在创建容量提供程序时启用了托管式扩展，则可将自动扩缩组所需计数设置为 `0`。启用托管式扩展后，Amazon ECS 管理自动扩缩组的横向缩减和横向扩展操作。
+ 您必须将容量提供程序与集群关联，然后才能将其与容量提供程序策略关联。
+ 您最多可以为容量提供程序策略指定 20 个容量提供程序。
+ 使用自动扩缩组容量提供程序的服务无法更新为使用 Fargate 容量提供程序，反之亦然。
+ 在容量提供程序策略中，如果未在控制台中为容量提供程序指定 `weight` 值，则使用原定设置值 `1`。如果使用 API或 AWS CLI，则使用原定设置值 `0`。
+ 如果在容量提供程序策略中指定了多个容量提供程序，则至少有一个容量提供程序的权重值必须大于零。任何权重为 0 的容量提供程序都不能用于放置任务。如果您在策略中指定的多个容量提供程序的权重全部为 0，则使用该容量提供程序策略的任何 `RunTask` 或 `CreateService` 操作都将失败。
+ 在容量提供程序策略中，只能有一个容量提供程序定义了*基准值*。如果未指定基准值，则使用默认设置值零。
+ 集群可能同时包含自动扩缩组容量提供程序和 Fargate 容量提供程序。但是，容量提供程序策略只能包含自动扩缩组容量提供程序或 Fargate 容量提供程序，而不能同时包含两者。
+ 集群可能包含使用两个容量提供程序和两种启动类型的服务和独立任务的组合。服务可以更新为使用容量提供程序策略而不是启动类型。但是在执行此操作时必须强制实施新部署。
+ Amazon ECS 支持 Amazon EC2 Auto Scaling 暖池。暖池是一组准备投入使用的预初始化 Amazon EC2 实例。每当您的应用程序需要横向扩展时，Amazon EC2 Auto Scaling 都会使用暖池中的预初始化实例，而不是启动冷实例，这允许运行任何最终初始化过程，然后将实例投入使用。有关更多信息，请参阅 [为您的 Amazon ECS Auto Scaling 组配置预初始化的实例](using-warm-pool.md)。

有关创建 Amazon EC2 Auto Scaling 启动模板的更多信息，请参阅**《Amazon EC2 Auto Scaling 用户指南》中的 [Auto Scaling 启动模板](https://docs.aws.amazon.com/autoscaling/ec2/userguide/launch-templates.html)。有关创建 Amazon EC2 Auto Scaling 组的更多信息，请参阅**《Amazon EC2 Auto Scaling 用户指南》中的 [自动扩缩组](https://docs.aws.amazon.com/autoscaling/ec2/userguide/auto-scaling-groups.html)。

# Amazon ECS 的 Amazon EC2 容器实例安全注意事项
<a name="ec2-security-considerations"></a>

您应该考虑在威胁模型中使用单个容器实例及其访问权限。例如，单个受影响的任务可能能够在同一实例上利用未受影响任务的 IAM 权限。

建议您使用以下方式来帮助防止此情况：
+ 运行任务时请勿使用管理员权限。
+ 为任务分配具有最低权限访问权限的任务角色。

  容器代理会自动创建具有唯一凭证 ID 的令牌，该令牌用于访问 Amazon ECS 资源。
+ 要防止使用 `awsvpc` 网络模式的任务运行的容器访问提供给 Amazon EC2 实例配置文件的凭证信息（同时仍允许任务角色提供的权限），请将代理配置文件中的 `ECS_AWSVPC_BLOCK_IMDS` 代理配置变量设置为 true，然后重新启动代理。
+ 使用 Amazon GuardDuty 运行时监控来检测 AWS 环境中集群和容器的威胁。运行时监控使用 GuardDuty 安全代理为单个 Amazon ECS 工作负载增加运行时可见性，例如，文件访问、进程执行和网络连接。有关更多信息，请参阅《GuardDuty 用户指南》**中的 [GuardDuty 运行时监控](https://docs.aws.amazon.com/guardduty/latest/ug/runtime-monitoring.html)。

# 为 Amazon EC2 工作负载创建 Amazon ECS 集群
<a name="create-ec2-cluster-console-v2"></a>

创建一个集群来定义要在其上运行任务和服务的基础设施。

开始之前，请确保您已完成 [设置以使用 Amazon ECS](get-set-up-for-amazon-ecs.md) 中的步骤，然后分配相应的 IAM 权限。有关更多信息，请参阅 [Amazon ECS 集群示例](security_iam_id-based-policy-examples.md#IAM_cluster_policies)。Amazon ECS 控制台提供了一种简单的方法，通过创建 CloudFormation 堆栈来创建 Amazon ECS 集群所需的资源。

为了使集群创建过程尽可能简单，控制台对许多选项进行了原定设置选择，我们将在下面介绍这些选项。控制台中的大多数部分还提供了帮助面板，以提供进一步的上下文。

您可以在创建集群时注册 Amazon EC2 实例，也可以在创建集群后向集群注册其他实例。

您可以修改以下默认选项：
+ 更改您的实例启动所在的子网。
+ 更改用于控制到容器实例的流量的安全组。
+ 将命名空间添加到集群。

  命名空间允许您在集群中创建的服务无需额外配置即可连接到命名空间中的其他服务。有关更多信息，请参阅 [互连 Amazon ECS 服务](interconnecting-services.md)。
+ 启用任务事件以接收 EventBridge 任务状态更改通知。
+ 为托管存储分配 AWS KMS 密钥。有关如何创建密钥的信息，请参阅《*AWS Key Management Service 用户指南*》中的 [Create a KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)。
+ 为您的 Fargate 临时存储空间分配一个 AWS KMS 密钥。有关如何创建密钥的信息，请参阅《*AWS Key Management Service 用户指南*》中的 [Create a KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)。
+ 为 ECS Exec 配置 AWS KMS 密钥和日志记录。
+ 添加标签以帮助您识别集群。

## 自动扩缩组选项
<a name="capacity-providers"></a>

当您使用 Amazon EC2 实例时，必须指定 自动扩缩组来管理运行任务和服务所在的基础设施。

当您选择创建新的 自动扩缩组时，系统会为以下行为自动配置该组：
+ Amazon ECS 管理自动扩缩组的横向缩减和横向扩展操作。
+ Amazon ECS 将防止包含任务且位于 自动扩缩组中的 Amazon EC2 实例在横向缩减过程中终止。有关更多信息，请参阅 *AWS Auto Scaling 用户指南*中的[实例保护](https://docs.aws.amazon.com/autoscaling/ec2/userguide/as-instance-termination.html#instance-protection)。

您可以配置以下 自动扩缩组属性，这些属性决定组要启动的实例的类型和数量：
+ 经 Amazon ECS 优化的 AMI。
+ 实例类型。
+ 连接到实例时，可证明您的身份的 SSH 密钥对。有关如何创建 SSH 密钥的信息，请参阅《Amazon EC2 用户指南》中的 [Amazon EC2 密钥对和 Linux 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)**。
+ 为 自动扩缩组启动的实例的最小数量。
+ 为 自动扩缩组启动的实例数的最大数量。

  为了使组横向扩展，最大值必须大于 0。

Amazon ECS 将代表您创建一个 Amazon EC2 Auto Scaling 启动模板和自动扩缩组，作为 CloudFormation 堆栈的一部分。您为 AMI、实例类型和 SSH 键对指定的值是启动模板的一部分。这些模板的前缀是 `EC2ContainerService-<ClusterName>`，这使得它们很容易识别。自动扩缩组的前缀是 `<ClusterName>-ECS-Infra-ECSAutoScalingGroup`。

为 自动扩缩组启动的实例使用启动模板。

## 联网选项
<a name="networking-options"></a>

默认情况下，实例会启动到该区域的默认子网中。使用当前与子网关联的安全组，而这些安全组会控制您的容器实例的流量。您可以对实例的子网和安全组进行更改。

您可以选择现有子网。您可以使用现有的安全组，也可以创建一个新的安全组。要在仅 IPv6 配置中创建任务，请使用仅包含 IPv6 CIDR 数据块的子网。

创建新的安全组时，至少需要指定一条入站规则。

入站规则会确定哪些流量可以到达您的容器实例，并包括以下属性：
+ 要允许的协议
+ 允许的端口范围
+ 入站流量（来源）

要允许来自特定地址或 CIDR 数据块的入站流量，请对带有允许的 CIDR 的**来源**使用**自定义**。

要允许来自所有目的地的入站流量，请使用 **Anywhere** 作为**来源**。这将自动添加 0.0.0.0/0 IPv4 CIDR 数据块和 ::/0 IPv6 CIDR 数据块。

要允许来自本地计算机的入站流量，请使用**来源组**作为**来源**。这会自动将您的本地计算机的当前 IP 地址添加为允许的来源。

**要创建新集群（Amazon ECS 控制台）**

在开始之前，分配相应的 IAM 权限。有关更多信息，请参阅 [Amazon ECS 集群示例](security_iam_id-based-policy-examples.md#IAM_cluster_policies)。

1. 在 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2) 打开控制台。

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

1. 在导航窗格中，选择**集群**。

1. 在 **Clusters**（集群）页面上，选择 **Create cluster**（创建集群）。

1. 在**集群配置**下，配置以下内容：
   + 对于**集群名称**，输入唯一的名称。

     该名称最多可以包含 255 个字母（大小写字母）、数字和连字符。
   + （可选）要使 Service Connect 使用的命名空间与集群名称不同，请在 **Service Connect 默认值**下的**默认命名空间**中选择或输入命名空间名称。要使用共享的命名空间，请选择或输入命名空间 ARN。有关如何使用共享命名空间的更多信息，请参阅 [使用共享 AWS Cloud Map 命名空间的 Amazon ECS Service Connect](service-connect-shared-namespaces.md)。

1. 向集群添加 Amazon EC2 实例，展开**基础设施**，然后选择 **Fargate 和自行管理的实例**。

   接下来，配置充当容量提供程序的 自动扩缩组：

   1. 要使用现有 自动扩缩组，请从 **自动扩缩组（ASG）**（自动扩缩组（ASG））中，选择组。

   1. 要创建 自动扩缩组，请从 **自动扩缩组（ASG）**（自动扩缩组（ASG））中，选择 **Create new group**（创建新组），然后提供有关组的以下详细信息：
      + 对于**预置模型**，选择使用**按需型**实例还是**竞价型**实例。
      + 如果您选择使用竞价型实例，则对于**分配策略**，请选择哪些 Spot 容量池（实例类型和可用区）用于该实例。

        对于大多数工作负载，您可以选择**价格容量优化**。

        有关更多信息，请参阅《Amazon EC2 用户指南**》中的[竞价型实例的分配策略](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet-allocation-strategy.html)。
      + 对于**容器实例亚马逊机器映像（AMI）**，选择用于自动扩缩组实例的 Amazon ECS 优化型 AMI。
      + 对于 **EC2 instance type**（EC2 实例类型），选择工作负载的实例类型。

         如果 自动扩缩组使用相同或相似的实例类型，则托管扩展效果最佳。
      + 对于 **EC2 实例角色**，请选择现有的容器实例角色，也可以创建一个新的容器实例角色。

        有关更多信息，请参阅 [Amazon ECS 容器实例 IAM 角色](instance_IAM_role.md)。
      + 对于 **Capacity**（容量），输入 自动扩缩组中启动的实例数的最小值和最大值。
      + 对于 **SSH key pair**（SSH 密钥对），连接到实例时，选择可证明您身份的密钥对。
      + 要允许更大的图像和存储空间，请在**根 EBS 卷大小**中输入以 GiB 为单位的值。

1. （可选）要更改 VPC 和子网，请在 **Amazon EC2 实例的联网**下，执行以下任一操作：
   + 要删除子网，请在 **Subnets**（子网）下，为您要删除的每个子网选择 **X**。
   + 要更改为**默认** VPC 以外的 VPC，请在 **VPC** 下，选择现有的 **VPC**，然后在**子网**下选择子网。对于仅 IPv6 配置，请选择具有 IPv6 CIDR 数据块的 VPC 以及只有 IPv6 CIDR 数据块的子网。
   + 选择安全组。在**安全组**下，选择下列选项之一：
     + 要选择现有安全组，请选择**使用现有安全组**，然后选择安全组。
     + 要创建安全组，请选择**创建新安全组**。然后为每条入站规则选择**添加规则**。

       有关入站规则的信息，请参阅 [联网选项](#networking-options)。
   + 要自动分配公有 IP 地址到您的 Amazon EC2 容器实例，请为**自动分配公有 IP** 选择以下选项之一：
     + **使用子网设置** – 当实例启动所在的子网是公有子网时，为实例分配公有 IP 地址。
     + **开启** – 为实例分配公有 IP 地址。

1. （可选）使用 Container Insights 时，请展开**监控**，然后选择下列选项之一：
   + 要按照建议使用具有增强型可观测性的 Container Insights，请选择**具有增强型可观测性的 Container Insights**。
   + 要使用 Container Insights，请选择 **Container Insights**。

1. （可选）要启用任务事件，请展开**任务事件**，然后开启**启用任务事件**。

   启用任务事件后，Amazon ECS 会将任务状态更改事件发送到 EventBridge。这样，您就可以自动监控和响应任务生命周期更改。

1. （可选）要使用 ECS Exec 调试集群中的任务，请展开**问题排查配置**，然后配置以下内容：
   + （可选）对于 **ECS Exec 的 AWS KMS 密钥**，请输入要用于加密 ECS Exec 会话数据的 AWS KMS 密钥的 ARN。
   + （可选）对于 **ECS Exec 日志记录**，请选择日志目的地：
     + 要向 CloudWatch Logs 发送日志，请选择 **Amazon CloudWatch**。
     + 要将日志发送到 Amazon S3，请选择 **Amazon S3**。
     + 要禁用日志记录，请选择**无**。

1. （可选）

   如果您使用带手动选项的运行时监控，并且希望由 GuardDuty 监视此集群，则请选择**添加标签**并执行以下操作：
   + 对于**键**，输入 **guardDutyRuntimeMonitoringManaged**
   + 对于**值**，请输入 **true**。

1. （可选）加密托管存储上的数据。在**加密**下，对于**托管存储**，输入要用于加密托管存储数据的 AWS KMS 密钥的 ARN。

1. （可选）要管理集群标签，请展开**标签**，然后执行以下操作之一：

   [添加标签] 选择 **Add tag**（添加标签），然后执行以下操作：
   + 对于 **Key**（键），输入键名称。
   + 对于**值**，输入键值。

   [删除标签] 选择标签的“键”和“值”右侧的**Remove**（删除）。

1. 选择**创建**。

## 后续步骤
<a name="ec2-cluster-next-steps"></a>

创建集群后，您可以针对应用程序创建任务定义，然后将其作为独立任务或服务的一部分运行。有关更多信息，请参阅下列内容：
+ [Amazon ECS 任务定义](task_definitions.md)
+ [将应用程序作为 Amazon ECS 任务运行](standalone-task-create.md)
+ [创建 Amazon ECS 滚动更新部署](create-service-console-v2.md)

# 通过集群自动扩缩功能自动管理 Amazon ECS 容量
<a name="cluster-auto-scaling"></a>

Amazon ECS 可以管理注册到您的集群的 Amazon EC2 实例的扩展。这称为 Amazon ECS *集群自动扩缩*。当创建 Amazon ECS Auto Scaling 组容量提供程序时，您可以开启托管式扩缩。然后，您可以为此自动扩缩组中的实例的利用率设置目标百分比（`targetCapacity`）。Amazon ECS 会创建两个自定义 CloudWatch 指标和自动扩缩组的目标跟踪扩缩策略。然后，Amazon ECS 根据您的任务使用的资源利用率来管理横向缩减和横向扩展操作。

对于与集群关联的每个自动扩缩组容量提供程序，Amazon ECS 将创建和管理以下资源：
+ 指标值低 CloudWatch 告警
+ 指标值高 CloudWatch 告警
+ 目标跟踪扩展策略
**注意**  
Amazon ECS 创建目标跟踪扩展策略并将其附加到自动扩缩组。要更新目标跟踪扩展策略，应更新容量提供程序管理的扩展设置，而不是直接更新扩展策略。

当您关闭托管式扩展或取消容量提供程序与集群的关联时，Amazon ECS 将删除 CloudWatch 指标以及目标跟踪扩展策略资源。

Amazon ECS 使用以下指标确定要采取的操作：

`CapacityProviderReservation`  
用于特定容量提供程序的容器实例的百分比。Amazon ECS 会生成此指标。  
Amazon ECS 将 `CapacityProviderReservation` 值设置为 0-100 之间的数字。Amazon ECS 使用以下公式来表示自动扩缩组中剩余容量的比率。然后，Amazon ECS 将指标发布给 CloudWatch。有关计算指标的方式的更多信息，请参阅[深入了解 Amazon ECS 集群自动扩缩](https://aws.amazon.com/blogs/containers/deep-dive-on-amazon-ecs-cluster-auto-scaling/)。  

```
CapacityProviderReservation = (number of instances needed) / (number of running instances) x 100
```

`DesiredCapacity`  
自动扩缩组的容量值。此指标尚未发布到 CloudWatch。

Amazon ECS 将 `CapacityProviderReservation` 指标发布给 `AWS/ECS/ManagedScaling` 命名空间中的 CloudWatch。`CapacityProviderReservation` 指标会导致以下操作之一：

**`CapacityProviderReservation` 值等于 `targetCapacity`**  
自动扩缩组不需要横向缩减或横向扩展。已达到目标利用率的百分比。

**`CapacityProviderReservation` 值大于 `targetCapacity`**  
有更多的任务使用的容量百分比高于您的 `targetCapacity` 百分比。`CapacityProviderReservation` 指标值的增加会导致关联的 CloudWatch 警报生效。此告警会更新 自动扩缩组的 `DesiredCapacity` 值。自动扩缩组使用此值启动 EC2 实例，然后向集群注册它们。  
当 `targetCapacity` 为默认值 100% 时，新任务将在横向扩展期间处于 `PENDING` 状态，因为实例上没有可用容量来运行这些任务。在新实例向 ECS 进行注册后，这些任务将在新实例上启动。

**`CapacityProviderReservation` 值小于 `targetCapacity`**  
使用比您的 `targetCapacity` 百分比低的容量百分比的任务较少，并且至少有一个实例可以被终止。`CapacityProviderReservation` 指标值的减少会导致关联的 CloudWatch 警报生效。此告警会更新 自动扩缩组的 `DesiredCapacity` 值。自动扩缩组使用此值终止 EC2 容器实例，然后从集群中将其注销。  
自动扩缩组遵照组终止策略来确定它在横向缩减事件期间首先终止哪些实例。此外，它还可以避免启用实例横向缩减保护设置的实例。如果您开启托管终止保护，集群自动扩缩可以管理哪些实例具有实例横向缩减保护设置。有关托管终止保护的更多信息，请参阅 [控制 Amazon ECS 终止的实例](managed-termination-protection.md)。有关自动扩缩组终止实例方式的更多信息，请参阅《Amazon EC2 Auto Scaling 用户指南》**中的[控制在横向缩减期间终止哪些自动扩缩实例](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-instance-protection.html)。

使用集群自动扩缩时应考虑以下因素：
+ 请勿更改或管理与容量提供商关联的自动扩缩组的所需容量，该组具有除 Amazon ECS 管理的扩展策略之外的任何扩展策略。
+ 当 Amazon ECS 从 0 个实例开始横向扩展时，将会自动启动 2 个实例。
+ Amazon ECS 使用 `AWSServiceRoleForECS` 服务相关 IAM 角色来获取它代表您调用 AWS Auto Scaling 所需的权限。有关更多信息，请参阅 [对 Amazon ECS 使用服务相关角色](using-service-linked-roles.md)。
+ 将容量提供程序与自动扩缩组结合使用时，对于创建容量提供程序的用户、组或角色需要 `autoscaling:CreateOrUpdateTags` 权限。这是因为Amazon ECS在将 自动扩缩组与容量提供程序关联时会向其添加一个标签。
**重要**  
确保您使用的任何工具都不会从自动扩缩组中删除 `AmazonECSManaged` 标签。如果删除此标签，则 Amazon ECS 无法管理扩缩。
+ 集群自动扩缩不会修改该组的 **MinimumCapacity** 或 **MaximumCapacity**。为了使组横向扩展，**MaximumCapacity** 的值必须大于 0。
+ 启用 Auto Scaling（托管式扩展）时，容量提供程序只能同时连接到一个集群。如果您的容量提供程序已关闭托管扩缩，则可以将其与多个集群关联。
+ 关闭托管式扩展后，容量提供程序不会横向缩减或横向扩展。您可以使用容量提供程序策略来平衡容量提供程序之间的任务。
+ 就容量而言，`binpack` 策略是最有效的策略。
+ 当目标容量低于 100% 时，在放置策略中，`binpack` 策略必须比 `spread` 策略更高阶。这样可以防止容量提供程序在每个任务都有专用实例或达到限制之前横向扩展。

## 开启集群自动扩缩
<a name="cluster-auto-scale-use"></a>

您可以使用控制台或 AWS CLI 开启集群自动扩缩。

当您使用控制台创建使用 EC2 容量提供程序的集群时，Amazon ECS 会代表您创建一个自动扩缩组并设置目标容量。有关更多信息，请参阅 [为 Amazon EC2 工作负载创建 Amazon ECS 集群](create-ec2-cluster-console-v2.md)。

您也可以创建自动扩缩组，然后将其分配给集群。有关更多信息，请参阅 [更新 Amazon ECS 容量提供程序](update-capacity-provider-console-v2.md)。

使用 AWS CLI 时，创建集群后

1. 在创建容量提供程序之前，您需要先创建自动扩缩组。有关更多信息，请参阅**《Amazon EC2 Auto Scaling 用户指南》中的[自动扩缩组](https://docs.aws.amazon.com/autoscaling/ec2/userguide/auto-scaling-groups.html)。

1. 使用 `put-cluster-capacity-providers` 修改集群容量提供程序。有关更多信息，请参阅 [开启 Amazon ECS 集群自动扩缩](turn-on-cluster-auto-scaling.md)。

# 优化 Amazon ECS 集群自动扩缩
<a name="capacity-cluster-speed-up-ec2"></a>

在 Amazon EC2 上运行 Amazon ECS 的客户可以利用集群自动扩缩来管理 Amazon EC2 Auto Scaling 组的扩缩。通过集群自动扩缩，您可以将 Amazon ECS 配置为自动扩缩您的自动扩缩组，您只需专注于运行任务即可。Amazon ECS 可确保自动扩缩组根据需要横向缩减和横向扩展，无需进一步干预。Amazon ECS 容量提供程序用于通过确保有足够的容器实例可以满足应用程序的需求来管理集群中的基础设施。要了解集群自动扩缩在后台的工作方式，请参阅[深入了解 Amazon ECS 集群自动扩缩](https://aws.amazon.com/blogs/containers/deep-dive-on-amazon-ecs-cluster-auto-scaling/)。

集群自动扩缩依赖于基于 CloudWatch 与自动扩缩组的集成来调整集群容量。因此，它具有固有延迟，这种延迟与以下因素相关：
+ 发布 CloudWatch 指标 
+ `CapacityProviderReservation` 指标违反 CloudWatch 警报所花费的时间（包括高、低警报）
+ 新启动的 Amazon EC2 实例预热所花费的时间。您可以执行以下操作来提高集群自动扩缩的响应能力，从而加快部署速度：

## 容量提供程序分步扩缩大小
<a name="cas-step-size"></a>

Amazon ECS 容量提供程序将增加/缩小容器实例，以满足您的应用程序需求。Amazon ECS 将启动的实例最小数量默认设置为 1。如果需要多个实例来放置待处理的任务，这可能会额外增加您的部署时间。您可以通过 Amazon ECS API 增加 [https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ManagedScaling.html](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ManagedScaling.html)，以增加 Amazon ECS 一次横向缩减或扩展的最小实例数量。过低的 [https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ManagedScaling.html](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ManagedScaling.html) 可能会限制一次横向缩减或扩展的容器实例数量，这可能会减慢您的部署速度。

**注意**  
此配置目前只能通过 [https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateCapacityProvider.html](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateCapacityProvider.html) 或 [https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateCapacityProvider.html](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateCapacityProvider.html) API 进行。

## 实例预热期
<a name="instance-warmup-period"></a>

实例预热期是新启动的 Amazon EC2 实例可以向自动扩缩组提供 CloudWatch 指标之后需要经过的时间。指定的预热期到期后，该实例将计入自动扩缩组的聚合指标，集群自动扩缩将继续进行下一次计算迭代，从而估计所需的实例数量。

[https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ManagedScaling.html#ECS-Type-ManagedScaling-instanceWarmupPeriod](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ManagedScaling.html#ECS-Type-ManagedScaling-instanceWarmupPeriod) 的默认值为 300 秒，您可以通过 [https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateCapacityProvider.html](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateCapacityProvider.html) 或 [https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateCapacityProvider.html](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateCapacityProvider.html) API 将其配置为较低的值，以提高扩展响应速度。建议将该值设置为大于 60 秒的值，从而避免过度预置的问题。

## 备用容量
<a name="spare-capacity"></a>

如果您的容量提供程序没有可用于放置任务的容器实例，则它需要通过即时启动 Amazon EC2 实例来增加（横向扩展）集群容量，并等待它们启动后才能在其上启动容器。这样会大大降低任务启动率。您在此有两种选择。

 在这种情况下，已经启动并准备好运行任务的备用 Amazon EC2 容量将提高有效的任务启动率。您可以使用 `Target Capacity` 配置来表示您希望在集群中维护备用容量。例如，通过将 `Target Capacity` 设置为 80%，表示您的集群始终需要 20% 的备用容量。此备用容量可使任何独立任务立即启动，从而确保任务启动不受限制。这种方法的代价是保持备用集群容量的潜在成本增加。

您可以考虑采用另一种方法，即为服务而不是容量提供程序增加余量。这意味着，与其减少 `Target Capacity` 配置以启动备用容量，不如修改服务自动扩缩的目标跟踪扩缩指标或分步扩缩阈值来增加服务中的副本数量。请注意，这种方法仅对高峰工作负载有帮助，但在部署新服务并第一次从 0 个任务增加到 N 个任务时不会产生任何影响。有关相关扩缩策略的更多信息，请参阅《Amazon Elastic Container Service 开发人员指南》**中的[目标跟踪扩缩策略](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-autoscaling-targettracking.html)或[分步扩缩策略](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-autoscaling-stepscaling.html)。

# Amazon ECS 托管式扩缩行为
<a name="managed-scaling-behavior"></a>

如果自动扩缩组容量提供程序使用托管式扩缩功能，Amazon ECS 会估计要添加到集群的最优实例数量，并使用该值来确定要请求或释放的实例数。

## 托管横向扩展行为
<a name="managed-scaling-scaleout"></a>

Amazon ECS 通过遵循服务、独立任务或集群默认设置中的容量提供程序策略，为每项任务选择容量提供程序。对于单个容量提供程序，Amazon ECS 将按照其余步骤进行操作。

没有容量提供程序策略的任务会被容量提供程序忽略。没有容量提供程序策略的待处理任务不会导致任何容量提供程序横向扩展。如果任务或服务设置了启动类型，则该任务或服务无法设置容量提供程序策略。

下面更详细地描述了横向扩展行为。
+ 对此容量提供程序的所有预调配任务进行分组，以便每个组具有相同的精确资源需求。
+ 在自动扩缩组中使用多个实例类型时，自动扩缩组中的实例类型将按其参数进行排序。这些参数包括 vCPU、内存、弹性网络接口（ENI）、端口和 GPU。选择每个参数的最小和最大实例类型。有关如何选择实例类型的更多信息，请参阅 [Amazon ECS 的 Amazon EC2 容器实例](create-capacity.md)。
**重要**  
如果一组任务的资源需求高于自动扩缩组中最小的实例类型，则该组任务无法使用此容量提供程序运行。容量提供程序不对自动扩缩组进行扩展。任务仍处于 `PROVISIONING` 状态。  
为防止任务保持 `PROVISIONING` 状态，建议您针对不同的最低资源要求创建单独的自动扩缩组和容量提供程序。运行任务或创建服务时，仅将容量提供程序添加到容量提供程序策略中，该策略可以在自动扩缩组中最小的实例类型上运行任务。对于其他参数，您可以使用放置约束
+ 对于每组任务，Amazon ECS 计算运行未放置任务所需的实例数。此计算使用 `binpack` 策略。此策略考虑任务的 vCPU、内存、弹性网络接口（ENI）、端口和 GPU 要求。它还考虑 Amazon EC2 实例的资源可用性。将最大实例类型的值视为最大计算实例计数。最小实例类型的值用作保护。如果最小的实例类型无法运行任务的至少一个实例，则计算会将该任务视为不兼容。因此，该任务会被排除在横向扩展计算之外。当所有任务都与最小的实例类型不兼容时，集群自动扩缩将停止，`CapacityProviderReservation` 值保持为 `targetCapacity` 值。
+ 如果出现以下任一情况，Amazon ECS 会将与 CloudWatch 相关的 `CapacityProviderReservation` 指标发布给 `minimumScalingStepSize`。
  + 计算的最大实例计数小于最小扩缩步长大小。
  + 小于 `maximumScalingStepSize` 或最大计算的实例计数的较低值。
+ CloudWatch 警报使用容量提供程序的 `CapacityProviderReservation` 指标。当 `CapacityProviderReservation` 指标值大于 `targetCapacity` 值时，告警也会增加自动扩缩组的 `DesiredCapacity`。`targetCapacity` 值是在集群自动扩缩激活期间发送到 CloudWatch 警报的容量提供程序设置。

  默认 `targetCapacity` 为 100%。
+ 自动扩缩组启动其他 EC2 实例。为防止过度预置，自动扩缩确保最近启动的 EC2 实例容量在启动新实例之前稳定下来。Auto Scaling 会检查是否所有现有实例都已超过 `instanceWarmupPeriod`（现在减去实例启动时间）。`instanceWarmupPeriod` 中的实例无法横向扩展。

  新启动实例的默认预热时间为 300 秒。

有关更多信息，请参阅[深入了解 Amazon ECS 集群自动扩缩](https://aws.amazon.com/blogs/containers/deep-dive-on-amazon-ecs-cluster-auto-scaling/)。

### 横向扩展注意事项
<a name="scale-out-considerations"></a>

 对于横向扩展过程，请考虑以下几点：
+ 尽管存在多个放置约束，但我们建议您只使用 `distinctInstance` 任务放置约束。这可以防止横向扩展过程停止，因为您使用的是与采样实例不兼容的放置约束。
+ 如果 自动扩缩组使用相同或相似的实例类型，则托管扩展效果最佳。
+ 当需要横向扩展过程且当前没有正在运行的容器实例时，Amazon ECS 最初总是横向扩展到两个实例，然后执行额外的横向扩展或横向缩减过程。任何额外的横向扩展均会等待实例预热期。对于横向缩减过程，Amazon ECS 在横向扩展过程结束后会等待 15 分钟，然后才会一直启动横向缩减过程。
+ 第二个横向扩展步骤需要等到 `instanceWarmupPeriod` 到期，这可能会影响整体扩展限制。如果您需要缩短此时间，请确保 `instanceWarmupPeriod` 足够大，以便 EC2 实例启动和开始 Amazon ECS 代理（这可防止过度预置）。
+ 集群自动扩缩支持容量提供程序自动扩缩组中的启动配置、启动模板和多种实例类型。您还可以使用基于属性的实例类型选择而不使用多个实例类型。
+ 使用带有按需实例和多个实例类型或竞价型实例的 自动扩缩组时，请将较大的实例类型放在优先级列表中，并且不指定权重。这时不支持指定权重。有关详细信息，请参见 *AWS Auto Scaling 用户手册*中的[使用多个实例类型 自动扩缩组](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-mixed-instances-groups.html)。
+ 然后，Amazon ECS 将启动 `minimumScalingStepSize`，如果计算的最大实例计数小于最小扩展步长大小，或者 `maximumScalingStepSize` 或最大计算的实例计数值。
+ 如果 Amazon ECS 服务或 `run-task` 启动了一个任务且容量提供程序容器实例没有足够的资源来开始任务，则 Amazon ECS 会限制每个集群具有此状态的任务数量，并防止任何任务超过此限制。有关更多信息，请参阅 [Amazon ECS 服务配额](service-quotas.md)。

## 托管的横向缩减行为
<a name="managed-scaling-scalein"></a>

Amazon ECS 监控集群内每个容量提供程序的容器实例。当容器实例没有运行任何任务时，容器实例被视为空且 Amazon ECS 将启动横向缩减过程。

CloudWatch 横向缩减告警需要 15 个数据点（15 分钟），然后才能开始 自动扩缩组的横向缩减过程。在横向缩减过程开始之后，直到 Amazon ECS 需要减少已注册容器实例的数量时，自动扩缩组将 `DesireCapacity` 值设置为每分钟大于一个实例和少于 50%。

当 Amazon ECS 在横向缩减过程中请求横向扩展时（`CapacityProviderReservation` 大于 100 时），横向缩减过程将停止，如果需要，将从头开始。

下面更详细地描述了横向缩减行为：

1. Amazon ECS 计算空容器实例的数量。当没有运行进程守护程序任务时，容器实例被视为空。

1. Amazon ECS 将 `CapacityProviderReservation` 值设置为 0-100 之间的数字，该数字使用以下公式表示自动扩缩组需要的大小与实际大小的比值，以百分比表示。然后，Amazon ECS 将指标发布给 CloudWatch。有关计算指标的方式的更多信息，请参阅[深入了解 Amazon ECS 集群自动扩缩](https://aws.amazon.com/blogs/containers/deep-dive-on-amazon-ecs-cluster-auto-scaling/) 

   ```
   CapacityProviderReservation = (number of instances needed) / (number of running instances) x 100
   ```

1. `CapacityProviderReservation` 指标会生成 CloudWatch 告警。此告警会更新 自动扩缩组的 `DesiredCapacity` 值。然后，发生下列任一操作时：
   + 如果您不使用容量提供程序托管式终止，自动扩缩组将使用自动扩缩组终止策略选择 EC2 实例，并终止这些实例，直至 EC2 实例的数量达到 `DesiredCapacity`。然后，容器实例将从集群中注销。
   + 如果所有容器实例都使用托管终止保护，Amazon ECS 将删除对空容器实例的横向缩减保护。然后，自动扩缩组将能够终止 EC2 实例。然后，容器实例将从集群中注销。

# 控制 Amazon ECS 终止的实例
<a name="managed-termination-protection"></a>

**重要**  
您必须在自动扩缩组上启用自动扩缩*实例横向缩减保护*才能使用集群自动扩缩的托管终止保护功能。

通过托管式终止保护，集群自动扩缩可以控制终止哪些实例。当您使用托管式终止保护时，Amazon ECS 仅终止没有任何正在运行的 Amazon ECS 任务的 EC2 实例。由使用 `DAEMON` 计划策略的服务运行的任务将被忽略，即使实例正在运行这些任务，也可以通过集群自动扩缩终止该实例。这是因为集群中所有实例均在运行这些任务。

Amazon ECS 首先为自动扩缩组中的 EC2 实例开启*实例横向缩减保护*选项。然后，Amazon ECS 将任务放在实例上。当实例上的所有非进程守护程序任务停止时，Amazon ECS 将启动横向缩减过程并关闭 EC2 实例的横向缩减保护。然后，自动扩缩组可以终止实例。

自动扩缩*实例横向缩减保护*控制自动扩缩可以终止哪些 EC2 实例。在横向缩减过程中，开启了横向缩减功能的实例无法终止。有关自动扩缩实例横向缩减保护的更多信息，请参阅《Amazon EC2 Auto Scaling 用户指南》**中的[使用实例横向缩减保护](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-instance-protection.html)。

您可以设置 `targetCapacity` 百分比，以便有备用容量。这有助于更快地启动未来的任务，因为自动扩缩组不必启动更多实例。Amazon ECS 使用目标容量值来管理该服务创建的 CloudWatch 指标。Amazon ECS 管理 CloudWatch 指标。自动扩缩组被视为稳定状态，因此不需要执行扩缩操作。这些值可以是 0-100%。例如，要将 Amazon ECS 配置为在 Amazon ECS 任务使用的容量之外保持 10% 的可用容量，请将目标容量值设置为 90%。在容量提供程序上设置 `targetCapacity` 值时，请考虑以下因素。
+ 小于 100% 的 `targetCapacity` 值表示集群中需要存在的可用容量（Amazon EC2 实例）的量。可用容量意味着没有正在运行的任务。
+ 可用区之类的放置约束无需额外的 `binpack` 即可强制 Amazon ECS 最终为每个实例运行一个任务，这可能不是所需的行为。

您必须在自动扩缩组上启用自动扩缩实例横向缩减保护才能使用托管终止保护功能。如果您不开启横向缩减保护，则开启托管终止保护可能会导致不良行为。例如，您的实例可能停留在耗尽状态。有关更多信息，请参阅 *Amazon EC2 Auto Scaling 用户指南* 中的[使用实例横向缩减保护](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-instance-protection.html)。

当您对容量提供程序使用终止保护时，请勿在与容量提供程序关联的自动扩缩组上执行任何手动操作，例如分离实例。手动操作可能会中断容量提供程序的横向缩减操作。如果您将某个实例与自动扩缩组分离，则还需要从 Amazon ECS 集群中[取消注册已分离的实例](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deregister_container_instance.html)。

# 更新 Amazon ECS 容量提供商的托管终止保护
<a name="update-managed-termination-protection"></a>

当使用托管终止保护时，您需要更新现有容量提供商的设置。

## 控制台
<a name="update-managed-termination-protection-console"></a>

1. 在 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2) 打开控制台。

1. 在 **Clusters**（集群）页面上，选择集群。

1. 在集群页面上，选择**基础设施**选项卡。

1. 选择容量提供程序。

1. 选择**更新**以修改容量提供商设置。

1. 在**自动扩缩组设置**下，切换**托管终止保护**以启用或禁用该功能。

1. 选择**更新**。

## AWS CLI
<a name="update-managed-termination-protection-cli"></a>

您可以使用 `update-capacity-provider` 命令更新容量提供商的托管终止保护设置：

要启用托管终止保护：

```
aws ecs update-capacity-provider \
  --name CapacityProviderName \
  --auto-scaling-group-provider "managedScaling={status=ENABLED,targetCapacity=70,minimumScalingStepSize=1,maximumScalingStepSize=10},managedTerminationProtection=ENABLED"
```

要禁用托管终止保护：

```
aws ecs update-capacity-provider \
  --name CapacityProviderName \
  --auto-scaling-group-provider "managedScaling={status=ENABLED,targetCapacity=70,minimumScalingStepSize=1,maximumScalingStepSize=10},managedTerminationProtection=DISABLED"
```

**注意**  
更改可能需要几分钟才能在整个集群中生效。启用托管终止保护后，已在运行任务的实例将受到保护，免受横向缩减事件的影响。禁用托管终止保护时，保护标志将在下一个 ECS 容量提供商管理周期内从实例中删除。

## 任务运行控制台
<a name="update-managed-termination-protection-console"></a>

1. 在 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2) 打开控制台。

1. 在 **Clusters**（集群）页面上，选择集群。

1. 在集群页面上，选择**任务**选项卡。

1. 选择任务。

1. 在**配置**下，切换**托管终止保护**以启用或禁用该功能。

1. 选择**配置任务缩容保护**。

   将显示**配置任务缩容保护**对话框

   1. 在**任务缩容保护**下，切换**开启**。

   1. 在**过期时间（分钟）**中，输入任务缩容保护结束之前的分钟数。

   1. 选择**更新**

# 开启 Amazon ECS 集群自动扩缩
<a name="turn-on-cluster-auto-scaling"></a>

启用集群自动扩缩，以便 Amazon ECS 管理注册到您的集群的 Amazon EC2 实例的扩缩。

如果要使用控制台开启集群自动扩缩，请参阅 [创建 Amazon ECS 的容量提供程序](create-capacity-provider-console-v2.md)。

在开始前，请创建自动扩缩组和容量提供程序。有关更多信息，请参阅 [适用于 EC2 工作负载的 Amazon ECS 容量提供程序](asg-capacity-providers.md)。

要开启集群自动扩缩，您需要将容量提供程序与集群相关联，然后开启集群自动扩缩。

1. 使用 `put-cluster-capacity-providers` 命令以将一个或多个容量提供程序与集群关联。

   要添加 AWS Fargate 容量提供程序，请在请求中包含 `FARGATE` 和 `FARGATE_SPOT` 容量提供程序。有关更多信息，请参阅《AWS CLI 命令参考》**中的 `[put-cluster-capacity-providers](https://docs.aws.amazon.com/cli/latest/reference/ecs/put-cluster-capacity-providers.html)`。

   ```
   aws ecs put-cluster-capacity-providers \
     --cluster ClusterName \
     --capacity-providers CapacityProviderName FARGATE FARGATE_SPOT \
     --default-capacity-provider-strategy capacityProvider=CapacityProvider,weight=1
   ```

   要为 EC2 添加自动扩缩组，请在请求中包含自动扩缩组名称。有关更多信息，请参阅《AWS CLI 命令参考》**中的 `[put-cluster-capacity-providers](https://docs.aws.amazon.com/cli/latest/reference/ecs/put-cluster-capacity-providers.html)`。

   ```
   aws ecs put-cluster-capacity-providers \
     --cluster ClusterName \
     --capacity-providers CapacityProviderName \
     --default-capacity-provider-strategy capacityProvider=CapacityProvider,weight=1
   ```

1. 使用 `describe-clusters` 命令以验证关联是否成功。有关更多信息，请参阅《AWS CLI 命令参考》**中的 `[describe-clusters](https://docs.aws.amazon.com/cli/latest/reference/ecs/describe-clusters.html)`。

   ```
   aws ecs describe-clusters \
     --cluster ClusterName \
     --include ATTACHMENTS
   ```

1. 使用 `update-capacity-provider` 命令以为容量提供程序开启托管自动扩缩。有关更多信息，请参阅《AWS CLI 命令参考》**中的 `[update-capacity-provider](https://docs.aws.amazon.com/cli/latest/reference/ecs/update-capacity-provider.html)`。

   ```
   aws ecs update-capacity-provider \
     --name CapacityProviderName \
     --auto-scaling-group-provider "managedScaling={status=ENABLED}"
   ```

# 关闭 Amazon ECS 集群自动扩缩
<a name="turn-off-cluster-auto-scaling"></a>

当需要对注册到您的集群的 EC2 实例进行更精细的控制时，可以关闭集群自动扩缩功能。

要关闭集群的集群自动扩缩，您可以在集群中取消容量提供程序与启用的托管式扩缩的关联，也可以更新容量提供程序以关闭托管式扩缩。

## 取消容量提供程序的关联
<a name="disassociate-capacity-provider"></a>

按照以下步骤将容量提供程序与取消集群关联。

1. 使用 `put-cluster-capacity-providers` 命令来取消自动扩缩组容量提供程序与集群的关联。集群可以与 AWS Fargate 容量提供程序保持关联。有关更多信息，请参阅《AWS CLI 命令参考》**中的 `[put-cluster-capacity-providers](https://docs.aws.amazon.com/cli/latest/reference/ecs/put-cluster-capacity-providers.html)`。

   ```
   aws ecs put-cluster-capacity-providers \
     --cluster ClusterName \
     --capacity-providers FARGATE FARGATE_SPOT \
     --default-capacity-provider-strategy '[]'
   ```

   使用 `put-cluster-capacity-providers` 命令来取消自动扩缩组容量提供程序与集群的关联。有关更多信息，请参阅《AWS CLI 命令参考》**中的 `[put-cluster-capacity-providers](https://docs.aws.amazon.com/cli/latest/reference/ecs/put-cluster-capacity-providers.html)`。

   ```
   aws ecs put-cluster-capacity-providers \
     --cluster ClusterName \
     --capacity-providers [] \
     --default-capacity-provider-strategy '[]'
   ```

1. 使用 `describe-clusters` 命令以验证取消关联是否成功。有关更多信息，请参阅《AWS CLI 命令参考》**中的 `[describe-clusters](https://docs.aws.amazon.com/cli/latest/reference/ecs/describe-clusters.html)`。

   ```
   aws ecs describe-clusters \
     --cluster ClusterName \
     --include ATTACHMENTS
   ```

## 为容量提供程序关闭托管扩缩
<a name="turn-off-managed-scaling"></a>

按照以下步骤关闭容量提供程序的托管扩缩。
+ 使用 `update-capacity-provider` 命令以为容量提供程序关闭托管自动扩缩。有关更多信息，请参阅《AWS CLI 命令参考》**中的 `[update-capacity-provider](https://docs.aws.amazon.com/cli/latest/reference/ecs/update-capacity-provider.html)`。

  ```
  aws ecs update-capacity-provider \
    --name CapacityProviderName \
    --auto-scaling-group-provider "managedScaling={status=DISABLED}"
  ```

# 创建 Amazon ECS 的容量提供程序
<a name="create-capacity-provider-console-v2"></a>

集群创建完成后，您可以为 EC2 创建新的容量提供程序（自动扩缩组）。容量提供程序可帮助为应用程序管理和扩展基础设施。

在创建容量提供程序之前，您需要先创建自动扩缩组。有关更多信息，请参阅**《Amazon EC2 Auto Scaling 用户指南》中的[自动扩缩组](https://docs.aws.amazon.com/autoscaling/ec2/userguide/auto-scaling-groups.html)。

**为集群创建容量提供程序（Amazon ECS 控制台）**

1. 在 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2) 打开控制台。

1. 在导航窗格中，选择**集群**。

1. 在 **Clusters**（集群）页面上，选择集群。

1. 在 **Cluster : *name*（集群：名称）**页面上，选择 **Infrastructure**（基础设施），然后选择 **Create**（创建）。

1. 在 **Create capacity providers**（创建容量提供程序）页面上，配置以下选项。

   1. 在 **Basic details**（基本详细信息）下，对于 **Capacity provider name**（容量提供程序名称），输入唯一的容量提供程序名称。

   1. 在 **Auto Scaling group**（自动扩缩组）下，对于 **Use an existing Auto Scaling group**（使用现有的自动扩缩组），选择自动扩缩组。

   1. （可选）要配置扩缩策略，请在 **Scaling policies**（扩展策略）下配置以下选项。
      + 要让 Amazon ECS 管理横向缩减和横向扩展操作，请选择**开启托管扩展**。
      + 要防止具有正在运行的 Amazon ECS 任务的 EC2 实例被终止，请选择**开启扩展保护**。
      + 对于 **Set target capacity**（设置目标容量），输入在 Amazon ECS 托管式目标跟踪扩展策略中使用的 CloudWatch 指标的目标值。

1. 选择**创建**。

# 更新 Amazon ECS 容量提供程序
<a name="update-capacity-provider-console-v2"></a>

使用 自动扩缩组作为容量提供程序时，可以修改该组的扩展策略。

**更新集群容量提供程序（Amazon ECS 控制台）**

1. 在 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2) 打开控制台。

1. 在导航窗格中，选择**集群**。

1. 在 **Clusters**（集群）页面上，选择集群。

1. 在 **Cluster : *name*（集群：名称）**页面上，选择 **Infrastructure**（基础设施），然后选择 **Update**（更新）。

1. 在 **Create capacity providers**（创建容量提供程序）页面上，配置以下选项。

   1. 在**自动扩缩组**的**扩缩策略**下，配置以下选项。
     + 要让 Amazon ECS 管理横向缩减和横向扩展操作，请选择**开启托管扩展**。
     + 要防止具有正在运行的 Amazon ECS 任务的 EC2 实例被终止，请选择**开启扩展保护**。
     + 对于 **Set target capacity**（设置目标容量），输入在 Amazon ECS 托管式目标跟踪扩展策略中使用的 CloudWatch 指标的目标值。

1. 选择**更新**。

# 删除 Amazon ECS 容量提供程序
<a name="delete-capacity-provider-console-v2"></a>

使用完自动扩缩组容量提供程序后，可以将其删除。删除组后，自动扩缩组容量提供程序将转换为 `INACTIVE` 状态。具有 `INACTIVE` 状态的容量提供程序可能会在一段时间内在您的账户中保持可被发现。但是，此行为可能会在将来发生变化，因此您不应该依赖于持续存在的 `INACTIVE` 容量提供程序。在删除自动扩缩组容量提供程序之前，必须从所有服务的容量提供程序策略中删除该容量提供程序。您可以使用 `UpdateService` API 或 Amazon ECS 控制台中的更新服务工作流，从服务的容量提供程序策略中删除容量提供程序。使用**强制新部署**选项可确保使用该容量提供程序提供的 Amazon EC2 实例容量的所有任务均转换为使用剩余容量提供程序提供的容量。

**要为集群删除容量提供程序（Amazon ECS 控制台）**

1. 在 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2) 打开控制台。

1. 在导航窗格中，选择**集群**。

1. 在 **Clusters**（集群）页面上，选择集群。

1. 在 **Cluster : *name***（集群：名称）页面上，依次选择 **Infrastructure**（基础设施）、自动扩缩组，然后选择 **Delete**（删除）。

1. 在确认框中，输入 **delete *自动扩缩组名称***。

1. 选择**删除**。

# 安全停止在 EC2 实例上运行的 Amazon ECS 工作负载
<a name="managed-instance-draining"></a>

托管实例耗尽有助于优雅终止 Amazon EC2 实例。这使您的工作负载可以安全停止并重新安排到非终止实例。执行基础设施维护和更新时无需担心工作负载中断。通过使用托管实例耗尽功能，您可以简化需要更换 Amazon EC2 实例的基础设施管理工作流程，同时确保应用程序的恢复能力和可用性。

Amazon ECS 托管实例耗尽与自动扩缩组实例替换配合使用。根据实例刷新和最长实例生命周期，客户可以确保其容量符合最新的操作系统和安全规定。

托管式实例耗尽功能只能与 Amazon ECS 容量提供程序结合使用。您可以在使用 Amazon ECS、AWS CLI 或 SDK 创建或更新自动扩缩组容量提供程序时，开启托管式实例耗尽功能。

Amazon ECS 托管实例耗尽涵盖了以下事件。
+ [自动扩缩组实例刷新](https://docs.aws.amazon.com/autoscaling/ec2/userguide/asg-instance-refresh.html) – 使用实例刷新来滚动替换自动扩缩组中的 Amazon EC2 实例，而不是手动批量替换。当您需要替换大量实例时，这将有用。实例刷新是通过 Amazon EC2 控制台或 `StartInstanceRefresh` API 启动的。如果您使用托管终止保护，则请确保在调用 `StartInstanceRefresh` 时为横向缩减保护选择 `Replace`。
+ [最长实例生命周期](https://docs.aws.amazon.com/autoscaling/ec2/userguide/asg-max-instance-lifetime.html) – 在替换自动扩缩组实例时，您可以定义最长生命周期。这有助于根据内部安全策略或合规性安排替换实例。
+ 自动扩缩组横向缩减 – 根据扩缩策略和计划的扩缩操作，自动扩缩组支持自动扩缩实例。通过将自动扩缩组用作 Amazon ECS 容量提供程序，您可以在自动扩缩组实例中没有任务运行时横向缩减这些实例。
+ [自动扩缩组运行状况检查](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-health-checks.html) –自动扩缩组支持许多运行状况检查，以管理运行不正常的实例的终止。
+ [CloudFormation 堆栈更新](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-direct.html) – 您可以向 CloudFormation 堆栈添加 `UpdatePolicy` 属性，以便在组更改时执行滚动更新。
+ [竞价型容量再平衡](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-interruptions.html) – 自动扩缩组尝试根据 Amazon EC2 容量再平衡通知主动替换中断风险较高的竞价型实例。替换实例启动且正常运行后，自动扩缩组会终止旧实例。Amazon ECS 托管式实例耗尽功能会像耗尽非竞价型实例一样耗尽竞价型实例。
+ [Spot 中断](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-capacity-rebalancing.html) – 竞价型实例将在通知两分钟后终止。Amazon ECS 托管实例耗尽会将实例置于耗尽状态作为响应。

**Amazon EC2 Auto Scaling 生命周期挂钩（托管实例耗尽）**  
自动扩缩组生命周期挂钩使客户能够创建由实例生命周期中的特定事件触发的解决方案，并在该特定事件发生时执行自定义操作。一个自动扩缩组最多允许 50 个挂钩。可存在多个终止挂钩并可并行执行，自动扩缩组会等待所有挂钩完成后再终止实例。

除了 Amazon ECS 托管挂钩终止外，您还可以配置自己的生命周期终止挂钩。生命周期挂钩有 `default action`，建议将 `continue` 设置为默认操作，以确保其他挂钩（例如 Amazon ECS 托管式挂钩）不会受到自定义挂钩的任何错误的影响。

如果您已经配置了自动扩缩组终止生命周期挂钩并启用了 Amazon ECS 托管式实例耗尽功能，则两个生命周期挂钩都将执行。但不能保证相对时间。生命周期挂钩有一个 `default action` 设置，用于指定超时过后要采取的操作。如果失败，则建议使用 `continue` 作为自定义挂钩中的默认结果。这样可以确保其他挂钩（尤其是 Amazon ECS 托管式挂钩）不会受到自定义生命周期挂钩中任何错误的影响。`abandon` 的替代结果会导致跳过所有其他挂钩，因此应避免使用。有关自动扩缩组生命周期挂钩的更多信息，请参阅《Amazon EC2 Auto Scaling 用户指南》**中的 [Amazon EC2 Auto Scaling 生命周期挂钩](https://docs.aws.amazon.com/autoscaling/ec2/userguide/lifecycle-hooks.html)。

**任务和托管实例耗尽**  
Amazon ECS 托管实例耗尽使用容器实例中现有的耗尽功能。[容器实例耗尽](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/container-instance-draining.html)功能对属于 Amazon ECS 服务的副本任务执行替换和停止。处于 `PENDING` 或 `RUNNING` 状态的独立任务（如由 `RunTask` 调用的任务）将不受影响。您必须等待这些任务完成或手动停止这些任务。容器实例将保持 `DRAINING` 状态，直到所有任务均已停止或经过 48 小时。进程守护程序任务是在所有副本任务停止后最后停止的任务。

**托管实例耗尽和托管终止保护**  
即使禁用了托管终止，托管式实例耗尽功能也会起作用。有关托管式终止保护的信息，请参阅 [控制 Amazon ECS 终止的实例](managed-termination-protection.md)。

下表总结了托管终止和托管耗尽不同组合的行为。


|  托管终止  |  托管耗尽  |  结果  | 
| --- | --- | --- | 
|  已启用  | 已启用 | Amazon ECS 可保护正在运行任务的 Amazon EC2 实例不被横向缩减事件终止。任何正在终止的实例（例如未设置终止保护、已收到 Spot 中断或因实例刷新而强制终止的实例）都将正常地耗尽。 | 
|  已禁用  | 已启用 | Amazon ECS 无法保护运行任务的 Amazon EC2 实例免于横向缩减。但是，任何正在终止的实例都会正常地耗尽。 | 
|  已启用  | 已禁用 | Amazon ECS 可保护正在运行任务的 Amazon EC2 实例不被横向缩减事件终止。但是，实例仍可能因 Spot 中断、强制实例刷新或其未运行任何任务而终止。Amazon ECS 不会对这些实例执行正常耗尽，并在其停止后启动替换服务任务。 | 
|  已禁用  | 已禁用 | Amazon EC2 实例可以随时进行横向缩减或终止，即使其正在运行 Amazon ECS 任务。Amazon ECS 将在替换服务任务停止后启动这些任务。 | 

**托管式实例耗尽和竞价型实例耗尽**  
使用竞价型实例耗尽功能，您可以在 Amazon ECS 代理上设置环境变量 `ECS_ENABLE_SPOT_INSTANCE_DRAINING`，这样 Amazon ECS 就可以将实例置于耗尽状态，以应对两分钟的 Spot 中断。Amazon ECS 托管实例耗尽有助于正常关闭因多种原因而正在终止的 Amazon EC2 实例，而不仅仅是 Spot 中断。例如，您可以使用 Amazon EC2 Auto Scaling 容量再平衡来主动替换中断风险较高的竞价型实例，托管式实例耗尽会正常关闭替换的竞价型实例。使用托管式实例耗尽功能时，您无需单独启用竞价型实例耗尽功能，因此自动扩缩组用户数据中的 `ECS_ENABLE_SPOT_INSTANCE_DRAINING` 是冗余的。有关竞价型实例耗尽的更多信息，请参阅 [竞价型实例](create-capacity.md#container-instance-spot)。

## 托管式实例耗尽功能如何与 EventBridge 结合使用
<a name="managed-instance-draining-eventbridge"></a>

Amazon ECS 托管实例耗尽事件会发布到 Amazon EventBridge，并且 Amazon ECS 会在您账户的默认总线中创建 EventBridge 托管规则以支持托管实例耗尽。您可以将这些事件筛选到 Lambda、Amazon SNS 和 Amazon SQS 等其他 AWS 服务，以进行监控和问题排查。
+ Amazon EC2 Auto Scaling 在调用生命周期挂钩时向 EventBridge 发送事件。
+ Spot 中断通知已发布到 EventBridge。
+ Amazon ECS 会生成错误消息，您可以通过 Amazon ECS 控制台和 API 来检索这些消息。
+ EventBridge 内置了重试机制，可以缓解临时故障。

# 配置 Amazon ECS 容量提供程序，以安全关闭实例
<a name="enable-managed-instance-draining"></a>

使用 Amazon ECS 控制台和 AWS CLI 创建或更新自动扩缩组容量提供程序时，您可以开启托管式实例耗尽功能。

**注意**  
创建容量提供程序时，默认情况下，托管式实例耗尽功能已开启。

以下是使用 AWS CLI 创建启用托管实例耗尽功能的容量提供程序，以及为集群的现有容量提供程序启用托管实例耗尽功能的示例。

**创建启用托管实例耗尽功能的容量提供程序**  
要创建启用托管实例耗尽功能的容量提供程序，请使用 `create-capacity-provider` 命令。将 `managedDraining` 参数设置为 `ENABLED`。

```
aws ecs create-capacity-provider \
--name capacity-provider \
--auto-scaling-group-provider '{
  "autoScalingGroupArn": "asg-arn",
  "managedScaling": {
    "status": "ENABLED",
    "targetCapacity": 100,
    "minimumScalingStepSize": 1,
    "maximumScalingStepSize": 1
  },
  "managedDraining": "ENABLED",
  "managedTerminationProtection": "ENABLED",
}'
```

响应：

```
{
    "capacityProvider": {
        "capacityProviderArn": "capacity-provider-arn",
        "name": "capacity-provider",
        "status": "ACTIVE",
        "autoScalingGroupProvider": {
            "autoScalingGroupArn": "asg-arn",
            "managedScaling": {
                "status": "ENABLED",
                "targetCapacity": 100,
                "minimumScalingStepSize": 1,
                "maximumScalingStepSize": 1
            },
            "managedTerminationProtection": "ENABLED"
            "managedDraining": "ENABLED"
        }
    }
}
```

**为集群的现有容量提供程序启用托管实例耗尽功能**  
使用 `update-capacity-provider` 命令为集群的现有容量提供程序启用托管实例耗尽功能。您会看到 `managedDraining` 目前显示为 `DISABLED` 而 `updateStatus` 显示为 `UPDATE_IN_PROGRESS`。

```
aws ecs update-capacity-provider \
--name cp-draining \
--auto-scaling-group-provider '{
  "managedDraining": "ENABLED"
}
```

响应：

```
{
    "capacityProvider": {
        "capacityProviderArn": "cp-draining-arn",
        "name": "cp-draining",
        "status": "ACTIVE",
        "autoScalingGroupProvider": {
            "autoScalingGroupArn": "asg-draining-arn",
            "managedScaling": {
                "status": "ENABLED",
                "targetCapacity": 100,
                "minimumScalingStepSize": 1,
                "maximumScalingStepSize": 1,
                "instanceWarmupPeriod": 300
            },
            "managedTerminationProtection": "DISABLED",
            "managedDraining": "DISABLED" // before update
        },
        "updateStatus": "UPDATE_IN_PROGRESS", // in progress and need describe again to find out the result
        "tags": [
        ]
    }
}
```



使用 `describe-clusters` 命令并包含 `ATTACHMENTS`。托管实例耗尽 attachment 的 `status` 为 `PRECREATED`，总体 `attachmentsStatus` 为 `UPDATING`。

```
aws ecs describe-clusters --clusters cluster-name --include ATTACHMENTS
```

响应：

```
{
    "clusters": [
        {
            ...

            "capacityProviders": [
                "cp-draining"
            ],
            "defaultCapacityProviderStrategy": [],
            "attachments": [
                # new precreated managed draining attachment
                {
                    "id": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
                    "type": "managed_draining",
                    "status": "PRECREATED",
                    "details": [
                        {
                            "name": "capacityProviderName",
                            "value": "cp-draining"
                        },
                        {
                            "name": "autoScalingLifecycleHookName",
                            "value": "ecs-managed-draining-termination-hook"
                        }
                    ]
                },

                ...

            ],
            "attachmentsStatus": "UPDATING"
        }
    ],
    "failures": []
}
```

更新完成后，使用 `describe-capacity-providers`，您将看到 `managedDraining` 现在为 `ENABLED`。

```
aws ecs describe-capacity-providers --capacity-providers cp-draining
```

响应：

```
{
    "capacityProviders": [
        {
            "capacityProviderArn": "cp-draining-arn",
            "name": "cp-draining",
            "status": "ACTIVE",
            "autoScalingGroupProvider": {
                "autoScalingGroupArn": "asg-draning-arn",
                "managedScaling": {
                    "status": "ENABLED",
                    "targetCapacity": 100,
                    "minimumScalingStepSize": 1,
                    "maximumScalingStepSize": 1,
                    "instanceWarmupPeriod": 300
                },
                "managedTerminationProtection": "DISABLED",
                "managedDraining": "ENABLED" // successfully update
            },
            "updateStatus": "UPDATE_COMPLETE",
            "tags": []
        }
    ]
}
```

## 排查 Amazon ECS 托管式实例耗尽问题
<a name="managed-instance-troubleshooting"></a>

您可能需要对托管式实例耗尽问题进行排查。以下是您在使用它时可能遇到的问题和解决方法的示例。

**使用自动扩缩时，实例不会在超过最大实例生命周期后终止。**  
如果您的实例在使用自动扩缩组时达到并超过了实例的最大生命周期后仍未终止，则可能是因为它们受到了防止横向缩减的保护。您可以关闭托管式终止并允许托管耗尽功能来处理实例回收。

## Amazon ECS 托管实例的耗尽行为
<a name="managed-instances-draining-behavior"></a>

Amazon ECS 托管实例终止可确保工作负载正常过渡，同时优化成本并保持系统正常运行。终止系统为实例终止提供了三种不同的决策路径，每种路径都有不同的时间特征和客户影响概况。

### 终止决策路径
<a name="managed-instances-termination-paths"></a>

客户发起的终止  
当您需要立即从服务中移除容器实例时，可直接控制实例移除。您可以调用 DeregisterContainerInstance API 并将 force 标志设置为 true，表示尽管有工作负载正在运行，但仍需要立即终止。

系统发起的空闲终止  
Amazon ECS 托管实例通过终止未运行任何任务的闲置 Amazon ECS 容器实例，持续监控并主动优化成本。ECS 使用启发式延迟让容器实例有机会在终止之前获取新启动的任务。可以使用 `scaleInAfter` Amazon ECS 托管实例容量提供程序配置参数进行自定义。

基础设施刷新终止  
Amazon ECS 托管实例会自动管理和更新托管容器实例上的软件，进而确保安全性和合规性，同时保持工作负载可用性。有关更多信息，请参阅 [Amazon ECS 托管实例修补](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/managed-instances-patching.html)。

### 正常耗尽和工作负载迁移
<a name="managed-instances-draining-coordination"></a>

正常耗尽系统实施与 Amazon ECS 服务管理的复杂协调，确保服务管理的任务从计划终止的实例中正确迁移。

**服务任务耗尽协调**  
当实例转换为 DRAINING 状态时，Amazon ECS 计划程序会自动停止在实例上放置新任务，同时对现有服务任务实施正常关闭过程。服务任务耗尽包括与服务部署策略、运行状况检查要求和您的耗尽偏好进行协调，以确保最佳迁移时间和成功率。

**独立任务处理**  
独立任务需要不同的处理方式，因为它们不能从自动服务管理中受益。该系统评估独立任务特征，包括任务持续时间估计、完成概率分析和客户影响评估。正常完成策略允许独立任务在较长的宽限期内自然完成，而强制终止可确保在任务未自然完成时在可接受的时间范围内进行基础设施刷新。

### 两阶段完成策略
<a name="managed-instances-two-phase-completion"></a>

终止系统实施一种两阶段方法，在工作负载连续性和基础设施管理要求之间取得平衡。

**第 1 阶段：正常完成时间段**  
在此阶段，系统实施正常耗尽策略，优先考虑工作负载连续性。服务任务会通过正常的 Amazon ECS 计划流程正常耗尽，独立任务继续运行并可能会自然完成，系统会监控所有任务是否通过自然完成流程达到停止状态。

**第 2 阶段：强制执行硬性截止日期**  
当正常完成无法在可接受的时间范围内实现终止目标时，系统将强制执行硬性截止日期。硬性截止日期通常设定为启动时间加上七天，这样既能为正常完成留出充足的时间，又能满足运营要求。强制执行包括自动调用强制注销过程，以及无论完成状态如何都立即终止所有剩余任务。

# 使用 AWS 管理控制台 创建 Amazon ECS 集群自动扩缩资源
<a name="tutorial-cluster-auto-scaling-console"></a>

了解如何使用 AWS 管理控制台 创建用于集群自动扩缩的资源。如果资源需要名称，我们将使用前缀 `ConsoleTutorial` 来确保它们都具有唯一的名称，并使它们易于找到。

**Topics**
+ [

## 先决条件
](#console-tutorial-prereqs)
+ [

## 步骤 1：创建 Amazon ECS 集群
](#console-tutorial-cluster)
+ [

## 第 2 步：注册任务定义
](#console-tutorial-register-task-definition)
+ [

## 第 3 步：运行任务
](#console-tutorial-run-task)
+ [

## 第 4 步：验证
](#console-tutorial-verify)
+ [

## 第 5 步：清理
](#console-tutorial-cleanup)

## 先决条件
<a name="console-tutorial-prereqs"></a>

本教程假设以下先决条件已完成：
+ [设置以使用 Amazon ECS](get-set-up-for-amazon-ecs.md) 中的步骤已完成。
+ 您的 IAM 用户具有 [AmazonECS\$1FullAccess](security-iam-awsmanpol.md#security-iam-awsmanpol-AmazonECS_FullAccess) IAM 策略示例中指定的必需权限。
+ 创建 Amazon ECS 容器实例 IAM 角色。有关更多信息，请参阅 [Amazon ECS 容器实例 IAM 角色](instance_IAM_role.md)。
+ 创建 Amazon ECS 服务相关 IAM 角色。有关更多信息，请参阅 [对 Amazon ECS 使用服务相关角色](using-service-linked-roles.md)。
+ 创建自动扩缩服务相关 IAM 角色。有关更多信息，请参阅 [Amazon EC2 Auto Scaling 用户指南](https://docs.aws.amazon.com/autoscaling/ec2/userguide/autoscaling-service-linked-role.html)中的 *Amazon EC2 Auto Scaling 的服务相关角色*。
+ 您已创建要使用的 VPC 和安全组。有关更多信息，请参阅 [创建虚拟私有云](get-set-up-for-amazon-ecs.md#create-a-vpc)。

## 步骤 1：创建 Amazon ECS 集群
<a name="console-tutorial-cluster"></a>

请按照以下步骤创建 Amazon ECS 集群。

Amazon ECS 将代表您创建一个 Amazon EC2 Auto Scaling 启动模板和自动扩缩组，作为 CloudFormation 堆栈的一部分。

1. 在 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2) 打开控制台。

1. 在导航窗格中，选择**集群**，然后选择**创建集群**。

1. 在**集群配置**下方的**集群名称**中，输入 `ConsoleTutorial-cluster`。

1. 在**基础设施**下，清除 AWS Fargate（无服务器），然后选择 **Amazon EC2 实例**。接下来，配置充当容量提供程序的自动扩缩组。

   1. 在**自动扩缩组（ASG）**下。选择**创建新 ASG**，然后提供有关该组的以下详细信息：
     + 对于**操作系统/架构**，选择 **Amazon Linux 2**。
     + 对于 **EC2 实例类型**，选择 **t3.nano**。
     + 对于 **Capacity**（容量），输入 自动扩缩组中启动的实例数的最小值和最大值。

1. （可选）要管理集群标签，请展开**标签**，然后执行以下操作之一：

   [添加标签] 选择 **Add tag**（添加标签），然后执行以下操作：
   + 对于 **Key**（键），输入键名称。
   + 对于**值**，输入键值。

   [删除标签] 选择标签的“键”和“值”右侧的**Remove**（删除）。

1. 选择**创建**。

## 第 2 步：注册任务定义
<a name="console-tutorial-register-task-definition"></a>

您必须先注册任务定义，然后才能在集群上运行任务。任务定义是分组在一起的一系列容器。以下示例是一个简单的任务定义，它使用 Docker Hub 中的 `amazonlinux` 映像，并且直接休眠。有关可用任务定义参数的更多信息，请参阅 [Amazon ECS 任务定义](task_definitions.md)。

1. 在 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2) 打开控制台。

1. 在导航窗格中，选择 **Task definitions**（任务定义）。

1. 选择 **Create new task definition**（创建新的任务定义）、**Create new task definition with JSON**（使用 JSON 创建新的任务定义）。

1. 在 **JSON 编辑器**框中，粘贴以下内容。

   ```
   {
       "family": "ConsoleTutorial-taskdef",
       "containerDefinitions": [
           {
               "name": "sleep",
               "image": "public.ecr.aws/amazonlinux/amazonlinux:latest",
               "memory": 20,
               "essential": true,
               "command": [
                   "sh",
                   "-c",
                   "sleep infinity"
               ]
           }
       ],
       "requiresCompatibilities": [
           "EC2"
       ]
   }
   ```

1. 选择**创建**。

## 第 3 步：运行任务
<a name="console-tutorial-run-task"></a>

为您的账户注册任务定义后，您可以在集群中运行任务。在本教程中，您将在 `ConsoleTutorial-cluster` 集群中运行五个 `ConsoleTutorial-taskdef` 任务定义实例。

1. 在 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2) 打开控制台。

1. 在**集群**页面上，选择 **ConsoleTutorial-cluster**。

1. 在**任务**下，选择**运行新任务**。

1. 在**环境**部分的**计算选项**下，选择**容量提供程序策略**。

1. 在**部署配置**下，对于**应用程序类型**，选择**任务**。

1.  从**系列**下拉列表中选择 **ConsoleTutorial-taskdef**。

1. 在**所需任务**下，输入 5。

1. 选择**创建**。

## 第 4 步：验证
<a name="console-tutorial-verify"></a>

本教程到目前为止，您应该有一个运行五个任务的集群和一个带有容量提供程序的自动扩缩组。容量提供程序已启用 Amazon ECS 托管扩展。

我们可以通过查看 CloudWatch 指标、自动扩缩组设置和 Amazon ECS 集群任务计数来确认是否一切正常。

**查看集群的 CloudWatch 指标**

1. 通过 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 打开 CloudWatch 控制台。

1. 在屏幕顶部的导航栏中，选择 区域。

1. 在导航窗格中，在**指标**下，选择**所有指标**。

1. 在**所有指标**页面的**浏览**选项卡下，选择 `AWS/ECS/ManagedScaling`。

1. 选择 **CapacityProviderName, ClusterName**。

1. 选中与 `ConsoleTutorial-cluster` **集群名称**对应的复选框。

1. 在**图形化指标**选项卡下，将**周期**更改为 **30 秒**，将**统计数据** 更改为**最大**。

   图中的值显示了容量提供程序的目标容量值。它应该从 `100` 开始，这是我们设定的目标容量百分比。您应该看到它纵向扩展到 `200`，这将触发目标跟踪调整策略的警报。然后，警报将触发自动扩缩组横向扩展。

按照以下步骤查看您的自动扩缩组详细信息，以确认执行了横向扩展操作。

**确认 自动扩缩组已扩展**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在屏幕顶部的导航栏中，选择 区域。

1. 在导航窗格的 **Auto Scaling** 下，选择 **自动扩缩组**。

1. 选择在本教程中创建的 `ConsoleTutorial-cluster` 自动扩缩组。查看**所需容量**下的值，然后在**实例管理**选项卡下查看实例，以确认您的组已横向扩展到两个实例。

按照以下步骤查看您的 Amazon ECS 集群，以确认 Amazon EC2 实例已注册到集群，并且您的任务已转变为 `RUNNING` 状态。

**要验证 自动扩缩组中的实例**

1. 在 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2) 打开控制台。

1. 在导航窗格中，选择**集群**。

1. 在 **Clusters**（集群）页面上，选择 `ConsoleTutorial-cluster` 集群。

1. 在**任务**选项卡上，确认您看到五个处于 `RUNNING` 状态的任务。

## 第 5 步：清理
<a name="console-tutorial-cleanup"></a>

完成本教程后，请清除与本教程关联的资源，以避免对您未使用的资源产生费用。不支持删除容量提供程序和任务定义，但这些资源不会产生任何开销。

**清除教程资源**

1. 在 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2) 打开控制台。

1. 在导航窗格中，选择**集群**。

1. 在**集群**页面上，选择 **ConsoleTutorial-cluster**。

1. 在 **ConsoleTutorial-cluster** 页面上，选择**任务**选项卡，然后选择**停止**、**全部停止**。

1. 在导航窗格中，选择**集群**。

1. 在**集群**页面上，选择 **ConsoleTutorial-cluster**。

1. 在页面的右上角，选择**删除集群**。

1. 在确认框中，输入 **delete **ConsoleTutorial-cluster****，然后选择**删除**。

1. 按照以下步骤删除 自动扩缩组。

   1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

   1. 在屏幕顶部的导航栏中，选择 区域。

   1. 在导航窗格的 **Auto Scaling** 下，选择 **自动扩缩组**。

   1. 选择 `ConsoleTutorial-cluster` 自动扩缩组，然后选择**操作**。

   1.  从 **Actions** 菜单中选择 **Delete **。在确认框中，输入 ** delete**，然后选择**删除**。

# Amazon ECS 的 Amazon EC2 容器实例
<a name="create-capacity"></a>

Amazon ECS 容器实例是运行 Amazon ECS 容器代理且注册到集群的 Amazon EC2 实例。当您使用容量提供程序、外部容量提供程序或自动扩缩组容量提供程序在 Amazon ECS 中运行任务时，您的任务将被放置在您的活动容器实例上。您负责容器实例管理和维护。

尽管您可以自行创建在 Amazon ECS 上运行您的容器化工作负载所需的符合基本规范的 Amazon EC2 实例 AMI，但 AWS 工程师仍会在 Amazon ECS 上预配置并测试经 Amazon ECS 优化的 AMI。这是可供您开始操作并快速获取 AWS 上运行的容器的最简单方式。

您使用控制台创建集群时，Amazon ECS 会使用与所选操作系统关联的最新 AMI 为您的实例创建启动模板。

使用 CloudFormation 创建集群时，SSM 参数是自动扩缩组实例的 Amazon EC2 启动模板的一部分。您可以将该模板配置为使用动态 Systems Manager 参数来确定要部署的经 Amazon ECS 优化的 AMI。此参数可确保每次部署堆栈时，都会检查是否存在需要应用到 EC2 实例的可用更新。有关如何使用 Systems Manager 参数的示例，请参阅《AWS CloudFormation 用户指南》中的 [Create an Amazon ECS cluster with the Amazon ECS-optimized Amazon Linux 2023 AMI](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-cluster.html#aws-resource-ecs-cluster--examples--Create_an_cluster_with_the_Amazon_Linux_2023_ECS-Optimized-AMI)**。
+ [检索经 Amazon ECS 优化的 Linux AMI 元数据](retrieve-ecs-optimized_AMI.md)
+ [检索经 Amazon ECS 优化的 Bottlerocket AMI 元数据](ecs-bottlerocket-retrieve-ami.md)
+ [检索经 Amazon ECS 优化的 Windows AMI 元数据](retrieve-ecs-optimized_windows_AMI.md)

您可以从与您的应用程序兼容的实例类型中进行选择。使用较大的实例，您可以同时启动更多任务。使用较小的实例，您可以以更精细的方式进行横向扩展以节省成本。您不需要为适合集群中所有应用程序而选择单个 Amazon EC2 实例类型。相反，您可以创建多个自动扩缩组，其中每个组都具有不同的实例类型。然后，您可以为这些组的每一组创建一个 Amazon EC2 容量提供程序。

使用以下指南来确定要使用的实例系列类型和实例类型：
+ 消除不满足应用程序特定要求的实例类型或实例系列。例如，如果您的应用程序需要 GPU，则可以排除没有 GPU 的任何实例类型。
+ 考虑包括网络吞吐量和存储在内的要求。
+ 考虑 CPU 和内存。通常，CPU 和内存必须足够大，从而足以容纳要运行的任务的至少一个副本。

## 竞价型实例
<a name="container-instance-spot"></a>

与按需型实例相比，Spot 容量可以显著节省成本。Spot 容量是定价明显低于按需容量或预留容量的过剩容量。Spot 容量适用于批处理和机器学习工作负载，以及开发和暂存环境。更笼统地说，它适用于可容许临时停机时间的任何工作负载。

请理解以下结果，因为 Spot 容量可能并非一直可用。
+ 在需求极高的时期，Spot 容量可能不可用。此操作可能会导致 Amazon EC2 竞价型实例的启动被延迟。在这些情况下，Amazon ECS 服务会重试启动任务，Amazon EC2 Auto Scaling 组也会重试启动实例，直到所需的容量变得可用为止。Amazon EC2 不会将 Spot 容量替换为按需容量。
+ 当总体容量需求增加时，系统可能会在只有两分钟警告的情况下终止竞价型实例和任务。发出警告后，如有必要，在实例完全终止之前，任务应当开始有序关闭。这有助于最大限度地降低出错的可能性。有关正常关闭的更多信息，请参阅[使用 ECS 进行正常关闭](https://aws.amazon.com/blogs/containers/graceful-shutdowns-with-ecs/)。

为了帮助最大限度地减少 Spot 容量短缺情况的出现，请考虑以下建议：
+ 使用多个区域和可用区：Spot 容量因区域和可用区域而异。通过在多个区域和可用区中运行工作负载，您可以提高 Spot 可用性。如果可能，请在运行任务和实例的区域中，为所有可用区指定子网。
+ 使用多个 Amazon EC2 实例类型 - 当您将混合实例策略与 Amazon EC2 Auto Scaling 一起使用时，会将多个实例类型启动到您的自动扩缩组中。这样可以确保 Spot 容量请求可以在需要时得到满足。为了最大限度地提高可靠性以及最大限度地降低复杂性，请在混合实例策略中使用具有大致相同数量的 CPU 和内存的实例类型。这些实例可以来自不同的代系，也可以是相同基本实例类型的变体。请注意，它们可能会包含您可能不需要的其他功能。此类列表的一个例子可能包括 m4.large、m5.large、m5a.large、m5d.large、m5n.large、m5dn.large 和 m5ad.large。有关更多信息，请参阅《Amazon EC2 Auto Scaling 用户指南》**中的[具有多个实例类型和购买选项的自动扩缩组](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-mixed-instances-groups.html)。
+ 使用经容量优化的 Spot 分配策略 - 借助 Amazon EC2 Spot，您可以在经容量和成本优化的分配策略之间进行选择。如果您在启动新实例时选择经容量优化的策略，Amazon EC2 Spot 会选择在所选可用区中可用性最高的实例类型。此项有助于减少实例在启动后不久便终止的可能性。

有关如何在容器实例上配置竞价型终止通知的信息，请参阅：
+ [配置 Amazon ECS Linux 容器实例以接收竞价型实例通知](spot-instance-draining-linux-container.md)
+ [配置 Amazon ECS Windows 容器实例以接收竞价型实例通知](windows-spot-instance-draining-container.md)

# 经 Amazon ECS 优化的 Linux AMI
<a name="ecs-optimized_AMI"></a>

**重要**  
Amazon ECS 优化版 Amazon Linux 2 AMI 的生命周期将于 2026 年 6 月 30 日终止，这与上游 Amazon Linux 2 操作系统的生命周期终止日期相同（有关更多信息，请参阅 [Amazon Linux 2 常见问题](https://aws.amazon.com/amazon-linux-2/faqs/)）。我们鼓励客户升级自己的应用程序以便使用 Amazon Linux 2023，其中包括直到 2028 年的长期支持。有关从 Amazon Linux 2 迁移到 Amazon Linux 2023 的信息，请参阅 [Migrating from the Amazon Linux 2 Amazon ECS-optimized AMI to the Amazon Linux 2023 Amazon ECS-optimized AMI](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/al2-to-al2023-ami-transition.html)。

默认情况下，所有 Amazon ECS 优化 AMI 的弃用日期均设置为 AMI 创建日期后的两年。您可以使用 Amazon EC2 `DescribeImages` API 来检查 AMI 的弃用状态和日期。有关更多信息，请参阅*《Amazon Elastic Compute Cloud API Reference》*中的 [DescribeImages](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeImages.html)。

Amazon ECS 提供已根据这些要求和建议进行了预配置的经 Amazon ECS 优化的 AMI，以运行您的容器工作负载。建议您在 Amazon EC2 实例中使用 Amazon ECS 优化版 Amazon Linux 2023 AMI。从最新的经 Amazon ECS 优化的 AMI 启动容器实例可确保您收到最新的安全更新和容器代理版本。有关如何启动实例的信息，请参阅 [启动 Amazon ECS Linux 容器实例](launch_container_instance.md)。

您使用控制台创建集群时，Amazon ECS 会使用与所选操作系统关联的最新 AMI 为您的实例创建启动模板。

使用 CloudFormation 创建集群时，SSM 参数是自动扩缩组实例的 Amazon EC2 启动模板的一部分。您可以将该模板配置为使用动态 Systems Manager 参数来确定要部署的经 Amazon ECS 优化的 AMI。此参数可确保每次部署堆栈时，都会检查是否存在需要应用到 EC2 实例的可用更新。有关如何使用 Systems Manager 参数的示例，请参阅《AWS CloudFormation 用户指南》中的 [Create an Amazon ECS cluster with the Amazon ECS-optimized Amazon Linux 2023 AMI](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-cluster.html#aws-resource-ecs-cluster--examples--Create_an_cluster_with_the_Amazon_Linux_2023_ECS-Optimized-AMI)**。

如果需要自定义经 Amazon ECS 优化的 AMI，请参阅 GitHub 上的 [Amazon ECS Optimized AMI Build Recipes](https://github.com/aws/amazon-ecs-ami)。

以下 Amazon ECS 优化型 AMI 的变体可用于具有 Amazon Linux 2023 操作系统的 Amazon EC2 实例。


| 操作系统 | AMI | 说明 | 存储配置 | 
| --- | --- | --- | --- | 
| Amazon Linux 2023 |  经 Amazon ECS 优化的 Amazon Linux 2023 AMI |  Amazon Linux 2023 是 AWS 的下一代 Amazon Linux。在大多数情况下，推荐用于为您的 Amazon ECS 工作负载启动 Amazon EC2 实例。有关更多信息，请参阅《Amazon Linux 2023 用户指南》**中的[什么是 Amazon Linux 2023](https://docs.aws.amazon.com/linux/al2023/ug/what-is-amazon-linux.html)。  | 预设情况下，经 Amazon ECS 优化的 Amazon Linux 2023 AMI 附带一个 30GiB 的根卷。您可以在启动时修改 30 GiB 的根卷大小，以增加您的容器实例上的可用存储。此存储用于操作系统和 Docker 映像与元数据。经 Amazon ECS 优化的 Amazon Linux 2023 AMI 的默认文件系统是 `xfs`，Docker 使用 `overlay2` 存储驱动程序。有关更多信息，请参阅 Docker 文档中的[使用 OverlayFS 存储驱动程序](https://docs.docker.com/engine/storage/drivers/overlayfs-driver/)。 | 
| Amazon Linux 2023（arm64） |  经 Amazon ECS 优化的 Amazon Linux 2023（arm64）AMI |  此 AMI 基于 Amazon Linux 2023，建议将其用于为 Amazon ECS 工作负载启动采用基于 ARM 的 AWS Graviton/Graviton 2/Graviton 3/Graviton 4 处理器的 Amazon EC2 实例。有关更多信息，请参阅《Amazon EC2 实例类型指南》中的 [Specifications for the Amazon EC2 general purpose instances](https://docs.aws.amazon.com/ec2/latest/instancetypes/gp.html)**。  | 预设情况下，经 Amazon ECS 优化的 Amazon Linux 2023 AMI 附带一个 30GiB 的根卷。您可以在启动时修改 30 GiB 的根卷大小，以增加您的容器实例上的可用存储。此存储用于操作系统和 Docker 映像与元数据。经 Amazon ECS 优化的 Amazon Linux 2023 AMI 的默认文件系统是 `xfs`，Docker 使用 `overlay2` 存储驱动程序。有关更多信息，请参阅 Docker 文档中的[使用 OverlayFS 存储驱动程序](https://docs.docker.com/engine/storage/drivers/overlayfs-driver/)。 | 
| Amazon Linux 2023（Neuron） |  经 Amazon ECS 优化的 Amazon Linux 2023 AMI  |  基于 Amazon Linux 2023，此 AMI 适用于 Amazon EC2 Inf1、Trn1 或 Inf2 实例。带有预先配置 AWS Inferentia 和 AWS Trainium 驱动程序以及 Docker 的 AWS Neuron 运行时系统，它使得在 Amazon ECS 上运行机器学习推理工作负载变得更加容易。有关更多信息，请参阅 [适用于 AWS 神经元机器学习工作负载的 Amazon ECS 任务定义](ecs-inference.md)。 经 Amazon ECS 优化的 Amazon Linux 2023（Neuron）AMI 不随附 AWS CLI 预装。  | 预设情况下，经 Amazon ECS 优化的 Amazon Linux 2023 AMI 附带一个 30GiB 的根卷。您可以在启动时修改 30 GiB 的根卷大小，以增加您的容器实例上的可用存储。此存储用于操作系统和 Docker 映像与元数据。经 Amazon ECS 优化的 Amazon Linux 2023 AMI 的默认文件系统是 `xfs`，Docker 使用 `overlay2` 存储驱动程序。有关更多信息，请参阅 Docker 文档中的[使用 OverlayFS 存储驱动程序](https://docs.docker.com/engine/storage/drivers/overlayfs-driver/)。 | 
| Amazon Linux 2023 GPU | 经 Amazon ECS 优化的 Amazon Linux 2023 GPU AMI |  此 AMI 基于 Amazon Linux 2023，建议在为 Amazon ECS 工作负载启动基于 Amazon EC2 GPU 的实例时使用。预配置了 NVIDIA 内核驱动程序和 Docker GPU 运行时，可以使正在运行的工作负载充分利用 Amazon ECS 上的 GPU。有关更多信息，请参阅 [适用于 GPU 工作负载的 Amazon ECS 任务定义](ecs-gpu.md)。  | 预设情况下，经 Amazon ECS 优化的 Amazon Linux 2023 AMI 附带一个 30GiB 的根卷。您可以在启动时修改 30 GiB 的根卷大小，以增加您的容器实例上的可用存储。此存储用于操作系统和 Docker 映像与元数据。经 Amazon ECS 优化的 Amazon Linux 2023 AMI 的默认文件系统是 `xfs`，Docker 使用 `overlay2` 存储驱动程序。有关更多信息，请参阅 Docker 文档中的[使用 OverlayFS 存储驱动程序](https://docs.docker.com/engine/storage/drivers/overlayfs-driver/)。 | 

以下 Amazon ECS 优化型 AMI 的变体可用于使用 Amazon Linux 2 操作系统的 Amazon EC2 实例。


| 操作系统 | AMI | 说明 | 存储配置 | 
| --- | --- | --- | --- | 
|  **Amazon Linux 2**   |  经 Amazon ECS 优化的 Amazon Linux 2 内核 5.10 AMI | 基于 Amazon Linux 2，在启动 Amazon EC2 实例时使用此 AMI，您需要为 Amazon ECS 工作负载使用 Linux 内核 5.10 而不是内核 4.14。经 Amazon ECS 优化的 Amazon Linux 2 内核 5.10 AMI 未预装 AWS CLI。 | 预设情况下，基于Amazon Linux 2 的经 Amazon ECS 优化的 AMI（经 Amazon ECS 优化的 Amazon Linux 2 AMI、经 Amazon ECS 优化的 Amazon Linux 2（arm64）AMI 和Amazon ECS GPU 优化型 AMI）随附单个 30 GiB 根卷发货。您可以在启动时修改 30 GiB 的根卷大小，以增加您的容器实例上的可用存储。此存储用于操作系统和 Docker 映像与元数据。经 Amazon ECS 优化的 Amazon Linux 2 AMI 的原定设置文件系统是 `xfs`，Docker 使用 `overlay2` 存储驱动程序。有关更多信息，请参阅 Docker 文档中的[使用 OverlayFS 存储驱动程序](https://docs.docker.com/engine/storage/drivers/overlayfs-driver/)。 | 
|  **Amazon Linux 2**  |  经 Amazon ECS 优化的 Amazon Linux 2 AMI | 此项适用于您的 Amazon ECS 工作负载。经 Amazon ECS 优化的 Amazon Linux 2 AMI 不随附 AWS CLI 预装。 | 预设情况下，基于Amazon Linux 2 的经 Amazon ECS 优化的 AMI（经 Amazon ECS 优化的 Amazon Linux 2 AMI、经 Amazon ECS 优化的 Amazon Linux 2（arm64）AMI 和Amazon ECS GPU 优化型 AMI）随附单个 30 GiB 根卷发货。您可以在启动时修改 30 GiB 的根卷大小，以增加您的容器实例上的可用存储。此存储用于操作系统和 Docker 映像与元数据。经 Amazon ECS 优化的 Amazon Linux 2 AMI 的原定设置文件系统是 `xfs`，Docker 使用 `overlay2` 存储驱动程序。有关更多信息，请参阅 Docker 文档中的[使用 OverlayFS 存储驱动程序](https://docs.docker.com/engine/storage/drivers/overlayfs-driver/)。 | 
|  **Amazon Linux 2（arm64）**  |  经 Amazon ECS 优化的 Amazon Linux 2 内核 5.10（arm64）AMI |  此 AMI 基于 Amazon Linux 2，适用于为 Amazon ECS 工作负载启动采用基于 Arm 的 AWS Graviton/Graviton 2/Graviton 3/Graviton 4 处理器，并且您希望使用 Linux 内核 5.10 而不是 Linux 内核 4.14 的 Amazon EC2 实例。有关更多信息，请参阅《Amazon EC2 实例类型指南》中的 [Specifications for Amazon EC2 general purpose instances](https://docs.aws.amazon.com/ec2/latest/instancetypes/gp.html)**。 经 Amazon ECS 优化的 Amazon Linux 2（arm64）AMI 不随附 AWS CLI 预装。  | 预设情况下，基于Amazon Linux 2 的经 Amazon ECS 优化的 AMI（经 Amazon ECS 优化的 Amazon Linux 2 AMI、经 Amazon ECS 优化的 Amazon Linux 2（arm64）AMI 和Amazon ECS GPU 优化型 AMI）随附单个 30 GiB 根卷发货。您可以在启动时修改 30 GiB 的根卷大小，以增加您的容器实例上的可用存储。此存储用于操作系统和 Docker 映像与元数据。经 Amazon ECS 优化的 Amazon Linux 2 AMI 的原定设置文件系统是 `xfs`，Docker 使用 `overlay2` 存储驱动程序。有关更多信息，请参阅 Docker 文档中的[使用 OverlayFS 存储驱动程序](https://docs.docker.com/engine/storage/drivers/overlayfs-driver/)。 | 
| Amazon Linux 2（arm64） | 经 Amazon ECS 优化的 Amazon Linux 2（arm64）AMI |  此 AMI 基于 Amazon Linux 2，适用于为 Amazon ECS 工作负载启动采用基于 Arm 的 AWS Graviton/Graviton 2/Graviton 3/Graviton 4 处理器的 Amazon EC2 实例。 经 Amazon ECS 优化的 Amazon Linux 2（arm64）AMI 不随附 AWS CLI 预装。  | 预设情况下，基于Amazon Linux 2 的经 Amazon ECS 优化的 AMI（经 Amazon ECS 优化的 Amazon Linux 2 AMI、经 Amazon ECS 优化的 Amazon Linux 2（arm64）AMI 和Amazon ECS GPU 优化型 AMI）随附单个 30 GiB 根卷发货。您可以在启动时修改 30 GiB 的根卷大小，以增加您的容器实例上的可用存储。此存储用于操作系统和 Docker 映像与元数据。经 Amazon ECS 优化的 Amazon Linux 2 AMI 的原定设置文件系统是 `xfs`，Docker 使用 `overlay2` 存储驱动程序。有关更多信息，请参阅 Docker 文档中的[使用 OverlayFS 存储驱动程序](https://docs.docker.com/engine/storage/drivers/overlayfs-driver/)。 | 
|  **Amazon Linux 2（GPU）**  | Amazon ECS GPU 优化型内核 5.10 AMI | 基于 Amazon Linux 2，建议在为 Amazon ECS 工作负载启动基于 Amazon EC2 GPU 的实例（含 Linux 内核 5.10）时使用此 AMI。预配置了 NVIDIA 内核驱动程序和 Docker GPU 运行时，可以使正在运行的工作负载充分利用 Amazon ECS 上的 GPU。有关更多信息，请参阅 [适用于 GPU 工作负载的 Amazon ECS 任务定义](ecs-gpu.md)。 | 预设情况下，基于Amazon Linux 2 的经 Amazon ECS 优化的 AMI（经 Amazon ECS 优化的 Amazon Linux 2 AMI、经 Amazon ECS 优化的 Amazon Linux 2（arm64）AMI 和Amazon ECS GPU 优化型 AMI）随附单个 30 GiB 根卷发货。您可以在启动时修改 30 GiB 的根卷大小，以增加您的容器实例上的可用存储。此存储用于操作系统和 Docker 映像与元数据。经 Amazon ECS 优化的 Amazon Linux 2 AMI 的原定设置文件系统是 `xfs`，Docker 使用 `overlay2` 存储驱动程序。有关更多信息，请参阅 Docker 文档中的[使用 OverlayFS 存储驱动程序](https://docs.docker.com/engine/storage/drivers/overlayfs-driver/)。 | 
| Amazon Linux 2（GPU） | Amazon ECS GPU 优化型 AMI | 基于 Amazon Linux 2，建议在为 Amazon ECS 工作负载启动基于 Amazon EC2 GPU 的实例（含 Linux 内核 4.14）时使用此 AMI。预配置了 NVIDIA 内核驱动程序和 Docker GPU 运行时，可以使正在运行的工作负载充分利用 Amazon ECS 上的 GPU。有关更多信息，请参阅 [适用于 GPU 工作负载的 Amazon ECS 任务定义](ecs-gpu.md)。 | 预设情况下，基于Amazon Linux 2 的经 Amazon ECS 优化的 AMI（经 Amazon ECS 优化的 Amazon Linux 2 AMI、经 Amazon ECS 优化的 Amazon Linux 2（arm64）AMI 和Amazon ECS GPU 优化型 AMI）随附单个 30 GiB 根卷发货。您可以在启动时修改 30 GiB 的根卷大小，以增加您的容器实例上的可用存储。此存储用于操作系统和 Docker 映像与元数据。经 Amazon ECS 优化的 Amazon Linux 2 AMI 的原定设置文件系统是 `xfs`，Docker 使用 `overlay2` 存储驱动程序。有关更多信息，请参阅 Docker 文档中的[使用 OverlayFS 存储驱动程序](https://docs.docker.com/engine/storage/drivers/overlayfs-driver/)。 | 
| Amazon Linux 2（Neuron）  | 经 Amazon ECS 优化的 Amazon Linux 2（Neuron）内核 5.10 AMI  | 基于 Amazon Linux 2，此 AMI 适用于 Amazon EC2 Inf1、Trn1 或 Inf2 实例。其带有预先配置 AWS Inferentia（含 Linux 内核 5.10）和 AWS Trainium 驱动程序以及 Docker 的 AWS Neuron 运行时，使得在 Amazon ECS 上运行机器学习推理工作负载变得更加容易。有关更多信息，请参阅 [适用于 AWS 神经元机器学习工作负载的 Amazon ECS 任务定义](ecs-inference.md)。经 Amazon ECS 优化的 Amazon Linux 2（Neuron）AMI 不随附 AWS CLI 预装。 | 预设情况下，基于Amazon Linux 2 的经 Amazon ECS 优化的 AMI（经 Amazon ECS 优化的 Amazon Linux 2 AMI、经 Amazon ECS 优化的 Amazon Linux 2（arm64）AMI 和Amazon ECS GPU 优化型 AMI）随附单个 30 GiB 根卷发货。您可以在启动时修改 30 GiB 的根卷大小，以增加您的容器实例上的可用存储。此存储用于操作系统和 Docker 映像与元数据。经 Amazon ECS 优化的 Amazon Linux 2 AMI 的原定设置文件系统是 `xfs`，Docker 使用 `overlay2` 存储驱动程序。有关更多信息，请参阅 Docker 文档中的[使用 OverlayFS 存储驱动程序](https://docs.docker.com/engine/storage/drivers/overlayfs-driver/)。 | 
| Amazon Linux 2（Neuron）  | 经 Amazon ECS 优化的 Amazon Linux 2（Neuron）AMI | 基于 Amazon Linux 2，此 AMI 适用于 Amazon EC2 Inf1、Trn1 或 Inf2 实例。带有预先配置 AWS Inferentia 和 AWS Trainium 驱动程序以及 Docker 的 AWS Neuron 运行时系统，它使得在 Amazon ECS 上运行机器学习推理工作负载变得更加容易。有关更多信息，请参阅 [适用于 AWS 神经元机器学习工作负载的 Amazon ECS 任务定义](ecs-inference.md)。经 Amazon ECS 优化的 Amazon Linux 2（Neuron）AMI 不随附 AWS CLI 预装。 | 预设情况下，基于Amazon Linux 2 的经 Amazon ECS 优化的 AMI（经 Amazon ECS 优化的 Amazon Linux 2 AMI、经 Amazon ECS 优化的 Amazon Linux 2（arm64）AMI 和Amazon ECS GPU 优化型 AMI）随附单个 30 GiB 根卷发货。您可以在启动时修改 30 GiB 的根卷大小，以增加您的容器实例上的可用存储。此存储用于操作系统和 Docker 映像与元数据。经 Amazon ECS 优化的 Amazon Linux 2 AMI 的原定设置文件系统是 `xfs`，Docker 使用 `overlay2` 存储驱动程序。有关更多信息，请参阅 Docker 文档中的[使用 OverlayFS 存储驱动程序](https://docs.docker.com/engine/storage/drivers/overlayfs-driver/)。 | 

Amazon ECS 为 GitHub 上的 Amazon ECS 优化 AMI 的 Linux 变体提供了更改日志。有关更多信息，请参阅[更改日志](https://github.com/aws/amazon-ecs-ami/blob/main/CHANGELOG.md)。

经 Amazon ECS 优化的 AMI 的 Linux 变体使用 Amazon Linux 2 AMI 或 Amazon Linux 2023 AMI 作为其基础。您可以通过查询 Systems Manager Parameter Store API 来检索每个变体的 AMI 名称。有关更多信息，请参阅 [检索经 Amazon ECS 优化的 Linux AMI 元数据](retrieve-ecs-optimized_AMI.md)。还提供了 Amazon Linux 2 AMI 版本注释。有关更多信息，请参阅 [Amazon Linux 2 版本注释](https://docs.aws.amazon.com/AL2/latest/relnotes/relnotes-al2.html)。还提供了 Amazon Linux 2023 发布说明。有关更多信息，请参阅 [Amazon Linux 2023 发布说明](https://docs.aws.amazon.com/linux/al2023/release-notes/relnotes.html)。

以下页面提供了有关更改的更多信息：
+ GitHub 上的[来源 AMI 发布](https://github.com/aws/amazon-ecs-ami/releases)说明
+ Docker 文档中的 [Docker 引擎版本注释](https://docs.docker.com/engine/release-notes/)
+ NVIDIA 文档中的 [NVIDIA 驱动程序文档](https://docs.nvidia.com/datacenter/tesla/index.html)
+ GitHub 上的 [Amazon ECS 代理变更日志](https://github.com/aws/amazon-ecs-agent/blob/master/CHANGELOG.md)

  `ecs-init` 应用程序的源代码以及用于打包代理的脚本和配置现在已成为代理存储库的一部分。有关 `ecs-init` 的旧版本和包装，请参阅 GitHub 上的 [Amazon ecs-init 变更日志](https://github.com/aws/amazon-ecs-init/blob/master/CHANGELOG.md)

## 将安全更新应用于经 Amazon ECS 优化的 AMI
<a name="ecs-optimized-AMI-security-changes"></a>

基于 Amazon Linux 的、经 Amazon ECS 优化的 AMI 包含的自定义版本的 cloud-init。Cloud-init 是一个程序包，用于在云计算环境中引导 Linux 映像，并在启动实例时执行所需操作。默认情况下，在 2024 年 6 月 12 日之前发布的所有经 Amazon ECS 优化的 Amazon Linux AMI 在实例启动时都已应用了“关键”和“重要”安全更新。

从 2024 年 6 月 12 日起发布的经 Amazon ECS 优化的 Amazon Linux 2 AMI 开始，默认行为将不再包括在启动时更新程序包。相反，建议您在发布版本后更新为新的经 Amazon ECS 优化的 AMI。经 Amazon ECS 优化的 AMI 在有可用安全更新或基本 AMI 更改时发布。这将确保您收到最新的程序包版本和安全更新，并且程序包版本在实例启动后不可变。有关检索最新经 Amazon ECS 优化 AMI 的更多信息，请参阅 [检索经 Amazon ECS 优化的 Linux AMI 元数据](retrieve-ecs-optimized_AMI.md)。

建议将您的环境自动化，以在新 AMI 可用时进行更新。有关可用选项的信息，请参阅 [Amazon ECS enables easier EC2 capacity management, with managed instance draining](https://aws.amazon.com/blogs/containers/amazon-ecs-enables-easier-ec2-capacity-management-with-managed-instance-draining/)。

要继续对某个 AMI 版本手动应用“关键”和“重要”安全更新，则可以在 Amazon EC2 实例上运行以下命令。

```
yum update --security
```

**警告**  
 更新 docker 或 containerd 软件包会导致主机上所有正在运行的容器停止，这意味着所有正在运行的 Amazon ECS 任务都将停止。请相应地制定计划，以最大程度地减少服务中断。

如果您想在启动时重新启用安全更新，则可以在启动 Amazon EC2 实例时将以下行添加到 cloud-init 用户数据的 `#cloud-config` 部分。有关更多信息，请参阅《Amazon Linux 用户指南》**中的 [Using cloud-init on Amazon Linux 2](https://docs.aws.amazon.com/linux/al2/ug/amazon-linux-cloud-init.html)。

```
#cloud-config
repo_upgrade: security
```

## 经 Amazon ECS 优化的 AL2023 GPU AMI 中的版本锁定的软件包
<a name="ecs-optimized-ami-version-locked-packages"></a>

在经 Amazon ECS 优化的 AL2023 GPU AMI 中，某些软件包对于 GPU 功能的正确、高性能行为至关重要。这些方法包括：
+ NVIDIA 驱动程序（`nvidia*`）
+ 内核模块（`kmod*`）
+ NVIDIA 库（`libnvidia*`）
+ 内核软件包（`kernel*`）

**注意**  
这并非是详尽的列表。完整的锁定软件包列表可通过 `dnf versionlock list` 获得

这些软件包锁定了版本来确保稳定性，并防止可能中断 GPU 工作负载的意外更改。因此，这些软件包通常应在一个托管进程的范围内进行修改，该进程可以妥善处理潜在问题并维护 GPU 功能。

为了防止意外修改，这些软件包使用了 `dnf versionlock` 插件。

如果希望修改锁定的软件包，您可以：

```
# unlock a single package
sudo dnf versionlock delete $PACKAGE_NAME

# unlock all packages
sudo dnf versionlock clear
```

**重要**  
当需要更新这些软件包时，客户应该考虑使用包含所需更新的最新 AMI 版本。如果需要更新现有实例，则应采用涉及解锁、更新和重新锁定软件包的谨慎方法，始终确保在整个过程中保持 GPU 功能正常运行。

# 检索经 Amazon ECS 优化的 Linux AMI 元数据
<a name="retrieve-ecs-optimized_AMI"></a>

您可以通过编程方式检索经 Amazon ECS 优化的 AMI 元数据。元数据包括 AMI 名称、Amazon ECS 容器代理版本和 Amazon ECS 运行时版本（其中包括 Docker 版本）。

您使用控制台创建集群时，Amazon ECS 会使用与所选操作系统关联的最新 AMI 为您的实例创建启动模板。

使用 CloudFormation 创建集群时，SSM 参数是自动扩缩组实例的 Amazon EC2 启动模板的一部分。您可以将该模板配置为使用动态 Systems Manager 参数来确定要部署的经 Amazon ECS 优化的 AMI。此参数可确保每次部署堆栈时，都会检查是否存在需要应用到 EC2 实例的可用更新。有关如何使用 Systems Manager 参数的示例，请参阅《AWS CloudFormation 用户指南》中的 [Create an Amazon ECS cluster with the Amazon ECS-optimized Amazon Linux 2023 AMI](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-cluster.html#aws-resource-ecs-cluster--examples--Create_an_cluster_with_the_Amazon_Linux_2023_ECS-Optimized-AMI)**。

经 Amazon ECS 优化的 AMI 的 AMI ID、映像名称、操作系统、容器代理版本、源映像名称和运行时版本可通过查询 Systems Manager Parameter Store API 以编程方式检索。有关 Systems Manager Parameter Store API 的更多信息，请参阅 [GetParameters](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameters.html) 和 [GetParametersByPath](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParametersByPath.html)。

**注意**  
您的管理用户必须具有以下 IAM 权限才能检索经 Amazon ECS 优化的 AMI 元数据。这些权限已添加到 `AmazonECS_FullAccess` IAM 策略。  
ssm:GetParameters
ssm:GetParameter
ssm:GetParametersByPath

## Systems Manager Parameter Store 参数格式
<a name="ecs-optimized-ami-parameter-format"></a>

以下是经 Amazon ECS 优化的 AMI 变体参数名称的格式。

**Linux 经 Amazon ECS 优化的 AMI**
+ Amazon Linux 2023 AMI 元数据：

  ```
  /aws/service/ecs/optimized-ami/amazon-linux-2023/<version>
  ```
+ Amazon Linux 2023（arm64）AMI 元数据：

  ```
  /aws/service/ecs/optimized-ami/amazon-linux-2023/arm64/<version>
  ```
+ Amazon Linux 2023（Neuron）AMI 元数据：

  ```
  /aws/service/ecs/optimized-ami/amazon-linux-2023/neuron/<version>
  ```
+ Amazon Linux 2023（GPU）AMI 元数据：

  ```
  /aws/service/ecs/optimized-ami/amazon-linux-2023/gpu/<version>
  ```

  Amazon Linux 2 AMI 元数据：

  ```
  /aws/service/ecs/optimized-ami/amazon-linux-2/<version>
  ```
+ Amazon Linux 2 内核 5.10 AMI 元数据：

  ```
  /aws/service/ecs/optimized-ami/amazon-linux-2/kernel-5.10/<version>
  ```
+ Amazon Linux 2（arm64）AMI 元数据：

  ```
  /aws/service/ecs/optimized-ami/amazon-linux-2/arm64/<version>
  ```
+ Amazon Linux 2 内核 5.10（arm64）AMI 元数据：

  ```
  /aws/service/ecs/optimized-ami/amazon-linux-2/kernel-5.10/arm64/<version>
  ```
+ Amazon ECS GPU 优化型内核 5.10 AMI 元数据：

  ```
  /aws/service/ecs/optimized-ami/amazon-linux-2/kernel-5.10/gpu/<version>
  ```
+ Amazon Linux 2（GPU）AMI 元数据：

  ```
  /aws/service/ecs/optimized-ami/amazon-linux-2/gpu/<version>
  ```
+ 经 Amazon ECS 优化的 Amazon Linux 2（Neuron）内核 5.10 AMI 元数据：

  ```
  /aws/service/ecs/optimized-ami/amazon-linux-2/kernel-5.10/inf/<version>
  ```
+ Amazon Linux 2（Neuron）AMI 元数据：

  ```
  /aws/service/ecs/optimized-ami/amazon-linux-2/inf/<version>
  ```

以下参数名称格式通过使用子参数 `image_id` 检索最新推荐的经 Amazon ECS 优化的 Amazon Linux 2 AMI 的映像 ID。

```
/aws/service/ecs/optimized-ami/amazon-linux-2/recommended/image_id
```

以下参数名称格式通过指定 AMI 名称来检索特定的经 Amazon ECS 优化的 AMI 版本的元数据。
+ 经 Amazon ECS 优化的 Amazon Linux 2 AMI 元数据：

  ```
  /aws/service/ecs/optimized-ami/amazon-linux-2/amzn2-ami-ecs-hvm-2.0.20181112-x86_64-ebs
  ```

**注意**  
经 Amazon ECS 优化的 Amazon Linux 2 AMI 的所有版本都可用于检索。只能检索经 Amazon ECS 优化的 AMI 版本 `amzn-ami-2017.09.l-amazon-ecs-optimized`（Linux）及更高版本。

## 示例
<a name="ecs-optimized-ami-parameter-examples"></a>

以下示例说明了可用于检索经 Amazon ECS 优化的 AMI 变体的元数据的方法。

### 检索最新推荐的经 Amazon ECS 优化的 AMI 的元数据
<a name="ecs-optimized-ami-parameter-examples-1"></a>

您可以使用 AWS CLI 和以下 AWS CLI 命令检索最新推荐的经 Amazon ECS 优化的 AMI。

**Linux 经 Amazon ECS 优化的 AMI**
+ **对于经 Amazon ECS 优化的 Amazon Linux 2023 AMI：**

  ```
  aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux-2023/recommended --region us-east-1
  ```
+ **对于经 Amazon ECS 优化的 Amazon Linux 2023（arm64）AMI：**

  ```
  aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux-2023/arm64/recommended --region us-east-1
  ```
+ **对于经 Amazon ECS 优化的 Amazon Linux 2023（Neuron）AMI：**

  ```
  aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux-2023/neuron/recommended --region us-east-1
  ```
+ **对于经 Amazon ECS 优化的 Amazon Linux 2023 GPU AMI：**

  ```
  aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux-2023/gpu/recommended --region us-east-1
  ```
+ **对于经 Amazon ECS 优化的 Amazon Linux 2 内核 5.10 AMI：**

  ```
  aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux-2/kernel-5.10/recommended --region us-east-1
  ```
+ **对于经 Amazon ECS 优化的 Amazon Linux 2 AMI：**

  ```
  aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux-2/recommended --region us-east-1
  ```
+ **对于经 Amazon ECS 优化的 Amazon Linux 2 内核 5.10（arm64）AMI：**

  ```
  aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux-2/kernel-5.10/arm64/recommended --region us-east-1
  ```
+ **对于经 Amazon ECS 优化的 Amazon Linux 2（arm64）AMI：**

  ```
  aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux-2/arm64/recommended --region us-east-1
  ```
+ **对于 Amazon ECS GPU 优化型内核 5.10 AMI：**

  ```
  aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux-2/kernel-5.10/gpu/recommended --region us-east-1
  ```
+ **对于 Amazon ECS GPU 优化型 AMI：**

  ```
  aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux-2/gpu/recommended --region us-east-1
  ```
+ **对于经 Amazon ECS 优化的 Amazon Linux 2（Neuron）内核 5.10 AMI：**

  ```
  aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux-2/kernel-5.10/inf/recommended --region us-east-1
  ```
+ **对于经 Amazon ECS 优化的 Amazon Linux 2（Neuron）AMI：**

  ```
  aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux-2/inf/recommended --region us-east-1
  ```

### 检索最新推荐的经 Amazon ECS 优化的 Amazon Linux 2023 AMI 的映像 ID
<a name="ecs-optimized-ami-parameter-examples-6"></a>

您可以通过使用子参数 `image_id` 检索最新推荐的经 Amazon ECS 优化的 Amazon Linux 2023 AMI ID 的映像 ID。

```
aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux-2023/recommended/image_id --region us-east-1
```

要仅检索 `image_id` 值，您可以查询特定参数值；例如：

```
aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux-2023/recommended/image_id --region us-east-1 --query "Parameters[0].Value"
```

### 检索特定经 Amazon ECS 优化的 Amazon Linux 2 AMI 版本的元数据
<a name="ecs-optimized-ami-parameter-examples-2"></a>

使用 AWS CLI 和以下 AWS CLI 命令检索特定 经 Amazon ECS 优化的 Amazon Linux AMI版本的元数据。将要检索的 经 Amazon ECS 优化的 Amazon Linux AMI 的名称替换为 AMI 名称 

```
aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux-2/amzn2-ami-ecs-hvm-2.0.20200928-x86_64-ebs --region us-east-1
```

### 使用 Systems Manager GetParametersByPath API 检索经 Amazon ECS 优化的 Amazon Linux 2 内核 5.10 AMI 元数据
<a name="ecs-optimized-ami-parameter-examples-3"></a>

通过 AWS CLI 和下列命令使用 Systems Manager GetParametersByPath API 检索 经 Amazon ECS 优化的 Amazon Linux 2 AMI 元数据。

```
aws ssm get-parameters-by-path --path /aws/service/ecs/optimized-ami/amazon-linux-2/kernel-5.10/ --region us-east-1
```

### 检索最新推荐的经 Amazon ECS 优化的 Amazon Linux 2 内核 5.10 AMI 的映像 ID
<a name="ecs-optimized-ami-parameter-examples-4"></a>

您可以通过使用子参数 `image_id` 检索最新推荐的经 Amazon ECS 优化的 Amazon Linux 2 内核 5.10 AMI ID 的映像 ID。

```
aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux-2/kernel-5.10/recommended/image_id --region us-east-1
```

要仅检索 `image_id` 值，您可以查询特定参数值；例如：

```
aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux-2/recommended/image_id --region us-east-1 --query "Parameters[0].Value"
```

### 在 CloudFormation 模板中使用最新推荐的经 Amazon ECS 优化的 AMI
<a name="ecs-optimized-ami-parameter-examples-5"></a>

您可以参考 Systems Manager 参数存储名称引用 CloudFormation 模板中最新推荐的经 Amazon ECS 优化的 AMI。

**Linux 示例**

```
Parameters:kernel-5.10
  LatestECSOptimizedAMI:
    Description: AMI ID
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: /aws/service/ecs/optimized-ami/amazon-linux-2/kernel-5.10/recommended/image_id
```

# 从 Amazon Linux 2 迁移到 Amazon Linux 2023 Amazon ECS 优化版 AMI
<a name="al2-to-al2023-ami-transition"></a>

继 [Amazon Linux](https://aws.amazon.com/amazon-linux-2/faqs) 之后，Amazon ECS 将于 2026 年 6 月 30 日起终止对 Amazon Linux 2 Amazon ECS 优化版 AMI 的标准支持。在此日期之后，Amazon ECS 代理版本将被固定，新的 Amazon Linux 2 Amazon ECS 优化版 AMI 只有在源 Amazon Linux 2 AMI 更新后才会发布。生命周期终止（EOL）于 2026 年 6 月 30 日生效，之后即使源 AMI 已更新，也不会再发布 Amazon ECS 优化版 Amazon Linux 2 AMI。

Amazon Linux 2023 提供了默认安全方法，包括预配置的安全策略、允许模式下的 SELinux、默认启用仅 IMDSv2 模式、优化的启动时间以及改进的程序包管理，增强了安全性和性能。

Amazon Linux 2 和 Amazon Linux 2023 Amazon ECS 优化版 AMI 之间高度兼容，大多数客户在使用这两个操作系统时所感受到的工作负载变化将微乎其微。

有关更多信息，请参阅《Amazon Linux 2023 用户指南》**中的[比较 Amazon Linux 2 与 *Amazon Linux 2023*](https://docs.aws.amazon.com/linux/al2023/ug/compare-with-al2.html) 以及 [AL2023 常见问题](https://aws.amazon.com/linux/amazon-linux-2023/faqs)。

## 兼容性注意事项
<a name="al2-to-al2023-ami-transition-compatibility"></a>

### 程序包管理和操作系统更新
<a name="al2-to-al2023-ami-transition-compatibility-package-management"></a>

与之前版本的 Amazon Linux 不同，Amazon ECS 优化版 Amazon Linux 2023 AMI 被锁定到特定版本的 Amazon Linux 存储库。这可以防止用户无意中更新可能引入不需要的更改或重大更改的程序包。有关更多信息，请参阅《Amazon Linux 2023 用户指南》**中的 [Managing repositories and OS updates in Amazon Linux 2023](https://docs.aws.amazon.com/linux/al2023/ug/managing-repos-os-updates.html)。

### Linux 内核版本
<a name="al2-to-al2023-ami-transition-compatibility-kernel"></a>

Amazon Linux 2 AMI 基于 Linux 内核 4.14 和 5.10，而 Amazon Linux 2023 使用 Linux 内核 6.1 和 6.12。有关更多信息，请参阅《Amazon Linux 2023 用户指南**》中的 [Comparing Amazon Linux 2 and Amazon Linux 2023 kernels](https://docs.aws.amazon.com/linux/al2023/ug/compare-with-al2-kernel.html)。

### 程序包可用性更改
<a name="al2-to-al2023-ami-transition-compatibility-packages"></a>

以下是 Amazon Linux 2023 中值得注意的程序包更改：
+ Amazon Linux 2 不再包含 Amazon Linux 2023 中的某些源二进制包。有关更多信息，请参阅《Amazon Linux 2023 Release Notes》**中的 [Packages removed from Amazon Linux 2023](https://docs.aws.amazon.com/linux/al2023/release-notes/removed.html)。
+ Amazon Linux 支持不同版本程序包的方式的更改。Amazon Linux 2023 中不存在 Amazon Linux 2 中使用的 `amazon-linux-extras` 系统。所有程序包都可在“核心”存储库中找到。
+ Amazon Linux 2023 不支持适用于 Enterprise Linux 的附加程序包（EPEL）。有关更多信息，请参阅《Amazon Linux 2023 用户指南》**中的 [EPEL compatibility in Amazon Linux 2023](https://docs.aws.amazon.com/linux/al2023/ug/epel.html)。
+ Amazon Linux 2023 不支持 32 位应用程序。有关更多信息，请参阅《Amazon Linux 2023 用户指南》**中的 [Deprecated features from Amazon Linux 2](https://docs.aws.amazon.com/linux/al2023/ug/deprecated-al2.html#deprecated-32bit-rpms)。

### 控制组（cgroup）更改
<a name="al2-to-al2023-ami-transition-compatibility-cgroups"></a>

控制组（cgroup）是 Linux 内核的一项功能，用于分层组织进程并在进程之间分配系统资源。控制组被广泛用于通过 `systemd` 实现容器运行时系统。

Amazon ECS 代理、Docker 和 containerd 均支持 cgroupv1 和 cgroupv2。Amazon ECS 代理和容器运行时会为您管理 cgroup，因此 Amazon ECS 客户无需对此底层 cgroup 升级进行任何更改。

有关 cgroupv2 的更多详细信息，请参阅《Amazon Linux 2023 用户指南》**中的 [Control groups v2 in Amazon Linux 2023](https://docs.aws.amazon.com/linux/al2023/ug/cgroupv2.html)。

### 实例元数据服务（IMDS）更改
<a name="al2-to-al2023-ami-transition-compatibility-imds"></a>

默认情况下，Amazon Linux 2023 需要实例元数据服务版本 2（IMDSv2）。IMDSv2 可带来多项好处，有助于改善安全状况。它使用面向会话的身份验证方法，需要在简单的 HTTP PUT 请求中创建密钥令牌才能启动会话。会话令牌的有效时间可以介于 1 秒到 6 小时之间。

有关如何从 IMDSv1 过渡到 IMDSv2 的更多信息，请参阅《Amazon EC2 用户指南》**中的[过渡到使用实例元数据服务版本 2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-metadata-transition-to-version-2.html)。

如果您想使用 IMDSv1，您仍然可以通过使用实例元数据选项启动属性，手动覆盖设置来做到这一点。

### 内存交换性更改
<a name="al2-to-al2023-ami-transition-compatibility-memory-swappiness"></a>

Amazon Linux 2023 和 cgroups v2 不支持按容器交换内存。有关更多信息，请参阅 [管理 Amazon ECS 上的容器交换内存空间](container-swap.md)。

### FIPS 验证更改
<a name="al2-to-al2023-ami-transition-compatibility-fips"></a>

Amazon Linux 2 通过了 FIPS 140-2 认证，Amazon Linux 2023 通过了 FIPS 140-3 认证。

要在 Amazon Linux 2023 上启用 FIPS 模式，请在您的 Amazon EC2 实例上安装必要的程序包，然后按照《Amazon Linux 2023 用户指南》**的 [Enable FIPS Mode on Amazon Linux 2023](https://docs.aws.amazon.com/linux/al2023/ug/fips-mode.html) 中的说明，完成配置步骤即可。

### 加速实例支持
<a name="al2-to-al2023-ami-transition-compatibility-accelerated"></a>

Amazon ECS 优化版 Amazon Linux 2023 AMI 同时支持 Neuron 和 GPU 加速实例类型。有关更多信息，请参阅 [经 Amazon ECS 优化的 Linux AMI](ecs-optimized_AMI.md)。

## 构建自定义 AMI
<a name="al2-to-al2023-ami-transition-custom-ami"></a>

虽然我们建议您迁移到官方支持和发布的 Amazon Linux 2023 Amazon ECS 优化版 AMI，但您可以继续使用用于构建 Amazon ECS 优化版 AMI 的 Linux 变体的开源构建脚本，来构建自定义 Amazon Linux 2 Amazon ECS 优化版 AMI。有关更多信息，请参阅 [经 Amazon ECS 优化的 Linux AMI 构建脚本](ecs-ami-build-scripts.md)。

## 迁移策略
<a name="al2-to-al2023-ami-transition-migration"></a>

我们建议制定和实施包括全面应用程序测试在内的迁移计划。以下各节根据您管理 Amazon ECS 基础设施的方式概述了不同的迁移策略。

### 使用 Amazon ECS 容量提供程序进行迁移
<a name="al2-to-al2023-ami-transition-migration-capacity-providers"></a>

1. 使用新的启动模板创建一个新的容量提供程序。这应该引用一个自动扩缩组群组，其启动模板与您的现有模板类似，但它应该指定其中一个 Amazon Linux 2023 变体，而非 Amazon Linux 2 Amazon ECS 优化版 AMI。将这个新容量提供程序添加到现有的 Amazon ECS 集群。

1. 更新集群的默认容量提供程序策略，将现有的 Amazon Linux 2 容量提供程序和新的 Amazon Linux 2023 容量提供程序纳入其中。首先，对 Amazon Linux 2 提供程序使用较高的权重，对 Amazon Linux 2023 提供程序使用较低的权重（例如，Amazon Linux 2：权重 80，Amazon Linux 2023：权重 20）。这会导致 Amazon ECS 在计划新任务时开始预置 Amazon Linux 2023 实例。确认实例是否注册正确，任务是否能够在新实例上成功运行。

1. 逐步调整集群默认策略中的容量提供程序权重，增加 Amazon Linux 2023 提供程序的权重，同时随着时间的推移降低 Amazon Linux 2 提供程序的权重（例如，先是 60/40，然后是 40/60，接着是 20/80）。您还可以更新各个服务容量提供程序的策略，以优先考虑 Amazon Linux 2023 实例。监控任务放置，确保它们在 Amazon Linux 2023 实例上成功运行。

1. （可选）清空 Amazon Linux 2 容器实例以加速任务迁移。如果您有足够的 Amazon Linux 2023 替换容量，则可以通过 Amazon ECS 控制台或 AWS CLI 手动清空 Amazon Linux 2 容器实例，加速将任务从 Amazon Linux 2 过渡到 Amazon Linux 2023。迁移完成后，从您的集群中移除 Amazon Linux 2 容量提供程序，并删除关联的自动扩缩组。

### 使用 Amazon EC2 Auto Scaling 组进行迁移
<a name="al2-to-al2023-ami-transition-migration-asg"></a>

1. 使用新的启动模板创建一个新的 Amazon EC2 Auto Scaling 组。此模板应与现有的启动模板类似，但它应指定其中一个 Amazon Linux 2023 变体，而非 Amazon Linux 2 Amazon ECS 优化版 AMI。这个新的自动扩缩组可以向现有集群启动实例。

1. 纵向扩展该自动扩缩组，即可开始将 Amazon Linux 2023 实例注册到您的集群中。确认实例是否注册正确，任务是否能够在新实例上成功运行。

1. 验证确认您的任务可在 Amazon Linux 2023 上运行后，纵向扩展 Amazon Linux 2023 自动扩缩组，同时逐步缩减 Amazon Linux 2 自动扩缩组，直到完全替换所有 Amazon Linux 2 实例。

1. 如果您有足够的 Amazon Linux 2023 替换容量，则可能需要显式清空容器实例，以加速将任务从 Amazon Linux 2 过渡到 Amazon Linux 2023。有关更多信息，请参阅 [耗尽 Amazon ECS 容器实例](container-instance-draining.md)。

### 使用手动托管的实例进行迁移
<a name="al2-to-al2023-ami-transition-migration-manual"></a>

1. 使用 Amazon ECS 优化版 Amazon Linux 2023 AMI（而不是 Amazon Linux 2）手动启动新的 Amazon EC2 实例（或调整启动该实例的脚本）。确保这些实例使用与现有 Amazon Linux 2 实例相同的安全组、子网、IAM 角色和集群配置。这些实例应在启动时自动注册到现有 Amazon ECS 集群中。

1. 确认新的 Amazon Linux 2023 实例是否已成功注册到 Amazon ECS 集群并且处于 `ACTIVE` 状态。通过等待自然任务放置或手动停止/启动某些任务以触发重新计划，测试是否可以在这些新实例上计划任务并正常运行任务。

1. 根据需要启动其他 Amazon Linux 2023 实例，然后手动逐个清空和终止 Amazon Linux 2 实例，从而逐步替换 Amazon Linux 2 实例。将实例设置为 `DRAINING` 状态，通过 Amazon ECS 控制台清空实例，这将停止在这些实例上放置新任务，并允许现有任务完成或在其他地方重新计划这些任务。

# 经 Amazon ECS 优化的 Linux AMI 构建脚本
<a name="ecs-ami-build-scripts"></a>

Amazon ECS 已对用于构建 Amazon ECS 优化版 AMI 的 Linux 变体的构建脚本进行开源。GitHub 上现在提供了这些生成脚本。有关更多信息，请参阅 GitHub 上的 [amazon-ecs-ami](https://github.com/aws/amazon-ecs-ami)。

如果您需要自定义经 Amazon ECS 优化的 AMI，请参阅 GitHub 上的 [经 Amazon ECS 优化的 AMI 生成配方](https://github.com/aws/amazon-ecs-ami)。

生成脚本存储库包含 [HashiCorp packer](https://developer.hashicorp.com/packer/docs) 模板和生成脚本以生成经 Amazon ECS 优化的 AMI 的每个 Linux 变体。这些脚本是经 Amazon ECS 优化的 AMI 生成的可信来源，因此您可关注 GitHub 存储库以监控对 AMI 所做的更改。例如，您可能希望自己的 AMI 使用 Amazon ECS 团队用于正式 AMI 的同一版本的 Docker。

有关更多信息，请通过 GitHub 上的 [aws/amazon-ecs-ami](https://github.com/aws/amazon-ecs-ami) 参阅 Amazon ECS AMI 存储桶。

**要构建经 Amazon ECS 优化的 Linux AMI**

1. 克隆 `aws/amazon-ecs-ami` GitHub 存储库。

   ```
   git clone https://github.com/aws/amazon-ecs-ami.git
   ```

1. 添加 AWS 区域的环境变量以在创建 AMI 时使用。用要使用的区域替换 `us-west-2` 值。

   ```
   export REGION=us-west-2
   ```

1. 提供了一个 Makefile 来构建 AMI。从克隆存储库的根目录中，使用以下命令之一，这对应于要构建的经 Amazon ECS 优化 AMI 的 Linux 变体。
   + 经 Amazon ECS 优化的 Amazon Linux 2 AMI

     ```
     make al2
     ```
   + 经 Amazon ECS 优化的 Amazon Linux 2（arm64）AMI

     ```
     make al2arm
     ```
   + Amazon ECS GPU 优化型 AMI

     ```
     make al2gpu
     ```
   + 经 Amazon ECS 优化的 Amazon Linux 2（Neuron）AMI

     ```
     make al2inf
     ```
   + 经 Amazon ECS 优化的 Amazon Linux 2023 AMI

     ```
     make al2023
     ```
   + 经 Amazon ECS 优化的 Amazon Linux 2023（arm64）AMI

     ```
     make al2023arm
     ```
   + 经 Amazon ECS 优化的 Amazon Linux 2023 GPU AMI

     ```
     make al2023gpu
     ```
   + 经 Amazon ECS 优化的 Amazon Linux 2023（Neuron）AMI

     ```
     make al2023neu
     ```

# 经 Amazon ECS 优化的 Bottlerocket AMI
<a name="ecs-bottlerocket"></a>

Bottlerocket 是一个基于 Linux 的开源操作系统，由 AWS 专门为在虚拟机或裸机主机上运行容器而打造。经 Amazon ECS Bottlerocket 优化的 AMI 安全，只包含运行容器所需的最少软件包数量。此项可以提高资源使用率，减少安全攻击面，并有助于降低管理开销。Bottlerocket AMI 还与 Amazon ECS 集成，以帮助减少更新集群中的容器实例所涉及的操作开销。

Bottlerocket 与 Amazon Linux 存在以下差异：
+ Bottlerocket 不包括包管理器，其软件只能作为容器运行。对 Bottlerocket 的更新既可以应用，也可以通过一个步骤进行回滚，这样可以降低出现更新错误的可能性。
+ 管理 Bottlerocket 主机的主要机制是使用容器调度器。与 Amazon Linux 不同，登录单个 Bottlerocket 实例的操作并不频繁，仅用于高级调试和故障排除目的。

有关 Bottlerocket 的更多信息，请参阅 GitHub 上的[文档](https://github.com/bottlerocket-os/bottlerocket/blob/develop/README.md)和[发布](https://github.com/bottlerocket-os/bottlerocket/releases)。

适用于内核 6.1 和内核 5.10 的经 Amazon ECS 优化的 Bottlerocket AMI 有多个变体。

以下变体使用内核 6.1：
+ `aws-ecs-2`
+ `aws-ecs-2-nvidia`

以下变体使用内核 5.10：
+ `aws-ecs-1`
+ `aws-ecs-1-nvidia`

  有关 `aws-ecs-1-nvidia` 变体的更多信息，请参阅[宣布对 Amazon ECS 上的 Bottlerocket 提供 NVIDIA GPU 支持](https://aws.amazon.com/blogs/containers/announcing-nvidia-gpu-support-for-bottlerocket-on-amazon-ecs/)。

## 注意事项
<a name="ecs-bottlerocket-considerations"></a>

将 Bottlerocket AMI 与 Amazon ECS 结合使用时，请考虑以下因素。
+ Bottlerocket 支持采用 `x86_64` 和 `arm64` 处理器的 Amazon EC2 实例。Bottlerocket 不建议将 Amazon EC2 实例与 Inferentia 芯片一起使用。
+ Bottlerocket 映像不附带 SSH 服务器或 Shell。但是，您可以使用带外管理工具获得 SSH 管理员访问权限并执行引导程序。

   有关更多信息，请参阅 GitHub 上的 [bottlerocket README.md](https://github.com/bottlerocket-os/bottlerocket)：
  + [Exploration (探索)](https://github.com/bottlerocket-os/bottlerocket#exploration)
  + [管理员容器](https://github.com/bottlerocket-os/bottlerocket#admin-container)
+ 预设情况下，Bottlerocket 启用了一个[控制容器](https://github.com/bottlerocket-os/bottlerocket-control-container)。该容器运行 [AWS Systems Manager 代理](https://github.com/aws/amazon-ssm-agent)，您可以用它在 Amazon EC2 Bottlerocket 实例上运行命令或启动 shell 会话。有关更多信息，请参阅 *AWS Systems Manager 用户指南*中的[设置会话管理器](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-getting-started.html)。
+ Bottlerocket 针对容器工作负载进行了优化，并专注于安全性。Bottlerocket 不包含软件包管理器，并且不可变。

  有关安全功能和指南的信息，请参阅 GitHub 上的[安全功能](https://github.com/bottlerocket-os/bottlerocket/blob/develop/SECURITY_FEATURES.md)和[安全指南](https://github.com/bottlerocket-os/bottlerocket/blob/develop/SECURITY_GUIDANCE.md)。
+ Bottlerocket AMI 版本 `1.1.0` 或更高版本支持 `awsvpc` 网络模式。
+ Bottlerocket AMI 版本 `1.15.0` 或更高版本支持任务定义中的 App Mesh。
+ Bottlerocket AMI 版本 `1.19.0` 或更高版本支持 `initProcessEnabled` 任务定义参数。
+ Bottlerocket AMI 也不支持以下服务和功能：
  + ECS Anywhere
  + Service Connect
  + Amazon EFS 处于加密模式
  + Amazon EFS 处于 `awsvpc` 网络模式
  + 无法装载 Amazon EBS 卷
  + Elastic Inference 加速器

# 检索经 Amazon ECS 优化的 Bottlerocket AMI 元数据
<a name="ecs-bottlerocket-retrieve-ami"></a>

您可以通过查询 AWS Systems Manager Parameter Store API 来检索经 Amazon EKS 优化的 AMI 的亚马逊机器映像（AMI）ID。使用此参数，您无需手动查找经 Amazon ECS 优化的 AMI ID。有关 Systems Manager Parameter Store API 的更多信息，请参阅 [GetParameter](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameter.html)。您使用的用户必须具有 `ssm:GetParameter` IAM 权限才能检索经 Amazon ECS 优化的 AMI 元数据。

## `aws-ecs-2` Bottlerocket AMI 变体
<a name="ecs-bottlerocket-aws-ecs-2-variant"></a>

您可以使用 AWS CLI 或 AWS 管理控制台 按 AWS 区域 和架构检索最新的稳定 `aws-ecs-2` Bottlerocket AMI 变体。
+ **AWS CLI** – 您可以使用子参数 `image_id`，通过以下 AWS CLI 命令检索推荐的最新的经 Amazon ECS 优化的 Bottlerocket AMI 的映像 ID。将 `region` 替换为您想要的 AMI ID 所对应的区域代码。

  有关支持的 AWS 区域 的信息，请参阅 GitHub 上的[查找 AMI](https://github.com/bottlerocket-os/bottlerocket/blob/develop/QUICKSTART-ECS.md#finding-an-ami)。要检索最新版本以外的版本，请将 `latest` 替换为相应的版本号。
  + 对于 64 位（`x86_64`）架构：

    ```
    aws ssm get-parameter --region us-east-2 --name "/aws/service/bottlerocket/aws-ecs-2/x86_64/latest/image_id" --query Parameter.Value --output text
    ```
  + 对于 64 位 Arm（`arm64`）架构：

    ```
    aws ssm get-parameter --region us-east-2 --name "/aws/service/bottlerocket/aws-ecs-2/arm64/latest/image_id" --query Parameter.Value --output text
    ```
+ **AWS 管理控制台** – 您可以使用 AWS 管理控制台 中的 URL 查询推荐的经 Amazon ECS 优化的 AMI ID。该 URL 使用参数的 ID 的值打开 Amazon EC2 Systems Manager 控制台。在以下 URL 中，将 `region` 替换为您想要的 AMI ID 所对应的区域代码。

   有关支持的 AWS 区域 的信息，请参阅 GitHub 上的[查找 AMI](https://github.com/bottlerocket-os/bottlerocket/blob/develop/QUICKSTART-ECS.md#finding-an-ami)。
  + 对于 64 位（`x86_64`）架构：

    ```
    https://console.aws.amazon.com/systems-manager/parameters/aws/service/bottlerocket/aws-ecs-2/x86_64/latest/image_id/description?region=region#
    ```
  + 对于 64 位 Arm（`arm64`）架构：

    ```
    https://console.aws.amazon.com/systems-manager/parameters/aws/service/bottlerocket/aws-ecs-2/arm64/latest/image_id/description?region=region#
    ```

## `aws-ecs-2-nvidia` Bottlerocket AMI 变体
<a name="ecs-bottlerocket-aws-ecs-1-nvidia-variants"></a>

您可以使用 AWS CLI 或 AWS 管理控制台 按区域和架构检索最新的稳定 `aws-ecs-2-nvdia` Bottlerocket AMI 变体。
+ **AWS CLI** – 您可以使用子参数 `image_id`，通过以下 AWS CLI 命令检索推荐的最新的经 Amazon ECS 优化的 Bottlerocket AMI 的映像 ID。将 `region` 替换为您想要的 AMI ID 所对应的区域代码。

   有关支持的 AWS 区域 的信息，请参阅 GitHub 上的[查找 AMI](https://github.com/bottlerocket-os/bottlerocket/blob/develop/QUICKSTART-ECS.md#finding-an-ami)。要检索最新版本以外的版本，请将 `latest` 替换为相应的版本号。
  + 对于 64 位（`x86_64`）架构：

    ```
    aws ssm get-parameter --region us-east-1 --name "/aws/service/bottlerocket/aws-ecs-2-nvidia/x86_64/latest/image_id" --query Parameter.Value --output text
    ```
  + 对于 64 位 Arm（`arm64`）架构：

    ```
    aws ssm get-parameter --region us-east-1 --name "/aws/service/bottlerocket/aws-ecs-2-nvidia/arm64/latest/image_id" --query Parameter.Value --output text
    ```
+ **AWS 管理控制台** – 您可以使用 AWS 管理控制台 中的 URL 查询推荐的经 Amazon ECS 优化的 AMI ID。该 URL 使用参数的 ID 的值打开 Amazon EC2 Systems Manager 控制台。在以下 URL 中，将 `region` 替换为您想要的 AMI ID 所对应的区域代码。

  有关支持的 AWS 区域 的信息，请参阅 GitHub 上的[查找 AMI](https://github.com/bottlerocket-os/bottlerocket/blob/develop/QUICKSTART-ECS.md#finding-an-ami)。
  + 对于 64 位（`x86_64`）架构：

    ```
    https://regionconsole.aws.amazon.com/systems-manager/parameters/aws/service/bottlerocket/aws-ecs-2-nvidia/x86_64/latest/image_id/description?region=region#
    ```
  + 对于 64 位 Arm（`arm64`）架构：

    ```
    https://regionconsole.aws.amazon.com/systems-manager/parameters/aws/service/bottlerocket/aws-ecs-2-nvidia/arm64/latest/image_id/description?region=region#
    ```

## `aws-ecs-1` Bottlerocket AMI 变体
<a name="ecs-bottlerocket-aws-ecs-1-variant"></a>

您可以使用 AWS CLI 或 AWS 管理控制台 按 AWS 区域 和架构检索最新的稳定 `aws-ecs-1` Bottlerocket AMI 变体。
+ **AWS CLI** – 您可以使用子参数 `image_id`，通过以下 AWS CLI 命令检索推荐的最新的经 Amazon ECS 优化的 Bottlerocket AMI 的映像 ID。将 `region` 替换为您想要的 AMI ID 所对应的区域代码。

  有关支持的 AWS 区域 的信息，请参阅 GitHub 上的[查找 AMI](https://github.com/bottlerocket-os/bottlerocket/blob/develop/QUICKSTART-ECS.md#finding-an-ami)。要检索最新版本以外的版本，请将 `latest` 替换为相应的版本号。
  + 对于 64 位（`x86_64`）架构：

    ```
    aws ssm get-parameter --region us-east-1 --name "/aws/service/bottlerocket/aws-ecs-1/x86_64/latest/image_id" --query Parameter.Value --output text
    ```
  + 对于 64 位 Arm（`arm64`）架构：

    ```
    aws ssm get-parameter --region us-east-1 --name "/aws/service/bottlerocket/aws-ecs-1/arm64/latest/image_id" --query Parameter.Value --output text
    ```
+ **AWS 管理控制台** – 您可以使用 AWS 管理控制台 中的 URL 查询推荐的经 Amazon ECS 优化的 AMI ID。该 URL 使用参数的 ID 的值打开 Amazon EC2 Systems Manager 控制台。在以下 URL 中，将 `region` 替换为您想要的 AMI ID 所对应的区域代码。

  有关支持的 AWS 区域 的信息，请参阅 GitHub 上的[查找 AMI](https://github.com/bottlerocket-os/bottlerocket/blob/develop/QUICKSTART-ECS.md#finding-an-ami)。
  + 对于 64 位（`x86_64`）架构：

    ```
    https://region.console.aws.amazon.com/systems-manager/parameters/aws/service/bottlerocket/aws-ecs-1/x86_64/latest/image_id/description
    ```
  + 对于 64 位 Arm（`arm64`）架构：

    ```
    https://region.console.aws.amazon.com/systems-manager/parameters/aws/service/bottlerocket/aws-ecs-1/arm64/latest/image_id/description
    ```

## `aws-ecs-1-nvidia` Bottlerocket AMI 变体
<a name="ecs-bottlerocket-aws-ecs-1-nvidia-variants"></a>

您可以使用 AWS CLI 或 AWS 管理控制台 按区域和架构检索最新的稳定 `aws-ecs-1-nvdia` Bottlerocket AMI 变体。
+ **AWS CLI** – 您可以使用子参数 `image_id`，通过以下 AWS CLI 命令检索推荐的最新的经 Amazon ECS 优化的 Bottlerocket AMI 的映像 ID。将 `region` 替换为您想要的 AMI ID 所对应的区域代码。

  有关支持的 AWS 区域 的信息，请参阅 GitHub 上的[查找 AMI](https://github.com/bottlerocket-os/bottlerocket/blob/develop/QUICKSTART-ECS.md#finding-an-ami)。
  + 对于 64 位（`x86_64`）架构：

    ```
    aws ssm get-parameter --region us-east-1 --name "/aws/service/bottlerocket/aws-ecs-1-nvidia/x86_64/latest/image_id" --query Parameter.Value --output text
    ```
  + 对于 64 位 Arm（`arm64`）架构：

    ```
    aws ssm get-parameter --region us-east-1 --name "/aws/service/bottlerocket/aws-ecs-1-nvidia/arm64/latest/image_id" --query Parameter.Value --output text
    ```
+ **AWS 管理控制台** – 您可以使用 AWS 管理控制台 中的 URL 查询推荐的经 Amazon ECS 优化的 AMI ID。该 URL 使用参数的 ID 的值打开 Amazon EC2 Systems Manager 控制台。在以下 URL 中，将 `region` 替换为您想要的 AMI ID 所对应的区域代码。

  有关支持的 AWS 区域 的信息，请参阅 GitHub 上的[查找 AMI](https://github.com/bottlerocket-os/bottlerocket/blob/develop/QUICKSTART-ECS.md#finding-an-ami)。
  + 对于 64 位（`x86_64`）架构：

    ```
    https://console.aws.amazon.com/systems-manager/parameters/aws/service/bottlerocket/aws-ecs-1-nvidia/x86_64/latest/image_id/description?region=region#
    ```
  + 对于 64 位 Arm（`arm64`）架构：

    ```
    https://console.aws.amazon.com/systems-manager/parameters/aws/service/bottlerocket/aws-ecs-1-nvidia/arm64/latest/image_id/description?region=region#
    ```

## 后续步骤
<a name="bottlerocket-next-steps"></a>

有关如何在 Amazon ECS 上开始使用 Bottlerocket 操作系统的详细教程，请参阅 GitHub 上的[在 Amazon ECS 上使用 Bottlerocket AMI](https://github.com/bottlerocket-os/bottlerocket/blob/develop/QUICKSTART-ECS.md) 和 AWS 博客网站上的[开始使用 Bottlerocket 和 Amazon ECS](https://aws.amazon.com/blogs/containers/getting-started-with-bottlerocket-and-amazon-ecs/)。

有关如何启动 Bottlerocket 实例的信息，请参阅[启动 Amazon ECS 的 Bottlerocket 实例](bottlerocket-launch.md)

# 启动 Amazon ECS 的 Bottlerocket 实例
<a name="bottlerocket-launch"></a>

您可以启动 Bottlerocket 实例，以便运行容器工作负载。

您可以使用 AWS CLI 启动 Bottlerocket 实例。

1. 创建名为 `userdata.toml` 的文件。此文件会用于实例用户数据。将 *cluster-name* 替换为您集群的名称。

   ```
   [settings.ecs]
   cluster = "cluster-name"
   ```

1. 使用 [检索经 Amazon ECS 优化的 Bottlerocket AMI 元数据](ecs-bottlerocket-retrieve-ami.md) 中包含的命令之一获取 Bottlerocket AMI ID。您将在以下步骤中使用此 ID。

1. 运行以下命令来启动 Bottlerocket 实例。请记得替换以下参数：
   + 用您的实例将在其中启动的私有或公有子网的 ID 替换*子网*。
   + 将 *bottlerocket\$1ami* 替换为上一步中的 AMI ID。
   + 将 *t3.large* 替换为您要使用的实例类型。
   + 将 *region* 替换为区域代码。

   ```
   aws ec2 run-instances --key-name ecs-bottlerocket-example \
      --subnet-id subnet \
      --image-id bottlerocket_ami \
      --instance-type t3.large \
      --region region \
      --tag-specifications 'ResourceType=instance,Tags=[{Key=bottlerocket,Value=example}]' \
      --user-data file://userdata.toml \
      --iam-instance-profile Name=ecsInstanceRole
   ```

1. 运行以下命令，以验证容器实例是否注册到集群。在运行此命令时，请记得替换以下参数：
   + 将 *cluster* 替换为您的集群名称。
   + 将 *region* 替换为区域代码。

   ```
   aws ecs list-container-instances --cluster cluster-name --region region
   ```

有关如何在 Amazon ECS 上开始使用 Bottlerocket 操作系统的详细演练，请参阅 GitHub 上的[在 Amazon ECS 上使用 Bottlerocket AMI](https://github.com/bottlerocket-os/bottlerocket/blob/develop/QUICKSTART-ECS.md) 和 AWS 博客网站上的[开始使用 Bottlerocket 和 Amazon ECS](https://aws.amazon.com/blogs/containers/getting-started-with-bottlerocket-and-amazon-ecs/)。

# Amazon ECS Linux 容器实例管理
<a name="manage-linux"></a>

为 Amazon ECS 工作负载使用 EC2 实例时，您负责维护这些实例

**Topics**
+ [启动容器实例](launch_container_instance.md)
+ [引导启动 Linux 容器实例](bootstrap_container_instance.md)
+ [配置容器实例以接收竞价型实例通知](spot-instance-draining-linux-container.md)
+ [在启动容器实例时运行脚本](start_task_at_launch.md)
+ [

# 增加 Amazon ECS Linux 容器实例网络接口
](container-instance-eni.md)
+ [预留容器实例内存](memory-management.md)
+ [远程管理容器实例](ec2-run-command.md)
+ [为 Linux 容器实例使用 HTTP 代理](http_proxy_config.md)
+ [为您的自动扩缩组配置预初始化的实例](using-warm-pool.md)
+ [

# 更新 Amazon ECS 容器代理
](ecs-agent-update.md)

每个 Amazon ECS 容器代理版本都支持不同的功能集并提供了针对早期版本的错误修复。如果可能，我们始终建议使用最新版本的 Amazon ECS 容器代理。要将您的容器代理更新至最新版本，请参阅[更新 Amazon ECS 容器代理](ecs-agent-update.md)。

要查看每个代理版本包含了哪些功能和增强功能，请参阅 [https://github.com/aws/amazon-ecs-agent/releases](https://github.com/aws/amazon-ecs-agent/releases)。

**重要**  
可靠指标的最低 Docker 版本是 Docker 版本 `v20.10.13` 及更高版本，该版本包含在经 Amazon ECS 优化的 AMI `20220607` 及更高版本中。  
Amazon ECS 代理版本 `1.20.0` 及更高版本已弃用对早于 `18.01.0` 的 Docker 版本的支持。

# 启动 Amazon ECS Linux 容器实例
<a name="launch_container_instance"></a>

您可以使用 Amazon EC2 控制台创建 Amazon ECS 容器实例。

您可以使用各种方法启动实例，包括 Amazon EC2 控制台、AWS CLI 和 SDK。要了解启动实例的其他方法，请参阅《Amazon EC2 用户指南》中的[启动实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/LaunchingAndUsingInstances.html)**。

有关启动向导的更多信息，请参阅《Amazon EC2 用户指南》中的[使用新启动实例向导启动实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-instance-wizard.html)**。

在开始之前，请完成 [设置以使用 Amazon ECS](get-set-up-for-amazon-ecs.md) 中的步骤。

您可以使用新 Amazon EC2 向导启动实例。启动实例向导指定启动实例所需的启动参数。

**Topics**
+ [

## 过程
](#linux-liw-initiate-instance-launch)
+ [

## 名称和标签
](#linux-liw-name-and-tags)
+ [

## 应用程序和操作系统映像（亚马逊机器映像）
](#linux-liw-ami)
+ [

## 实例类型
](#linux-liw-instance-type)
+ [

## 密钥对（登录）
](#linux-liw-key-pair)
+ [

## 网络设置
](#linux-liw-network-settings)
+ [

## 配置存储
](#linux-liw-storage)
+ [

## 高级详细信息
](#linux-liw-advanced-details)

## 过程
<a name="linux-liw-initiate-instance-launch"></a>

在开始之前，请完成 [设置以使用 Amazon ECS](get-set-up-for-amazon-ecs.md) 中的步骤。

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在屏幕顶部的导航栏中，会显示当前 AWS 区域，例如，美国东部美国东部（俄亥俄州）。选择要在其中启动实例的区域。

1. 从 Amazon EC2 控制台控制面板中，选择**启动实例**。

## 名称和标签
<a name="linux-liw-name-and-tags"></a>

实例名称是一个标签，其中密钥为**名称**，而值为您指定的名称。您可以为实例、卷和弹性图形添加标签。对于竞价型实例，您只能标记竞价型实例请求。

指定实例名称和其它标签为可选项。
+ 对于**名称**，为实例输入一个描述性名称。如果您没有指定名称，则可以通过其 ID 标识实例，该 ID 将在您启动实例时自动生成。
+ 要添加其它标签，请选择**添加其他标签**。选择**添加标签**，然后输入密钥和值，然后选择要标记的资源类型。为每个要添加的其它标签选择**添加标签**。

## 应用程序和操作系统映像（亚马逊机器映像）
<a name="linux-liw-ami"></a>

亚马逊机器映像（AMI）中包含了创建实例所需的信息。例如，AMI 可能包含充当 Web 服务器所需的软件，例如 Apache 和您的网站。

使用**搜索**栏查找由 AWS 发布的合适的经 Amazon ECS 优化的 AMI。

1. 在**搜索**栏中输入以下术语之一。
   + **ami-ecs**
   + 经 Amazon ECS 优化的 AMI 的**值**。

     有关最新的经 Amazon ECS 优化的 AMI 及其值，请参阅[经 Linux Amazon ECS 优化的 AMI](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html#ecs-optimized-ami-linux)。

1. 按 **Enter** 键。

1. 在**选择亚马逊机器映像（AMI）**页面上，选择 **AWS Marketplace AMI** 选项卡。

1. 从左侧 **Refine results**（优化结果）窗格中，选择 **Amazon Web Services** 作为 **Publisher**（发布者）。

1. 在要使用的 AMI 行上选择 **Select**（选择）。

   或者，选择右上角的 **Cancel**（取消）以返回启动实例向导，而不选择 AMI。将选择默认 AMI。确保 AMI 满足[经 Amazon ECS 优化的 Linux AMI](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html) 中概述的要求。

## 实例类型
<a name="linux-liw-instance-type"></a>

实例类型定义了实例的硬件配置和大小。更大的实例类型拥有更多的 CPU 和内存。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[实例类型](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html)。如果您希望运行仅 IPv6 工作负载，则某些实例类型不支持 IPv6 地址。有关更多信息，请参阅 *Amazon EC2 用户指南*中的 [IPv6 地址](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-instance-addressing.html#ipv6-addressing)。
+ 对于**实例类型**，请为实例选择实例类型。

   您选择的实例类型决定了可用于运行您的任务的资源。

## 密钥对（登录）
<a name="linux-liw-key-pair"></a>

为**密钥对名称**选择一个现有密钥对，或选择**创建新的密钥对**来新建一个密钥对。

**重要**  
如果您选择**在没有密钥对的情况下继续（不推荐）**选项，则将无法连接到此实例，除非您选择配置为允许用户以其它方式登录的 AMI。

## 网络设置
<a name="linux-liw-network-settings"></a>

在表单的**网络设置**部分选择**编辑**按钮后，根据需要配置网络设置。
+ 对于 **VPC**，选择要将实例启动到的 VPC。要运行仅 IPv6 工作负载，请选择同时包含 IPv4 和 IPv6 CIDR 数据块的双堆栈 VPC。
+ 对于**子网**，选择要在其中启动实例的子网。您可以在与可用区、本地区域、Wavelength 区域或 Outpost 关联的子网中启动实例。

  要在可用区中启动实例，请选择要在其中启动实例的子网。要创建新子网，请选择**新建子网**转到 Amazon VPC 控制台。完成此操作后，返回到启动实例向导并选择“刷新”图标，以便将您的子网加载到列表中。

  要在本地区域中启动实例，请选择您在本地区域中创建的子网。

  要在 Outpost 中启动实例，请在 VPC 中选择与 Outpost 关联的子网。

  要运行仅 IPv6 工作负载，请选择仅包含 IPv6 CIDR 数据块的子网。
+ **自动分配公有 IP**：如果实例应可从互联网进行访问，请验证**自动分配公有 IP** 字段设置为**启用**。如果不是，请将此字段设置为**禁用**。
**注意**  
容器实例需要访问才能与 Amazon ECS 服务端点通信。这可以通过接口 VPC 端点或具有公共 IP 地址的容器实例实现。  
有关接口 VPC 端点的更多信息，请参阅 [Amazon ECS 接口 VPC 端点（AWS PrivateLink）](vpc-endpoints.md)  
如果您没有配置接口 VPC 端点，并且您的容器实例没有公有 IP 地址，必须使用网络地址转换（NATI）来提供此访问。有关更多信息，请参阅《Amazon VPC 用户指南》**中的 [NAT 网关](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)和本指南中的 [为 Amazon ECS Linux 容器实例使用 HTTP 代理](http_proxy_config.md)。
+ 如果您选择双堆栈 VPC 和仅 IPv6 子网，对于**自动分配 IPv6 IP**，请选择**启用**。
+ **防火墙（安全组）**：使用安全组为容器实例定义防火墙规则。这些规则指定哪些传入的网络流量可传输到您的容器实例。所有其他的流量将被忽略。
  + 要选择现有安全组，请选择 **Select existing security group**（选择现有安全组），然后选择您在 [设置以使用 Amazon ECS](get-set-up-for-amazon-ecs.md) 中创建的安全组。
+ 如果要为仅 IPv6 工作负载启动实例，请选择**高级网络配置**，然后对于**分配主 IPv6 IP** 选择**是**。
**注意**  
如果没有主 IPv6 地址，则以主机或桥接网络模式在容器实例上运行的任务将无法向负载均衡器或 AWS Cloud Map 注册。

## 配置存储
<a name="linux-liw-storage"></a>

您选择的 AMI 包含一个或多个存储卷，包括根卷。您可以指定要附加到实例的其它卷。

您可以使用**简单**视图。
+ **存储类型**：为您的容器实例配置存储。

  如果您使用的是经 Amazon ECS 优化的 Amazon Linux 2 AMI，您的实例将配置单个 30GiB 卷，用于在操作系统和 Docker 之间共享。

  如果您使用的是 Amazon ECS 优化型 AMI，您的实例将配置两个卷。**根**卷适合操作系统使用，第二个 Amazon EBS 卷（已挂载到 `/dev/xvdcz`）适合 Docker 使用。

  您可以选择增大或减小实例的卷大小以满足您的应用程序需求。

## 高级详细信息
<a name="linux-liw-advanced-details"></a>

对于**高级详细信息**，请展开该部分以查看字段并为实例指定任何其他参数。
+ **购买选项**：选择**请求竞价型实例**以请求竞价型实例。您还需要设置与竞价型实例相关的其他字段。有关更多信息，请参阅竞价型实例[请求](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-requests.html)。
**注意**  
如果使用竞价型实例时看到 `Not available` 消息，则需要选择其他实例类型。
+ **IAM 实例配置文件**：选择您的容器实例 IAM 角色。其通常被命名为 `ecsInstanceRole`。
**重要**  
如果未使用适当的 IAM 权限启动容器实例，则 Amazon ECS 代理无法连接到集群。有关更多信息，请参阅 [Amazon ECS 容器实例 IAM 角色](instance_IAM_role.md)。
+ **用户数据**：使用用户数据（例如 [Amazon ECS 容器代理配置](ecs-agent-config.md) 中的代理环境变量）配置 Amazon ECS 容器实例。Amazon EC2 用户数据脚本仅在实例首次启动时执行一次。以下是用户数据的常用示例：
  + 默认情况下，您的容器实例将启动到您的默认集群中。要在非默认集群中启动，请选择 **Advanced Details** 列表。然后，将以下脚本粘贴到 **User data** 字段中，将 *your\$1cluster\$1name* 替换为您的集群的名称。

    ```
    #!/bin/bash
    echo ECS_CLUSTER=your_cluster_name >> /etc/ecs/ecs.config
    ```
  + 如果 Amazon S3 中有 `ecs.config` 文件并且启用了对容器实例角色的 Amazon S3 只读访问权限，请选择**高级详细信息**列表。然后，将以下脚本粘贴到**用户数据**字段中，并将 *your\$1bucket\$1name* 替换为您的存储桶的名称以安装 AWS CLI 和在启动时写入您的配置文件。
**注意**  
有关此配置的更多信息，请参阅[将 Amazon ECS 容器实例配置存储在 Amazon S3 中](ecs-config-s3.md)。

    ```
    #!/bin/bash
    yum install -y aws-cli
    aws s3 cp s3://your_bucket_name/ecs.config /etc/ecs/ecs.config
    ```
  + 使用 `ECS_CONTAINER_INSTANCE_TAGS` 配置参数为您的容器实例指定标签。这只创建与 Amazon ECS 关联的标签，无法使用 Amazon EC2 API 列出这些标签。
**重要**  
如果您使用 Amazon EC2 Auto Scaling 组启动容器实例，则应使用 ECS\$1CONTAINER\$1INSTANCE\$1TAGS 代理配置参数来添加标签。这是由于标签添加到使用 自动扩缩组启动的 Amazon EC2 实例的方式造成的。

    ```
    #!/bin/bash
    cat <<'EOF' >> /etc/ecs/ecs.config
    ECS_CLUSTER=your_cluster_name
    ECS_CONTAINER_INSTANCE_TAGS={"tag_key": "tag_value"}
    EOF
    ```
  + 为您的容器实例指定标签，然后使用 `ECS_CONTAINER_INSTANCE_PROPAGATE_TAGS_FROM` 配置参数将其从 Amazon EC2 传播到 Amazon ECS

    下面是一个用户数据脚本示例，该脚本将传播与容器实例关联的标签，以及向名为 `your_cluster_name` 的集群注册容器实例：

    ```
    #!/bin/bash
    cat <<'EOF' >> /etc/ecs/ecs.config
    ECS_CLUSTER=your_cluster_name
    ECS_CONTAINER_INSTANCE_PROPAGATE_TAGS_FROM=ec2_instance
    EOF
    ```
  + 默认情况下，Amazon ECS 容器代理会通过查看实例的默认 IPv4 和 IPv6 路由来尝试检测容器实例是否与仅 IPv6 配置兼容。要覆盖此行为，您可以在实例的 `/etc/ecs/ecs.config` 文件中将 ` ECS_INSTANCE_IP_COMPATIBILITY` 参数设置为 `ipv4` 或 `ipv6`。

    ```
    #!/bin/bash
    cat <<'EOF' >> /etc/ecs/ecs.config
    ECS_CLUSTER=your_cluster_name
    ECS_INSTANCE_IP_COMPATIBILITY=ipv6
    EOF
    ```

  有关更多信息，请参阅 [引导启动 Amazon ECS Linux 容器实例以传递数据](bootstrap_container_instance.md)。

# 引导启动 Amazon ECS Linux 容器实例以传递数据
<a name="bootstrap_container_instance"></a>

在启动 Amazon EC2 实例时，您可以将用户数据传递到 EC2 实例。数据可以用于执行常见的自动配置任务，甚至用于在实例启动时运行脚本。对于 Amazon ECS，最常见的用户数据使用案例是将配置信息传递到 Docker 进程守护程序和 Amazon ECS 容器实例。

您可以将多类用户数据传递到 Amazon EC2，其中包括云 boothook、Shell 脚本和 `cloud-init` 指令。有关这些和其他格式类型的更多信息，请参阅 [Cloud-Init 文档](https://cloudinit.readthedocs.io/en/latest/explanation/format.html)。

要在使用 Amazon EC2 启动向导时传递此用户数据，请参阅 [启动 Amazon ECS Linux 容器实例](launch_container_instance.md)。

您可以将容器实例配置为在容器代理配置或 Docker 进程守护程序配置中传递数据。

## Amazon ECS 容器代理
<a name="bootstrap_container_agent"></a>

当容器代理启动时，经 Amazon ECS 优化的 AMI的 Linux 变体将在 `/etc/ecs/ecs.config` 文件中查找代理配置数据。您可以在启动时使用 Amazon EC2 用户数据指定此配置数据。有关可用 Amazon ECS 容器代理配置变量的更多信息，请参阅 [Amazon ECS 容器代理配置](ecs-agent-config.md)。

若要仅设置一个代理配置变量（如集群名称），请使用 **echo** 将该变量复制到配置文件：

```
#!/bin/bash
echo "ECS_CLUSTER=MyCluster" >> /etc/ecs/ecs.config
```

如果您有多个变量要写入到 `/etc/ecs/ecs.config`，请使用以下 `heredoc` 格式。此格式会将以 **cat** 和 `EOF` 开头的行之间的所有内容写入到配置文件。

```
#!/bin/bash
cat <<'EOF' >> /etc/ecs/ecs.config
ECS_CLUSTER=MyCluster
ECS_ENGINE_AUTH_TYPE=docker
ECS_ENGINE_AUTH_DATA={"https://index.docker.io/v1/":{"username":"my_name","password":"my_password","email":"email@example.com"}}
ECS_LOGLEVEL=debug
ECS_WARM_POOLS_CHECK=true
EOF
```

要设置自定义实例属性，请设置 `ECS_INSTANCE_ATTRIBUTES` 环境变量。

```
#!/bin/bash
cat <<'EOF' >> ecs.config
ECS_INSTANCE_ATTRIBUTES={"envtype":"prod"}
EOF
```

## Docker 进程守护程序
<a name="bootstrap_docker_daemon"></a>

您可以使用 Amazon EC2 用户数据指定 Docker 进程守护程序配置信息。有关配置选项的更多信息，请参阅 [Docker 进程守护程序文档](https://docs.docker.com/reference/cli/dockerd/)。

**注意**  
AWS 不支持自定义 Docker 配置，因为它们有时可能会与未来的 Amazon ECS 更改或功能发生冲突，而不会发出警告。

在以下示例中，自定义选项添加到 Docker 进程守护程序配置文件中，`/etc/docker/daemon.json`，然后在启动实例时在用户数据中指定。

```
#!/bin/bash
cat <<EOF >/etc/docker/daemon.json
{"debug": true}
EOF
systemctl restart docker --no-block
```

在以下示例中，自定义选项添加到 Docker 进程守护程序配置文件中，`/etc/docker/daemon.json`，然后在启动实例时在用户数据中指定。此示例说明如何在 Docker 进程守护程序配置文件中禁用 docker-proxy。

```
#!/bin/bash
cat <<EOF >/etc/docker/daemon.json
{"userland-proxy": false}
EOF
systemctl restart docker --no-block
```

# 配置 Amazon ECS Linux 容器实例以接收竞价型实例通知
<a name="spot-instance-draining-linux-container"></a>

当 Spot 价格超过您请求的最高价格或容量不再可用时，Amazon EC2 会终止、停止或休眠您的竞价型实例。Amazon EC2 为终止和停止操作提供两分钟的竞价型实例中断通知。它没有提供休眠操作的两分钟通知。如果在实例上开启了 Amazon ECS 竞价型实例耗尽功能，则 Amazon ECS 会收到竞价型实例中断通知，并将实例置于 `DRAINING` 状态。

**重要**  
当 Auto Scaling Capacity Rebalancing 移除实例时，Amazon ECS 不会收到来自 Amazon EC2 的通知。有关更多信息，请参阅 [Amazon EC2 Auto Scaling 容器重新平衡](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-capacity-rebalancing.html)。

当某个容器实例设置为 `DRAINING` 时，Amazon ECS 将阻止安排放置在该容器实例上的新任务。连接即将耗尽的容器实例上处于 `PENDING` 状态的服务任务将立即停止。如果集群中有可用的容器实例，则在这些容器实例上启动替换服务任务。

竞价型实例耗尽功能在默认情况下处于关闭状态。

您可以在启动实例时开启竞价型实例耗尽功能。将以下脚本添加到**用户数据**字段。将 *MyCluster* 替换为要向其注册容器实例的集群名称。

```
#!/bin/bash
cat <<'EOF' >> /etc/ecs/ecs.config
ECS_CLUSTER=MyCluster
ECS_ENABLE_SPOT_INSTANCE_DRAINING=true
EOF
```

有关更多信息，请参阅 [启动 Amazon ECS Linux 容器实例](launch_container_instance.md)。

**要为现有容器实例开启竞价型实例耗尽**

1. 通过 SSH 连接到竞价型实例。

1. 编辑 `/etc/ecs/ecs.config` 文件并添加以下内容：

   ```
   ECS_ENABLE_SPOT_INSTANCE_DRAINING=true
   ```

1. 重新启动 `ecs` 服务。
   + 对于经 Amazon ECS 优化的 Amazon Linux 2 AMI：

     ```
     sudo systemctl restart ecs
     ```

1. （可选）您可以通过查询代理自检 API 操作，验证代理是否正在运行并查看有关新容器实例的一些信息。有关更多信息，请参阅 [Amazon ECS 容器自检](ecs-agent-introspection.md)。

   ```
   curl http://localhost:51678/v1/metadata
   ```

# 在启动 Amazon ECS Linux 容器实例时运行脚本
<a name="start_task_at_launch"></a>

您可能需要在每个容器实例上运行一个特定容器以处理操作或安全问题，例如监控、安全性、指标、服务发现或日志记录。

为此，可以将容器实例配置为在启动时或在某些 init 系统（如 Upstart 或 **systemd**）中使用用户数据脚本调用 **docker run** 命令。虽然此方法可行，但它有一些缺点，因为 Amazon ECS 不了解容器并且无法监控 CPU、内存、端口或已使用的任何其他资源。要确保 Amazon ECS 可正确了解所有任务资源，请为要在容器实例上运行的容器创建任务定义。然后，使用 Amazon ECS 在启动时利用 Amazon EC2 用户数据放置任务。

以下过程中的 Amazon EC2 用户数据脚本使用 Amazon ECS 自检 API 来确定容器实例。然后，它将使用 AWS CLI 和 **start-task** 命令在启动期间对自身运行指定任务。

**在容器实例启动时启动任务**

1. 修改您的 `ecsInstanceRole` IAM 角色以便为 `StartTask` API 操作添加权限。有关更多信息，请参阅《AWS Identity and Access Management 用户指南》**中的[更新角色的权限](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_update-role-permissions.html)。

1. 使用经 Amazon ECS 优化的 Amazon Linux 2 AMI，启动一个或多个容器实例。启动新的容器实例，并在 EC2 用户数据中使用以下示例脚本。将 *your\$1cluster\$1name* 替换为要注册到的容器实例的集群，并将 *my\$1task\$1def* 替换为要在启动时在实例上运行的任务定义。

   有关更多信息，请参阅 [启动 Amazon ECS Linux 容器实例](launch_container_instance.md)。
**注意**  
以下 MIME 分段内容使用 Shell 脚本设置配置值和安装程序包。它还将使用 Upstart 作业在 **ecs** 服务已在运行且自检 API 可用后启动任务。

   ```
   Content-Type: multipart/mixed; boundary="==BOUNDARY=="
   MIME-Version: 1.0
   
   --==BOUNDARY==
   Content-Type: text/x-shellscript; charset="us-ascii"
   
   #!/bin/bash
   # Specify the cluster that the container instance should register into
   cluster=your_cluster_name
   
   # Write the cluster configuration variable to the ecs.config file
   # (add any other configuration variables here also)
   echo ECS_CLUSTER=$cluster >> /etc/ecs/ecs.config
   
   START_TASK_SCRIPT_FILE="/etc/ecs/ecs-start-task.sh"
   cat <<- 'EOF' > ${START_TASK_SCRIPT_FILE}
   	exec 2>>/var/log/ecs/ecs-start-task.log
   	set -x
   	
   	# Install prerequisite tools
   	yum install -y jq aws-cli
   	
   	# Wait for the ECS service to be responsive
   	until curl -s http://localhost:51678/v1/metadata
   	do
   		sleep 1
   	done
   
   	# Grab the container instance ARN and AWS Region from instance metadata
   	instance_arn=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .ContainerInstanceArn' | awk -F/ '{print $NF}' )
   	cluster=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .Cluster' | awk -F/ '{print $NF}' )
   	region=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .ContainerInstanceArn' | awk -F: '{print $4}')
   
   	# Specify the task definition to run at launch
   	task_definition=my_task_def
   
   	# Run the AWS CLI start-task command to start your task on this container instance
   	aws ecs start-task --cluster $cluster --task-definition $task_definition --container-instances $instance_arn --started-by $instance_arn --region $region
   EOF
   
   # Write systemd unit file
   UNIT="ecs-start-task.service"
   cat <<- EOF > /etc/systemd/system/${UNIT}
         [Unit]
         Description=ECS Start Task
         Requires=ecs.service
         After=ecs.service
    
         [Service]
         Restart=on-failure
         RestartSec=30
         ExecStart=/usr/bin/bash ${START_TASK_SCRIPT_FILE}
   
         [Install]
         WantedBy=default.target
   EOF
   
   # Enable our ecs.service dependent service with `--no-block` to prevent systemd deadlock
   # See https://github.com/aws/amazon-ecs-agent/issues/1707
   systemctl enable --now --no-block "${UNIT}"
   --==BOUNDARY==--
   ```

1. 验证您的容器实例是否启动到正确的集群中以及您的任务是否已启动。

   1. 在 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2) 打开控制台。

   1. 在导航栏中，选择您的集群所在的区域。

   1. 在导航窗格中，选择 **Clusters** 并选择托管您的容器实例的集群。

   1. 在**集群**页面上，选择**任务**，然后选择您的任务。

      您启动的每个容器实例都应运行您的任务。

      如果没有看到任务，可以使用 SSH 登录容器实例，在 `/var/log/ecs/ecs-start-task.log` 文件中查看调试信息。

# 增加 Amazon ECS Linux 容器实例网络接口
<a name="container-instance-eni"></a>

**注意**  
此功能在 Fargate 上不可用。

使用 `awsvpc` 网络模式的每个任务都会获得自己的弹性网络接口（ENI），并将其挂载到托管该接口的容器实例。可以附加到 Amazon EC2 实例的网络接口的数量有原定设置限制，并且主网络接口计为一个。例如，默认情况下，最多可将三个 ENI 附加到一个 `c5.large` 实例。实例的主网络接口计为一个，因此您可以向该实例再附加 2 个 ENI。由于每个使用 `awsvpc` 网络模式的任务都需一个 ENI，因此，您通常只能在该实例类型上运行两个此类任务。

Amazon ECS 支持使用受支持的 Amazon EC2 实例类型启动已增加 ENI 密度的容器实例。当您使用这些实例类型并开启 `awsvpcTrunking` 账户设置时，其他 ENI 将在新启动的容器实例上可用。此配置允许您在每个容器实例上放置更多任务。要使用控制台开启该功能，请参阅[修改 Amazon ECS 账户设置](ecs-modifying-longer-id-settings.md)。要使用 AWS CLI 开启该功能，请参阅[使用 AWS CLI 管理 Amazon ECS 账户设置](account-setting-management-cli.md)。

例如，具有 `awsvpcTrunking` 的 `c5.large` 实例增加了十二个的 ENI 限制。容器实例将具有主网络接口，而 Amazon ECS 将创建一个“中继”网络接口并将此接口附加到容器实例。因此，此配置允许您在容器实例上启动 10 个任务，而不是当前的两个任务。

中继网络接口完全由 Amazon ECS 管理，并且会在您从集群中终止或注销容器实例时被删除。有关更多信息，请参阅 [EC2 的 Amazon ECS 任务联网选项](task-networking.md)。

## 注意事项
<a name="eni-trunking-considerations"></a>

在使用 ENI 中继功能时，注意以下事项。
+ 只有经 Amazon ECS 优化的 AMI 的 Linux 版本，或其他具有容器代理 `1.28.1` 版本或更高版本以及 ecs-init 软件包版本 `1.28.1-2` 或更高版本的 Amazon Linux 版本才能支持增加的 ENI 限制。只有您使用经 Amazon ECS 优化的 AMI 的 Linux 版本，则将满足这些要求。目前不支持 Windows 容器。
+ 仅在启用 `awsvpcTrunking` 后启动的新 Amazon EC2 实例将收到增加的 ENI 限制和中继网络接口。无论采取何种措施，以前启动的实例都不会收到这些功能。
+ Amazon EC2 实例必须关闭基于资源的 IPv4 DNS 请求。要禁用此选项，请在 Amazon EC2 控制台中创建新实例时取消选中**启用基于资源的 IPV4（A 记录）DNS 请求）**选项。要使用 AWS CLI 禁用此选项，使用以下命令：

  ```
  aws ec2 modify-private-dns-name-options --instance-id i-xxxxxxx --no-enable-resource-name-dns-a-record --no-dry-run
  ```
+ 不支持共享子网中的 Amazon EC2 实例。如果使用这些实例，则它们将无法注册到集群。
+ 您的任务必须使用 `awsvpc` 网络模式和 EC2。不管启动的实例数量如何，使用 Fargate 的任务都始终会收到专用 ENI，因此不需要此功能。
+ 您的任务必须在容器实例所在的 Amazon VPC 中启动。如果您的任务与容器实例不在同一 VPC 中，则任务将无法启动并显示属性错误。
+ 在启动新的容器实例时，实例将转换为 `REGISTERING` 状态，同时为实例预配置中继弹性网络接口。如果注册失败，则实例将转换为 `REGISTRATION_FAILED` 状态。您可以通过描述容器实例以查看 `statusReason` 字段，该字段描述失败的原因。然后可以手动注销或终止容器实例。一旦容器实例成功注销或终止，Amazon ECS 将删除中继 ENI。
**注意**  
Amazon ECS 会发出容器实例状态更改事件，您可以监控这些事件，以查看过渡到 `REGISTRATION_FAILED` 状态。有关更多信息，请参阅 [Amazon ECS 容器实例状态更改事件](ecs_container_instance_events.md)。
+ 一旦终止容器实例，该实例就会转换为 `DEREGISTERING` 状态，同时取消预配置中继弹性网络接口。随后，实例将转换为 `INACTIVE` 状态。
+ 如果停止然后重新启动具有增加的 ENI 限制的公有子网中的容器实例，则实例将丢失其公有 IP 地址，并且容器代理将丢失其连接。
+ 启用 `awsvpcTrunking` 后，容器实例会收到一个额外的 ENI，其使用 VPC 的默认安全组，并由 Amazon ECS 管理。

  原定设置 VPC 在每个可用区中都有一个公有子网、一个互联网网关以及用于启用 DNS 解析的设置。此子网属于公有子网，因为主路由表会将指向互联网的子网流量发送到互联网网关。您可以从到互联网网关的目标 0.0.0.0/0 中删除路由，以使默认子网变为私有子网。但如果您执行此操作，则在该子网中运行的所有容器实例都无法访问互联网。您可以通过添加或删除安全组规则来控制进出子网的流量。有关更多信息，请参阅《Amazon Virtual Private Cloud 用户指南》中的[安全组规则](https://docs.aws.amazon.com/vpc/latest/userguide/security-group-rules.html)**。

## 先决条件
<a name="eni-trunking-launching"></a>

在启动具有增加的 ENI 限制的容器实例之前，必须完成以下先决条件。
+ 必须创建 Amazon ECS 的服务相关角色。Amazon ECS 服务链接角色为 Amazon ECS 提供代表您调用其他 AWS 服务的权限。此角色是在创建集群时（或者在 AWS 管理控制台 中创建或更新服务时）自动为您创建的。有关更多信息，请参阅 [对 Amazon ECS 使用服务相关角色](using-service-linked-roles.md)。您也可以使用以下 AWS CLI 命令创建服务相关角色。

  ```
  aws iam [create-service-linked-role](https://docs.aws.amazon.com/cli/latest/reference/iam/create-service-linked-role.html) --aws-service-name ecs.amazonaws.com
  ```
+ 您的账户或容器实例 IAM 角色必须启用 `awsvpcTrunking` 账户设置。我们建议您创建两个容器实例角色（`ecsInstanceRole`）。然后，您可以为一个角色启用 `awsvpcTrunking` 账户设置，并将该角色用于需要 ENI 中继的任务。有关容器实例的更多信息，请参阅[Amazon ECS 容器实例 IAM 角色](instance_IAM_role.md)。

在满足先决条件后，您可以使用受支持的 Amazon EC2 实例类型之一来启动新容器实例，并且实例将具有增加的 ENI 限制。有关受支持实例类型的列表，请参阅 [增加的 Amazon ECS 容器网络接口支持的实例](eni-trunking-supported-instance-types.md)。容器实例必须具有 `1.28.1` 版本或更高版本的容器代理以及 `1.28.1-2` 版本或更高版本的 ecs-init 程序包。只有您使用经 Amazon ECS 优化的 AMI 的 Linux 版本，则将满足这些要求。有关更多信息，请参阅 [启动 Amazon ECS Linux 容器实例](launch_container_instance.md)。

**重要**  
Amazon EC2 实例必须关闭基于资源的 IPv4 DNS 请求。要禁用此选项，请确保在使用 Amazon EC2 控制台中创建新实例时取消选中**启用基于资源的 IPV4（A 记录）DNS 请求**选项。要使用 AWS CLI 禁用此选项，使用以下命令：  

```
aws ec2 modify-private-dns-name-options --instance-id i-xxxxxxx --no-enable-resource-name-dns-a-record --no-dry-run
```

**使用 AWS CLI 查看具有增加的 ENI 限制的容器实例**

每个容器实例都有一个默认网络接口，该接口称为中继网络接口。使用以下命令通过查询 `ecs.awsvpc-trunk-id` 属性来列出具有增加的 ENI 限制的容器实例，这表明其具有中继网络接口。
+ [list-attributes](https://docs.aws.amazon.com/cli/latest/reference/ecs/list-attributes.html) (AWS CLI)

  ```
  aws ecs list-attributes \
        --target-type container-instance \
        --attribute-name ecs.awsvpc-trunk-id \
        --cluster cluster_name \
        --region us-east-1
  ```
+ [Get-ECSAttributeList](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-ECSAttributeList.html) (AWS Tools for Windows PowerShell)

  ```
  Get-ECSAttributeList -TargetType container-instance -AttributeName ecs.awsvpc-trunk-id -Region us-east-1
  ```

# 增加的 Amazon ECS 容器网络接口支持的实例
<a name="eni-trunking-supported-instance-types"></a>

下面显示了受支持的 Amazon EC2 实例类型，以及在启用 `awsvpcTrunking` 账户设置之前和之后，可以在每个实例类型上启动使用 `awsvpc` 网络模式的任务的数目。

**重要**  
虽然同一实例系列中支持其他实例类型，但不支持 `a1.metal`、`c5.metal`、`c5a.8xlarge`、`c5ad.8xlarge`、`c5d.metal`、`m5.metal`、`p3dn.24xlarge`、`r5.metal`、`r5.8xlarge` 和 `r5d.metal` 实例类型。  
不支持 `c5n`、`d3`、`d3en`、`g3`、`g3s`、`g4dn`、`i3`、`i3en`、`inf1`、`m5dn`、`m5n`、`m5zn`、`mac1`、`r5b`、`r5n`、`r5dn`、`u-12tb1`、`u-6tb1`、`u-9tb1` 和 `z1d` 实例系列。

**Topics**
+ [

## 通用型
](#eni-branch-gp)
+ [

## 计算优化型
](#eni-branch-co)
+ [

## 内存优化型
](#eni-branch-mo)
+ [

## 存储优化
](#eni-branch-so)
+ [

## 加速计算型
](#eni-branch-ac)
+ [

## 高性能计算
](#eni-branch-hpc)

## 通用型
<a name="eni-branch-gp"></a>


| 实例类型 | 没有 ENI 中继的任务限制 | 有 ENI 中继的任务限制 | 
| --- | --- | --- | 
| a1.medium | 1 | 10 | 
| a1.large | 2 | 10 | 
| a1.xlarge | 3 | 20 | 
| a1.2xlarge | 3 | 40 | 
| a1.4xlarge | 7 | 60 | 
| m5.large | 2 | 10 | 
| m5.xlarge | 3 | 20 | 
| m5.2xlarge | 3 | 40 | 
| m5.4xlarge | 7 | 60 | 
| m5.8xlarge | 7 | 60 | 
| m5.12xlarge | 7 | 60 | 
| m5.16xlarge | 14 | 120 | 
| m5.24xlarge | 14 | 120 | 
| m5a.large | 2 | 10 | 
| m5a.xlarge | 3 | 20 | 
| m5a.2xlarge | 3 | 40 | 
| m5a.4xlarge | 7 | 60 | 
| m5a.8xlarge | 7 | 60 | 
| m5a.12xlarge | 7 | 60 | 
| m5a.16xlarge | 14 | 120 | 
| m5a.24xlarge | 14 | 120 | 
| m5ad.large | 2 | 10 | 
| m5ad.xlarge | 3 | 20 | 
| m5ad.2xlarge | 3 | 40 | 
| m5ad.4xlarge | 7 | 60 | 
| m5ad.8xlarge | 7 | 60 | 
| m5ad.12xlarge | 7 | 60 | 
| m5ad.16xlarge | 14 | 120 | 
| m5ad.24xlarge | 14 | 120 | 
| m5d.large | 2 | 10 | 
| m5d.xlarge | 3 | 20 | 
| m5d.2xlarge | 3 | 40 | 
| m5d.4xlarge | 7 | 60 | 
| m5d.8xlarge | 7 | 60 | 
| m5d.12xlarge | 7 | 60 | 
| m5d.16xlarge | 14 | 120 | 
| m5d.24xlarge | 14 | 120 | 
| m5d.metal | 14 | 120 | 
| m6a.large | 2 | 10 | 
| m6a.xlarge | 3 | 20 | 
| m6a.2xlarge | 3 | 40 | 
| m6a.4xlarge | 7 | 60 | 
| m6a.8xlarge | 7 | 90 | 
| m6a.12xlarge | 7 | 120 | 
| m6a.16xlarge | 14 | 120 | 
| m6a.24xlarge | 14 | 120 | 
| m6a.32xlarge | 14 | 120 | 
| m6a.48xlarge | 14 | 120 | 
| m6a.metal | 14 | 120 | 
| m6g.medium | 1 | 4 | 
| m6g.large | 2 | 10 | 
| m6g.xlarge | 3 | 20 | 
| m6g.2xlarge | 3 | 40 | 
| m6g.4xlarge | 7 | 60 | 
| m6g.8xlarge | 7 | 60 | 
| m6g.12xlarge | 7 | 60 | 
| m6g.16xlarge | 14 | 120 | 
| m6g.metal | 14 | 120 | 
| m6gd.medium | 1 | 4 | 
| m6gd.large | 2 | 10 | 
| m6gd.xlarge | 3 | 20 | 
| m6gd.2xlarge | 3 | 40 | 
| m6gd.4xlarge | 7 | 60 | 
| m6gd.8xlarge | 7 | 60 | 
| m6gd.12xlarge | 7 | 60 | 
| m6gd.16xlarge | 14 | 120 | 
| m6gd.metal | 14 | 120 | 
| m6i.large | 2 | 10 | 
| m6i.xlarge | 3 | 20 | 
| m6i.2xlarge | 3 | 40 | 
| m6i.4xlarge | 7 | 60 | 
| m6i.8xlarge | 7 | 90 | 
| m6i.12xlarge | 7 | 120 | 
| m6i.16xlarge | 14 | 120 | 
| m6i.24xlarge | 14 | 120 | 
| m6i.32xlarge | 14 | 120 | 
| m6i.metal | 14 | 120 | 
| m6id.large | 2 | 10 | 
| m6id.xlarge | 3 | 20 | 
| m6id.2xlarge | 3 | 40 | 
| m6id.4xlarge | 7 | 60 | 
| m6id.8xlarge | 7 | 90 | 
| m6id.12xlarge | 7 | 120 | 
| m6id.16xlarge | 14 | 120 | 
| m6id.24xlarge | 14 | 120 | 
| m6id.32xlarge | 14 | 120 | 
| m6id.metal | 14 | 120 | 
| m6idn.large | 2 | 10 | 
| m6idn.xlarge | 3 | 20 | 
| m6idn.2xlarge | 3 | 40 | 
| m6idn.4xlarge | 7 | 60 | 
| m6idn.8xlarge | 7 | 90 | 
| m6idn.12xlarge | 7 | 120 | 
| m6idn.16xlarge | 14 | 120 | 
| m6idn.24xlarge | 14 | 120 | 
| m6idn.32xlarge | 15 | 120 | 
| m6idn.metal | 15 | 120 | 
| m6in.large | 2 | 10 | 
| m6in.xlarge | 3 | 20 | 
| m6in.2xlarge | 3 | 40 | 
| m6in.4xlarge | 7 | 60 | 
| m6in.8xlarge | 7 | 90 | 
| m6in.12xlarge | 7 | 120 | 
| m6in.16xlarge | 14 | 120 | 
| m6in.24xlarge | 14 | 120 | 
| m6in.32xlarge | 15 | 120 | 
| m6in.metal | 15 | 120 | 
| m7a.medium | 1 | 4 | 
| m7a.large | 2 | 10 | 
| m7a.xlarge | 3 | 20 | 
| m7a.2xlarge | 3 | 40 | 
| m7a.4xlarge | 7 | 60 | 
| m7a.8xlarge | 7 | 90 | 
| m7a.12xlarge | 7 | 120 | 
| m7a.16xlarge | 14 | 120 | 
| m7a.24xlarge | 14 | 120 | 
| m7a.32xlarge | 14 | 120 | 
| m7a.48xlarge | 14 | 120 | 
| m7a.metal-48xl | 14 | 120 | 
| m7g.medium | 1 | 4 | 
| m7g.large | 2 | 10 | 
| m7g.xlarge | 3 | 20 | 
| m7g.2xlarge | 3 | 40 | 
| m7g.4xlarge | 7 | 60 | 
| m7g.8xlarge | 7 | 60 | 
| m7g.12xlarge | 7 | 60 | 
| m7g.16xlarge | 14 | 120 | 
| m7g.metal | 14 | 120 | 
| m7gd.medium | 1 | 4 | 
| m7gd.large | 2 | 10 | 
| m7gd.xlarge | 3 | 20 | 
| m7gd.2xlarge | 3 | 40 | 
| m7gd.4xlarge | 7 | 60 | 
| m7gd.8xlarge | 7 | 60 | 
| m7gd.12xlarge | 7 | 60 | 
| m7gd.16xlarge | 14 | 120 | 
| m7gd.metal | 14 | 120 | 
| m7i.large | 2 | 10 | 
| m7i.xlarge | 3 | 20 | 
| m7i.2xlarge | 3 | 40 | 
| m7i.4xlarge | 7 | 60 | 
| m7i.8xlarge | 7 | 90 | 
| m7i.12xlarge | 7 | 120 | 
| m7i.16xlarge | 14 | 120 | 
| m7i.24xlarge | 14 | 120 | 
| m7i.48xlarge | 14 | 120 | 
| m7i.metal-24xl | 14 | 120 | 
| m7i.metal-48xl | 14 | 120 | 
| m7i-flex.large | 2 | 4 | 
| m7i-flex.xlarge | 3 | 10 | 
| m7i-flex.2xlarge | 3 | 20 | 
| m7i-flex.4xlarge | 7 | 40 | 
| m7i-flex.8xlarge | 7 | 60 | 
| m7i-flex.12xlarge | 7 | 120 | 
| m7i-flex.16xlarge | 14 | 120 | 
| m8a.medium | 1 | 4 | 
| m8a.large | 2 | 10 | 
| m8a.xlarge | 3 | 20 | 
| m8a.2xlarge | 3 | 40 | 
| m8a.4xlarge | 7 | 60 | 
| m8a.8xlarge | 9 | 90 | 
| m8a.12xlarge | 11 | 120 | 
| m8a.16xlarge | 15 | 120 | 
| m8a.24xlarge | 15 | 120 | 
| m8a.48xlarge | 23 | 120 | 
| m8a.metal-24xl | 15 | 120 | 
| m8a.metal-48xl | 23 | 120 | 
| m8azn.medium | 2 | 4 | 
| m8azn.large | 3 | 10 | 
| m8azn.xlarge | 3 | 20 | 
| m8azn.3xlarge | 7 | 40 | 
| m8azn.6xlarge | 7 | 60 | 
| m8azn.12xlarge | 15 | 120 | 
| m8azn.24xlarge | 15 | 120 | 
| m8azn.metal-12xl | 15 | 120 | 
| m8azn.metal-24xl | 15 | 120 | 
| m8g.medium | 1 | 4 | 
| m8g.large | 2 | 10 | 
| m8g.xlarge | 3 | 20 | 
| m8g.2xlarge | 3 | 40 | 
| m8g.4xlarge | 7 | 60 | 
| m8g.8xlarge | 7 | 60 | 
| m8g.12xlarge | 7 | 60 | 
| m8g.16xlarge | 14 | 120 | 
| m8g.24xlarge | 14 | 120 | 
| m8g.48xlarge | 14 | 120 | 
| m8g.metal-24xl | 14 | 120 | 
| m8g.metal-48xl | 14 | 120 | 
| m8gb.medium | 1 | 4 | 
| m8gb.large | 2 | 10 | 
| m8gb.xlarge | 3 | 20 | 
| m8gb.2xlarge | 3 | 40 | 
| m8gb.4xlarge | 7 | 60 | 
| m8gb.8xlarge | 9 | 60 | 
| m8gb.12xlarge | 11 | 60 | 
| m8gb.16xlarge | 15 | 120 | 
| m8gb.24xlarge | 23 | 120 | 
| m8gb.48xlarge | 23 | 120 | 
| m8gb.metal-24xl | 23 | 120 | 
| m8gb.metal-48xl | 23 | 120 | 
| m8gd.medium | 1 | 4 | 
| m8gd.large | 2 | 10 | 
| m8gd.xlarge | 3 | 20 | 
| m8gd.2xlarge | 3 | 40 | 
| m8gd.4xlarge | 7 | 60 | 
| m8gd.8xlarge | 7 | 60 | 
| m8gd.12xlarge | 7 | 60 | 
| m8gd.16xlarge | 14 | 120 | 
| m8gd.24xlarge | 14 | 120 | 
| m8gd.48xlarge | 14 | 120 | 
| m8gd.metal-24xl | 14 | 120 | 
| m8gd.metal-48xl | 14 | 120 | 
| m8gn.medium | 1 | 4 | 
| m8gn.large | 2 | 10 | 
| m8gn.xlarge | 3 | 20 | 
| m8gn.2xlarge | 3 | 40 | 
| m8gn.4xlarge | 7 | 60 | 
| m8gn.8xlarge | 9 | 60 | 
| m8gn.12xlarge | 11 | 60 | 
| m8gn.16xlarge | 15 | 120 | 
| m8gn.24xlarge | 23 | 120 | 
| m8gn.48xlarge | 23 | 120 | 
| m8gn.metal-24xl | 23 | 120 | 
| m8gn.metal-48xl | 23 | 120 | 
| m8i.large | 2 | 10 | 
| m8i.xlarge | 3 | 20 | 
| m8i.2xlarge | 3 | 40 | 
| m8i.4xlarge | 7 | 60 | 
| m8i.8xlarge | 9 | 90 | 
| m8i.12xlarge | 11 | 120 | 
| m8i.16xlarge | 15 | 120 | 
| m8i.24xlarge | 15 | 120 | 
| m8i.32xlarge | 23 | 120 | 
| m8i.48xlarge | 23 | 120 | 
| m8i.96xlarge | 23 | 120 | 
| m8i.metal-48xl | 23 | 120 | 
| m8i.metal-96xl | 23 | 120 | 
| m8id.large | 2 | 10 | 
| m8id.xlarge | 3 | 20 | 
| m8id.2xlarge | 3 | 40 | 
| m8id.4xlarge | 7 | 60 | 
| m8id.8xlarge | 9 | 90 | 
| m8id.12xlarge | 11 | 120 | 
| m8id.16xlarge | 15 | 120 | 
| m8id.24xlarge | 15 | 120 | 
| m8id.32xlarge | 23 | 120 | 
| m8id.48xlarge | 23 | 120 | 
| m8id.96xlarge | 23 | 120 | 
| m8id.metal-48xl | 23 | 120 | 
| m8id.metal-96xl | 23 | 120 | 
| m8i-flex.large | 2 | 4 | 
| m8i-flex.xlarge | 3 | 10 | 
| m8i-flex.2xlarge | 3 | 20 | 
| m8i-flex.4xlarge | 7 | 40 | 
| m8i-flex.8xlarge | 9 | 60 | 
| m8i-flex.12xlarge | 11 | 120 | 
| m8i-flex.16xlarge | 15 | 120 | 
| mac2.metal | 7 | 12 | 
| mac2-m1ultra.metal | 7 | 12 | 
| mac2-m2.metal | 7 | 12 | 
| mac2-m2pro.metal | 7 | 12 | 
| mac-m4.metal | 7 | 12 | 
| mac-m4pro.metal | 7 | 12 | 

## 计算优化型
<a name="eni-branch-co"></a>


| 实例类型 | 没有 ENI 中继的任务限制 | 有 ENI 中继的任务限制 | 
| --- | --- | --- | 
| c5.large | 2 | 10 | 
| c5.xlarge | 3 | 20 | 
| c5.2xlarge | 3 | 40 | 
| c5.4xlarge | 7 | 60 | 
| c5.9xlarge | 7 | 60 | 
| c5.12xlarge | 7 | 60 | 
| c5.18xlarge | 14 | 120 | 
| c5.24xlarge | 14 | 120 | 
| c5a.large | 2 | 10 | 
| c5a.xlarge | 3 | 20 | 
| c5a.2xlarge | 3 | 40 | 
| c5a.4xlarge | 7 | 60 | 
| c5a.12xlarge | 7 | 60 | 
| c5a.16xlarge | 14 | 120 | 
| c5a.24xlarge | 14 | 120 | 
| c5ad.large | 2 | 10 | 
| c5ad.xlarge | 3 | 20 | 
| c5ad.2xlarge | 3 | 40 | 
| c5ad.4xlarge | 7 | 60 | 
| c5ad.12xlarge | 7 | 60 | 
| c5ad.16xlarge | 14 | 120 | 
| c5ad.24xlarge | 14 | 120 | 
| c5d.large | 2 | 10 | 
| c5d.xlarge | 3 | 20 | 
| c5d.2xlarge | 3 | 40 | 
| c5d.4xlarge | 7 | 60 | 
| c5d.9xlarge | 7 | 60 | 
| c5d.12xlarge | 7 | 60 | 
| c5d.18xlarge | 14 | 120 | 
| c5d.24xlarge | 14 | 120 | 
| c6a.large | 2 | 10 | 
| c6a.xlarge | 3 | 20 | 
| c6a.2xlarge | 3 | 40 | 
| c6a.4xlarge | 7 | 60 | 
| c6a.8xlarge | 7 | 90 | 
| c6a.12xlarge | 7 | 120 | 
| c6a.16xlarge | 14 | 120 | 
| c6a.24xlarge | 14 | 120 | 
| c6a.32xlarge | 14 | 120 | 
| c6a.48xlarge | 14 | 120 | 
| c6a.metal | 14 | 120 | 
| c6g.medium | 1 | 4 | 
| c6g.large | 2 | 10 | 
| c6g.xlarge | 3 | 20 | 
| c6g.2xlarge | 3 | 40 | 
| c6g.4xlarge | 7 | 60 | 
| c6g.8xlarge | 7 | 60 | 
| c6g.12xlarge | 7 | 60 | 
| c6g.16xlarge | 14 | 120 | 
| c6g.metal | 14 | 120 | 
| c6gd.medium | 1 | 4 | 
| c6gd.large | 2 | 10 | 
| c6gd.xlarge | 3 | 20 | 
| c6gd.2xlarge | 3 | 40 | 
| c6gd.4xlarge | 7 | 60 | 
| c6gd.8xlarge | 7 | 60 | 
| c6gd.12xlarge | 7 | 60 | 
| c6gd.16xlarge | 14 | 120 | 
| c6gd.metal | 14 | 120 | 
| c6gn.medium | 1 | 4 | 
| c6gn.large | 2 | 10 | 
| c6gn.xlarge | 3 | 20 | 
| c6gn.2xlarge | 3 | 40 | 
| c6gn.4xlarge | 7 | 60 | 
| c6gn.8xlarge | 7 | 60 | 
| c6gn.12xlarge | 7 | 60 | 
| c6gn.16xlarge | 14 | 120 | 
| c6i.large | 2 | 10 | 
| c6i.xlarge | 3 | 20 | 
| c6i.2xlarge | 3 | 40 | 
| c6i.4xlarge | 7 | 60 | 
| c6i.8xlarge | 7 | 90 | 
| c6i.12xlarge | 7 | 120 | 
| c6i.16xlarge | 14 | 120 | 
| c6i.24xlarge | 14 | 120 | 
| c6i.32xlarge | 14 | 120 | 
| c6i.metal | 14 | 120 | 
| c6id.large | 2 | 10 | 
| c6id.xlarge | 3 | 20 | 
| c6id.2xlarge | 3 | 40 | 
| c6id.4xlarge | 7 | 60 | 
| c6id.8xlarge | 7 | 90 | 
| c6id.12xlarge | 7 | 120 | 
| c6id.16xlarge | 14 | 120 | 
| c6id.24xlarge | 14 | 120 | 
| c6id.32xlarge | 14 | 120 | 
| c6id.metal | 14 | 120 | 
| c6in.large | 2 | 10 | 
| c6in.xlarge | 3 | 20 | 
| c6in.2xlarge | 3 | 40 | 
| c6in.4xlarge | 7 | 60 | 
| c6in.8xlarge | 7 | 90 | 
| c6in.12xlarge | 7 | 120 | 
| c6in.16xlarge | 14 | 120 | 
| c6in.24xlarge | 14 | 120 | 
| c6in.32xlarge | 15 | 120 | 
| c6in.metal | 15 | 120 | 
| c7a.medium | 1 | 4 | 
| c7a.large | 2 | 10 | 
| c7a.xlarge | 3 | 20 | 
| c7a.2xlarge | 3 | 40 | 
| c7a.4xlarge | 7 | 60 | 
| c7a.8xlarge | 7 | 90 | 
| c7a.12xlarge | 7 | 120 | 
| c7a.16xlarge | 14 | 120 | 
| c7a.24xlarge | 14 | 120 | 
| c7a.32xlarge | 14 | 120 | 
| c7a.48xlarge | 14 | 120 | 
| c7a.metal-48xl | 14 | 120 | 
| c7g.medium | 1 | 4 | 
| c7g.large | 2 | 10 | 
| c7g.xlarge | 3 | 20 | 
| c7g.2xlarge | 3 | 40 | 
| c7g.4xlarge | 7 | 60 | 
| c7g.8xlarge | 7 | 60 | 
| c7g.12xlarge | 7 | 60 | 
| c7g.16xlarge | 14 | 120 | 
| c7g.metal | 14 | 120 | 
| c7gd.medium | 1 | 4 | 
| c7gd.large | 2 | 10 | 
| c7gd.xlarge | 3 | 20 | 
| c7gd.2xlarge | 3 | 40 | 
| c7gd.4xlarge | 7 | 60 | 
| c7gd.8xlarge | 7 | 60 | 
| c7gd.12xlarge | 7 | 60 | 
| c7gd.16xlarge | 14 | 120 | 
| c7gd.metal | 14 | 120 | 
| c7gn.medium | 1 | 4 | 
| c7gn.large | 2 | 10 | 
| c7gn.xlarge | 3 | 20 | 
| c7gn.2xlarge | 3 | 40 | 
| c7gn.4xlarge | 7 | 60 | 
| c7gn.8xlarge | 7 | 60 | 
| c7gn.12xlarge | 7 | 60 | 
| c7gn.16xlarge | 14 | 120 | 
| c7gn.metal | 14 | 120 | 
| c7i.large | 2 | 10 | 
| c7i.xlarge | 3 | 20 | 
| c7i.2xlarge | 3 | 40 | 
| c7i.4xlarge | 7 | 60 | 
| c7i.8xlarge | 7 | 90 | 
| c7i.12xlarge | 7 | 120 | 
| c7i.16xlarge | 14 | 120 | 
| c7i.24xlarge | 14 | 120 | 
| c7i.48xlarge | 14 | 120 | 
| c7i.metal-24xl | 14 | 120 | 
| c7i.metal-48xl | 14 | 120 | 
| c7i-flex.large | 2 | 4 | 
| c7i-flex.xlarge | 3 | 10 | 
| c7i-flex.2xlarge | 3 | 20 | 
| c7i-flex.4xlarge | 7 | 40 | 
| c7i-flex.8xlarge | 7 | 60 | 
| c7i-flex.12xlarge | 7 | 120 | 
| c7i-flex.16xlarge | 14 | 120 | 
| c8a.medium | 1 | 4 | 
| c8a.large | 2 | 10 | 
| c8a.xlarge | 3 | 20 | 
| c8a.2xlarge | 3 | 40 | 
| c8a.4xlarge | 7 | 60 | 
| c8a.8xlarge | 9 | 90 | 
| c8a.12xlarge | 11 | 120 | 
| c8a.16xlarge | 15 | 120 | 
| c8a.24xlarge | 15 | 120 | 
| c8a.48xlarge | 23 | 120 | 
| c8a.metal-24xl | 15 | 120 | 
| c8a.metal-48xl | 23 | 120 | 
| c8g.medium | 1 | 4 | 
| c8g.large | 2 | 10 | 
| c8g.xlarge | 3 | 20 | 
| c8g.2xlarge | 3 | 40 | 
| c8g.4xlarge | 7 | 60 | 
| c8g.8xlarge | 7 | 60 | 
| c8g.12xlarge | 7 | 60 | 
| c8g.16xlarge | 14 | 120 | 
| c8g.24xlarge | 14 | 120 | 
| c8g.48xlarge | 14 | 120 | 
| c8g.metal-24xl | 14 | 120 | 
| c8g.metal-48xl | 14 | 120 | 
| c8gb.medium | 1 | 4 | 
| c8gb.large | 2 | 10 | 
| c8gb.xlarge | 3 | 20 | 
| c8gb.2xlarge | 3 | 40 | 
| c8gb.4xlarge | 7 | 60 | 
| c8gb.8xlarge | 9 | 60 | 
| c8gb.12xlarge | 11 | 60 | 
| c8gb.16xlarge | 15 | 120 | 
| c8gb.24xlarge | 23 | 120 | 
| c8gb.48xlarge | 23 | 120 | 
| c8gb.metal-24xl | 23 | 120 | 
| c8gb.metal-48xl | 23 | 120 | 
| c8gd.medium | 1 | 4 | 
| c8gd.large | 2 | 10 | 
| c8gd.xlarge | 3 | 20 | 
| c8gd.2xlarge | 3 | 40 | 
| c8gd.4xlarge | 7 | 60 | 
| c8gd.8xlarge | 7 | 60 | 
| c8gd.12xlarge | 7 | 60 | 
| c8gd.16xlarge | 14 | 120 | 
| c8gd.24xlarge | 14 | 120 | 
| c8gd.48xlarge | 14 | 120 | 
| c8gd.metal-24xl | 14 | 120 | 
| c8gd.metal-48xl | 14 | 120 | 
| c8gn.medium | 1 | 4 | 
| c8gn.large | 2 | 10 | 
| c8gn.xlarge | 3 | 20 | 
| c8gn.2xlarge | 3 | 40 | 
| c8gn.4xlarge | 7 | 60 | 
| c8gn.8xlarge | 9 | 60 | 
| c8gn.12xlarge | 11 | 60 | 
| c8gn.16xlarge | 15 | 120 | 
| c8gn.24xlarge | 23 | 120 | 
| c8gn.48xlarge | 23 | 120 | 
| c8gn.metal-24xl | 23 | 120 | 
| c8gn.metal-48xl | 23 | 120 | 
| c8i.large | 2 | 10 | 
| c8i.xlarge | 3 | 20 | 
| c8i.2xlarge | 3 | 40 | 
| c8i.4xlarge | 7 | 60 | 
| c8i.8xlarge | 9 | 90 | 
| c8i.12xlarge | 11 | 120 | 
| c8i.16xlarge | 15 | 120 | 
| c8i.24xlarge | 15 | 120 | 
| c8i.32xlarge | 23 | 120 | 
| c8i.48xlarge | 23 | 120 | 
| c8i.96xlarge | 23 | 120 | 
| c8i.metal-48xl | 23 | 120 | 
| c8i.metal-96xl | 23 | 120 | 
| c8id.large | 2 | 10 | 
| c8id.xlarge | 3 | 20 | 
| c8id.2xlarge | 3 | 40 | 
| c8id.4xlarge | 7 | 60 | 
| c8id.8xlarge | 9 | 90 | 
| c8id.12xlarge | 11 | 120 | 
| c8id.16xlarge | 15 | 120 | 
| c8id.24xlarge | 15 | 120 | 
| c8id.32xlarge | 23 | 120 | 
| c8id.48xlarge | 23 | 120 | 
| c8id.96xlarge | 23 | 120 | 
| c8id.metal-48xl | 23 | 120 | 
| c8id.metal-96xl | 23 | 120 | 
| c8i-flex.large | 2 | 4 | 
| c8i-flex.xlarge | 3 | 10 | 
| c8i-flex.2xlarge | 3 | 20 | 
| c8i-flex.4xlarge | 7 | 40 | 
| c8i-flex.8xlarge | 9 | 60 | 
| c8i-flex.12xlarge | 11 | 120 | 
| c8i-flex.16xlarge | 15 | 120 | 

## 内存优化型
<a name="eni-branch-mo"></a>


| 实例类型 | 没有 ENI 中继的任务限制 | 有 ENI 中继的任务限制 | 
| --- | --- | --- | 
| r5.large | 2 | 10 | 
| r5.xlarge | 3 | 20 | 
| r5.2xlarge | 3 | 40 | 
| r5.4xlarge | 7 | 60 | 
| r5.12xlarge | 7 | 60 | 
| r5.16xlarge | 14 | 120 | 
| r5.24xlarge | 14 | 120 | 
| r5a.large | 2 | 10 | 
| r5a.xlarge | 3 | 20 | 
| r5a.2xlarge | 3 | 40 | 
| r5a.4xlarge | 7 | 60 | 
| r5a.8xlarge | 7 | 60 | 
| r5a.12xlarge | 7 | 60 | 
| r5a.16xlarge | 14 | 120 | 
| r5a.24xlarge | 14 | 120 | 
| r5ad.large | 2 | 10 | 
| r5ad.xlarge | 3 | 20 | 
| r5ad.2xlarge | 3 | 40 | 
| r5ad.4xlarge | 7 | 60 | 
| r5ad.8xlarge | 7 | 60 | 
| r5ad.12xlarge | 7 | 60 | 
| r5ad.16xlarge | 14 | 120 | 
| r5ad.24xlarge | 14 | 120 | 
| r5b.16xlarge | 14 | 120 | 
| r5d.large | 2 | 10 | 
| r5d.xlarge | 3 | 20 | 
| r5d.2xlarge | 3 | 40 | 
| r5d.4xlarge | 7 | 60 | 
| r5d.8xlarge | 7 | 60 | 
| r5d.12xlarge | 7 | 60 | 
| r5d.16xlarge | 14 | 120 | 
| r5d.24xlarge | 14 | 120 | 
| r5dn.16xlarge | 14 | 120 | 
| r6a.large | 2 | 10 | 
| r6a.xlarge | 3 | 20 | 
| r6g.2xlarge | 3 | 40 | 
| r6a.4xlarge | 7 | 60 | 
| r6a.8xlarge | 7 | 90 | 
| r6a.12xlarge | 7 | 120 | 
| r6a.16xlarge | 14 | 120 | 
| r6a.24xlarge | 14 | 120 | 
| r6a.32xlarge | 14 | 120 | 
| r6a.48xlarge | 14 | 120 | 
| r6a.metal | 14 | 120 | 
| r6g.medium | 1 | 4 | 
| r6g.large | 2 | 10 | 
| r6g.xlarge | 3 | 20 | 
| r6g.2xlarge | 3 | 40 | 
| r6g.4xlarge | 7 | 60 | 
| r6g.8xlarge | 7 | 60 | 
| r6g.12xlarge | 7 | 60 | 
| r6g.16xlarge | 14 | 120 | 
| r6g.metal | 14 | 120 | 
| r6gd.medium | 1 | 4 | 
| r6gd.large | 2 | 10 | 
| r6gd.xlarge | 3 | 20 | 
| r6gd.2xlarge | 3 | 40 | 
| r6gd.4xlarge | 7 | 60 | 
| r6gd.8xlarge | 7 | 60 | 
| r6gd.12xlarge | 7 | 60 | 
| r6gd.16xlarge | 14 | 120 | 
| r6gd.metal | 14 | 120 | 
| r6i.large | 2 | 10 | 
| r6i.xlarge | 3 | 20 | 
| r6i.2xlarge | 3 | 40 | 
| r6i.4xlarge | 7 | 60 | 
| r6i.8xlarge | 7 | 90 | 
| r6i.12xlarge | 7 | 120 | 
| r6i.16xlarge | 14 | 120 | 
| r6i.24xlarge | 14 | 120 | 
| r6i.32xlarge | 14 | 120 | 
| r6i.metal | 14 | 120 | 
| r6id.large | 2 | 10 | 
| r6id.xlarge | 3 | 20 | 
| r6gd.2xlarge | 3 | 40 | 
| r6id.4xlarge | 7 | 60 | 
| r6id.8xlarge | 7 | 90 | 
| r6id.12xlarge | 7 | 120 | 
| r6id.16xlarge | 14 | 120 | 
| r6id.24xlarge | 14 | 120 | 
| r6id.32xlarge | 14 | 120 | 
| r6id.metal | 14 | 120 | 
| r6idn.large | 2 | 10 | 
| r6idn.xlarge | 3 | 20 | 
| r6idn.2xlarge | 3 | 40 | 
| r6idn.4xlarge | 7 | 60 | 
| r6idn.8xlarge | 7 | 90 | 
| r6idn.12xlarge | 7 | 120 | 
| r6idn.16xlarge | 14 | 120 | 
| r6idn.24xlarge | 14 | 120 | 
| r6idn.32xlarge | 15 | 120 | 
| r6idn.metal | 15 | 120 | 
| r6in.large | 2 | 10 | 
| r6in.xlarge | 3 | 20 | 
| r6in.2xlarge | 3 | 40 | 
| r6in.4xlarge | 7 | 60 | 
| r6in.8xlarge | 7 | 90 | 
| r6in.12xlarge | 7 | 120 | 
| r6in.16xlarge | 14 | 120 | 
| r6in.24xlarge | 14 | 120 | 
| r6in.32xlarge | 15 | 120 | 
| r6in.metal | 15 | 120 | 
| r7a.medium | 1 | 4 | 
| r7a.large | 2 | 10 | 
| r7a.xlarge | 3 | 20 | 
| r7a.2xlarge | 3 | 40 | 
| r7a.4xlarge | 7 | 60 | 
| r7a.8xlarge | 7 | 90 | 
| r7a.12xlarge | 7 | 120 | 
| r7a.16xlarge | 14 | 120 | 
| r7a.24xlarge | 14 | 120 | 
| r7a.32xlarge | 14 | 120 | 
| r7a.48xlarge | 14 | 120 | 
| r7a.metal-48xl | 14 | 120 | 
| r7g.medium | 1 | 4 | 
| r7g.large | 2 | 10 | 
| r7g.xlarge | 3 | 20 | 
| r7g.2xlarge | 3 | 40 | 
| r7g.4xlarge | 7 | 60 | 
| r7g.8xlarge | 7 | 60 | 
| r7g.12xlarge | 7 | 60 | 
| r7g.16xlarge | 14 | 120 | 
| r7g.metal | 14 | 120 | 
| r7gd.medium | 1 | 4 | 
| r7gd.large | 2 | 10 | 
| r7gd.xlarge | 3 | 20 | 
| r7gd.2xlarge | 3 | 40 | 
| r7gd.4xlarge | 7 | 60 | 
| r7gd.8xlarge | 7 | 60 | 
| r7gd.12xlarge | 7 | 60 | 
| r7gd.16xlarge | 14 | 120 | 
| r7gd.metal | 14 | 120 | 
| r7i.large | 2 | 10 | 
| r7i.xlarge | 3 | 20 | 
| r7i.2xlarge | 3 | 40 | 
| r7i.4xlarge | 7 | 60 | 
| r7i.8xlarge | 7 | 90 | 
| r7i.12xlarge | 7 | 120 | 
| r7i.16xlarge | 14 | 120 | 
| r7i.24xlarge | 14 | 120 | 
| r7i.48xlarge | 14 | 120 | 
| r7i.metal-24xl | 14 | 120 | 
| r7i.metal-48xl | 14 | 120 | 
| r7iz.large | 2 | 10 | 
| r7iz.xlarge | 3 | 20 | 
| r7iz.2xlarge | 3 | 40 | 
| r7iz.4xlarge | 7 | 60 | 
| r7iz.8xlarge | 7 | 90 | 
| r7iz.12xlarge | 7 | 120 | 
| r7iz.16xlarge | 14 | 120 | 
| r7iz.32xlarge | 14 | 120 | 
| r7iz.metal-16xl | 14 | 120 | 
| r7iz.metal-32xl | 14 | 120 | 
| r8a.medium | 1 | 4 | 
| r8a.large | 2 | 10 | 
| r8a.xlarge | 3 | 20 | 
| r8a.2xlarge | 3 | 40 | 
| r8a.4xlarge | 7 | 60 | 
| r8a.8xlarge | 9 | 90 | 
| r8a.12xlarge | 11 | 120 | 
| r8a.16xlarge | 15 | 120 | 
| r8a.24xlarge | 15 | 120 | 
| r8a.48xlarge | 23 | 120 | 
| r8a.metal-24xl | 15 | 120 | 
| r8a.metal-48xl | 23 | 120 | 
| r8g.medium | 1 | 4 | 
| r8g.large | 2 | 10 | 
| r8g.xlarge | 3 | 20 | 
| r8g.2xlarge | 3 | 40 | 
| r8g.4xlarge | 7 | 60 | 
| r8g.8xlarge | 7 | 60 | 
| r8g.12xlarge | 7 | 60 | 
| r8g.16xlarge | 14 | 120 | 
| r8g.24xlarge | 14 | 120 | 
| r8g.48xlarge | 14 | 120 | 
| r8g.metal-24xl | 14 | 120 | 
| r8g.metal-48xl | 14 | 120 | 
| r8gb.medium | 1 | 4 | 
| r8gb.large | 2 | 10 | 
| r8gb.xlarge | 3 | 20 | 
| r8gb.2xlarge | 3 | 40 | 
| r8gb.4xlarge | 7 | 60 | 
| r8gb.8xlarge | 9 | 60 | 
| r8gb.12xlarge | 11 | 60 | 
| r8gb.16xlarge | 15 | 120 | 
| r8gb.24xlarge | 23 | 120 | 
| r8gb.48xlarge | 23 | 120 | 
| r8gb.metal-24xl | 23 | 120 | 
| r8gb.metal-48xl | 23 | 120 | 
| r8gd.medium | 1 | 4 | 
| r8gd.large | 2 | 10 | 
| r8gd.xlarge | 3 | 20 | 
| r8gd.2xlarge | 3 | 40 | 
| r8gd.4xlarge | 7 | 60 | 
| r8gd.8xlarge | 7 | 60 | 
| r8gd.12xlarge | 7 | 60 | 
| r8gd.16xlarge | 14 | 120 | 
| r8gd.24xlarge | 14 | 120 | 
| r8gd.48xlarge | 14 | 120 | 
| r8gd.metal-24xl | 14 | 120 | 
| r8gd.metal-48xl | 14 | 120 | 
| r8gn.medium | 1 | 4 | 
| r8gn.large | 2 | 10 | 
| r8gn.xlarge | 3 | 20 | 
| r8gn.2xlarge | 3 | 40 | 
| r8gn.4xlarge | 7 | 60 | 
| r8gn.8xlarge | 9 | 60 | 
| r8gn.12xlarge | 11 | 60 | 
| r8gn.16xlarge | 15 | 120 | 
| r8gn.24xlarge | 23 | 120 | 
| r8gn.48xlarge | 23 | 120 | 
| r8gn.metal-24xl | 23 | 120 | 
| r8gn.metal-48xl | 23 | 120 | 
| r8i.large | 2 | 10 | 
| r8i.xlarge | 3 | 20 | 
| r8i.2xlarge | 3 | 40 | 
| r8i.4xlarge | 7 | 60 | 
| r8i.8xlarge | 9 | 90 | 
| r8i.12xlarge | 11 | 120 | 
| r8i.16xlarge | 15 | 120 | 
| r8i.24xlarge | 15 | 120 | 
| r8i.32xlarge | 23 | 120 | 
| r8i.48xlarge | 23 | 120 | 
| r8i.96xlarge | 23 | 120 | 
| r8i.metal-48xl | 23 | 120 | 
| r8i.metal-96xl | 23 | 120 | 
| r8id.large | 2 | 10 | 
| r8id.xlarge | 3 | 20 | 
| r8id.2xlarge | 3 | 40 | 
| r8id.4xlarge | 7 | 60 | 
| r8id.8xlarge | 9 | 90 | 
| r8id.12xlarge | 11 | 120 | 
| r8id.16xlarge | 15 | 120 | 
| r8id.24xlarge | 15 | 120 | 
| r8id.32xlarge | 23 | 120 | 
| r8id.48xlarge | 23 | 120 | 
| r8id.96xlarge | 23 | 120 | 
| r8id.metal-48xl | 23 | 120 | 
| r8id.metal-96xl | 23 | 120 | 
| r8i-flex.large | 2 | 4 | 
| r8i-flex.xlarge | 3 | 10 | 
| r8i-flex.2xlarge | 3 | 20 | 
| r8i-flex.4xlarge | 7 | 40 | 
| r8i-flex.8xlarge | 9 | 60 | 
| r8i-flex.12xlarge | 11 | 120 | 
| r8i-flex.16xlarge | 15 | 120 | 
| u-3tb1.56xlarge | 7 | 12 | 
| u-6tb1.56xlarge | 14 | 12 | 
| u-18tb1.112xlarge | 14 | 12 | 
| u-18tb1.metal | 14 | 12 | 
| u-24tb1.112xlarge | 14 | 12 | 
| u-24tb1.metal | 14 | 12 | 
| u7i-6tb.112xlarge | 14 | 120 | 
| u7i-8tb.112xlarge | 14 | 120 | 
| u7i-12tb.224xlarge | 14 | 120 | 
| u7in-16tb.224xlarge | 15 | 120 | 
| u7in-24tb.224xlarge | 15 | 120 | 
| u7in-32tb.224xlarge | 15 | 120 | 
| u7inh-32tb.480xlarge | 15 | 120 | 
| x2gd.medium | 1 | 10 | 
| x2gd.large | 2 | 10 | 
| x2gd.xlarge | 3 | 20 | 
| x2gd.2xlarge | 3 | 40 | 
| x2gd.4xlarge | 7 | 60 | 
| x2gd.8xlarge | 7 | 60 | 
| x2gd.12xlarge | 7 | 60 | 
| x2gd.16xlarge | 14 | 120 | 
| x2gd.metal | 14 | 120 | 
| x2idn.16xlarge | 14 | 120 | 
| x2idn.24xlarge | 14 | 120 | 
| x2idn.32xlarge | 14 | 120 | 
| x2idn.metal | 14 | 120 | 
| x2iedn.xlarge | 3 | 13 | 
| x2iedn.2xlarge | 3 | 29 | 
| x2iedn.4xlarge | 7 | 60 | 
| x2iedn.8xlarge | 7 | 120 | 
| x2iedn.16xlarge | 14 | 120 | 
| x2iedn.24xlarge | 14 | 120 | 
| x2iedn.32xlarge | 14 | 120 | 
| x2iedn.metal | 14 | 120 | 
| x2iezn.2xlarge | 3 | 64 | 
| x2iezn.4xlarge | 7 | 120 | 
| x2iezn.6xlarge | 7 | 120 | 
| x2iezn.8xlarge | 7 | 120 | 
| x2iezn.12xlarge | 14 | 120 | 
| x2iezn.metal | 14 | 120 | 
| x8g.medium | 1 | 4 | 
| x8g.large | 2 | 10 | 
| x8g.xlarge | 3 | 20 | 
| x8g.2xlarge | 3 | 40 | 
| x8g.4xlarge | 7 | 60 | 
| x8g.8xlarge | 7 | 60 | 
| x8g.12xlarge | 7 | 60 | 
| x8g.16xlarge | 14 | 120 | 
| x8g.24xlarge | 14 | 120 | 
| x8g.48xlarge | 14 | 120 | 
| x8g.metal-24xl | 14 | 120 | 
| x8g.metal-48xl | 14 | 120 | 
| x8aedz.large | 3 | 10 | 
| x8aedz.xlarge | 3 | 20 | 
| x8aedz.3xlarge | 7 | 40 | 
| x8aedz.6xlarge | 7 | 60 | 
| x8aedz.12xlarge | 15 | 120 | 
| x8aedz.24xlarge | 15 | 120 | 
| x8aedz.metal-12xl | 15 | 120 | 
| x8aedz.metal-24xl | 15 | 120 | 
| x8i.large | 2 | 10 | 
| x8i.xlarge | 3 | 20 | 
| x8i.2xlarge | 3 | 40 | 
| x8i.4xlarge | 7 | 60 | 
| x8i.8xlarge | 9 | 90 | 
| x8i.12xlarge | 11 | 120 | 
| x8i.16xlarge | 15 | 120 | 
| x8i.24xlarge | 15 | 120 | 
| x8i.32xlarge | 23 | 120 | 
| x8i.48xlarge | 23 | 120 | 
| x8i.64xlarge | 23 | 120 | 
| x8i.96xlarge | 23 | 120 | 
| x8i.metal-48xl | 23 | 120 | 
| x8i.metal-96xl | 23 | 120 | 

## 存储优化
<a name="eni-branch-so"></a>


| 实例类型 | 没有 ENI 中继的任务限制 | 有 ENI 中继的任务限制 | 
| --- | --- | --- | 
| i4g.large | 2 | 10 | 
| i4g.xlarge | 3 | 20 | 
| i4g.2xlarge | 3 | 40 | 
| i4g.4xlarge | 7 | 60 | 
| i4g.8xlarge | 7 | 60 | 
| i4g.16xlarge | 14 | 120 | 
| i4i.xlarge | 3 | 8 | 
| i4i.2xlarge | 3 | 28 | 
| i4i.4xlarge | 7 | 58 | 
| i4i.8xlarge | 7 | 118 | 
| i4i.12xlarge | 7 | 118 | 
| i4i.16xlarge | 14 | 248 | 
| i4i.24xlarge | 14 | 118 | 
| i4i.32xlarge | 14 | 498 | 
| i4i.metal | 14 | 498 | 
| i7i.large | 2 | 10 | 
| i7i.xlarge | 3 | 20 | 
| i7i.2xlarge | 3 | 40 | 
| i7i.4xlarge | 7 | 60 | 
| i7i.8xlarge | 7 | 90 | 
| i7i.12xlarge | 7 | 90 | 
| i7i.16xlarge | 14 | 120 | 
| i7i.24xlarge | 14 | 120 | 
| i7i.48xlarge | 14 | 120 | 
| i7i.metal-24xl | 14 | 120 | 
| i7i.metal-48xl | 14 | 120 | 
| i7ie.large | 2 | 20 | 
| i7ie.xlarge | 3 | 29 | 
| i7ie.2xlarge | 3 | 29 | 
| i7ie.3xlarge | 3 | 29 | 
| i7ie.6xlarge | 7 | 60 | 
| i7ie.12xlarge | 7 | 60 | 
| i7ie.18xlarge | 14 | 120 | 
| i7ie.24xlarge | 14 | 120 | 
| i7ie.48xlarge | 14 | 120 | 
| i7ie.metal-24xl | 14 | 120 | 
| i7ie.metal-48xl | 14 | 120 | 
| i8g.large | 2 | 10 | 
| i8g.xlarge | 3 | 20 | 
| i8g.2xlarge | 3 | 40 | 
| i8g.4xlarge | 7 | 60 | 
| i8g.8xlarge | 7 | 60 | 
| i8g.12xlarge | 7 | 60 | 
| i8g.16xlarge | 14 | 120 | 
| i8g.24xlarge | 14 | 120 | 
| i8g.48xlarge | 14 | 120 | 
| i8g.metal-24xl | 14 | 120 | 
| i8g.metal-48xl | 14 | 120 | 
| i8ge.large | 2 | 20 | 
| i8ge.xlarge | 3 | 29 | 
| i8ge.2xlarge | 3 | 29 | 
| i8ge.3xlarge | 5 | 29 | 
| i8ge.6xlarge | 9 | 60 | 
| i8ge.12xlarge | 11 | 60 | 
| i8ge.18xlarge | 15 | 120 | 
| i8ge.24xlarge | 15 | 120 | 
| i8ge.48xlarge | 23 | 120 | 
| i8ge.metal-24xl | 15 | 120 | 
| i8ge.metal-48xl | 23 | 120 | 
| im4gn.large | 2 | 10 | 
| im4gn.xlarge | 3 | 20 | 
| im4gn.2xlarge | 3 | 40 | 
| im4gn.4xlarge | 7 | 60 | 
| im4gn.8xlarge | 7 | 60 | 
| im4gn.16xlarge | 14 | 120 | 
| is4gen.medium | 1 | 4 | 
| is4gen.large | 2 | 10 | 
| is4gen.xlarge | 3 | 20 | 
| is4gen.2xlarge | 3 | 40 | 
| is4gen.4xlarge | 7 | 60 | 
| is4gen.8xlarge | 7 | 60 | 

## 加速计算型
<a name="eni-branch-ac"></a>


| 实例类型 | 没有 ENI 中继的任务限制 | 有 ENI 中继的任务限制 | 
| --- | --- | --- | 
| dl1.24xlarge | 59 | 120 | 
| dl2q.24xlarge | 14 | 120 | 
| f2.6xlarge | 7 | 90 | 
| f2.12xlarge | 7 | 120 | 
| f2.48xlarge | 14 | 120 | 
| g4ad.xlarge | 1 | 12 | 
| g4ad.2xlarge | 1 | 12 | 
| g4ad.4xlarge | 2 | 12 | 
| g4ad.8xlarge | 3 | 12 | 
| g4ad.16xlarge | 7 | 12 | 
| g5.xlarge | 3 | 6 | 
| g5.2xlarge | 3 | 19 | 
| g5.4xlarge | 7 | 40 | 
| g5.8xlarge | 7 | 90 | 
| g5.12xlarge | 14 | 120 | 
| g5.16xlarge | 7 | 120 | 
| g5.24xlarge | 14 | 120 | 
| g5.48xlarge | 6 | 120 | 
| g5g.xlarge | 3 | 20 | 
| g5g.2xlarge | 3 | 40 | 
| g5g.4xlarge | 7 | 60 | 
| g5g.8xlarge | 7 | 60 | 
| g5g.16xlarge | 14 | 120 | 
| g5g.metal | 14 | 120 | 
| g6.xlarge | 3 | 20 | 
| g6.2xlarge | 3 | 40 | 
| g6.4xlarge | 7 | 60 | 
| g6.8xlarge | 7 | 90 | 
| g6.12xlarge | 7 | 120 | 
| g6.16xlarge | 14 | 120 | 
| g6.24xlarge | 14 | 120 | 
| g6.48xlarge | 14 | 120 | 
| g6e.xlarge | 3 | 20 | 
| g6e.2xlarge | 3 | 40 | 
| g6e.4xlarge | 7 | 60 | 
| g6e.8xlarge | 7 | 90 | 
| g6e.12xlarge | 9 | 120 | 
| g6e.16xlarge | 14 | 120 | 
| g6e.24xlarge | 19 | 120 | 
| g6e.48xlarge | 39 | 120 | 
| g6f.large | 1 | 10 | 
| g6f.xlarge | 3 | 20 | 
| g6f.2xlarge | 3 | 40 | 
| g6f.4xlarge | 7 | 60 | 
| gr6.4xlarge | 7 | 60 | 
| gr6.8xlarge | 7 | 90 | 
| gr6f.4xlarge | 7 | 60 | 
| g7e.2xlarge | 3 | 242 | 
| g7e.4xlarge | 7 | 242 | 
| g7e.8xlarge | 7 | 242 | 
| g7e.12xlarge | 9 | 242 | 
| g7e.24xlarge | 19 | 242 | 
| g7e.48xlarge | 39 | 242 | 
| inf2.xlarge | 3 | 20 | 
| inf2.8xlarge | 7 | 90 | 
| inf2.24xlarge | 14 | 120 | 
| inf2.48xlarge | 14 | 120 | 
| p4d.24xlarge | 59 | 120 | 
| p4de.24xlarge | 59 | 120 | 
| p5.4xLarge | 3 | 60 | 
| p5.48xlarge | 63 | 242 | 
| p5e.48xlarge | 63 | 242 | 
| p5en.48xlarge | 63 | 242 | 
| p6-b200.48xlarge | 31 | 242 | 
| p6-b300.48xlarge | 67 | 242 | 
| p6e-gb200.36xlarge | 38 | 120 | 
| trn1.2xlarge | 3 | 19 | 
| trn1.32xlarge | 39 | 120 | 
| trn1n.32xlarge | 79 | 242 | 
| trn2.3xlarge | 1 | 14 | 
| trn2.48xlarge | 31 | 242 | 
| trn2u.48xlarge | 31 | 242 | 
| vt1.3xlarge | 3 | 40 | 
| vt1.6xlarge | 7 | 60 | 
| vt1.24xlarge | 14 | 120 | 

## 高性能计算
<a name="eni-branch-hpc"></a>


| 实例类型 | 没有 ENI 中继的任务限制 | 有 ENI 中继的任务限制 | 
| --- | --- | --- | 
| hpc6a.48xlarge | 1 | 120 | 
| hpc6id.32xlarge | 1 | 120 | 
| hpc7g.4xlarge | 3 | 120 | 
| hpc7g.8xlarge | 3 | 120 | 
| hpc7g.16xlarge | 3 | 120 | 
| hpc8a.96xlarge | 3 | -2 | 

# 预留 Amazon ECS Linux 容器实例内存
<a name="memory-management"></a>

当 Amazon ECS 容器代理将容器实例注册到集群中时，代理必须确定容器实例可为任务预留的内存量。由于平台内存开销和系统内核占用的内存，此数量不同于 Amazon EC2 实例所标示的已安装内存量。例如，`m4.large` 实例具有 8GiB 的已安装内存。但是，当容器实例注册时，这并不总是转换为可用于任务的 8192MiB 内存。

## ECS 托管实例内存资源确定
<a name="ecs-mi-memory-calculation"></a>

Amazon ECS 托管实例采用分层方法来确定任务的内存资源要求。与依赖 Docker 内存自省的 ECS on EC2 不同，ECS 托管实例在调度决策期间直接从任务有效载荷计算内存需求。

当 ECS 托管实例代理收到任务时，它会按照以下优先级顺序计算内存需求：

1. **任务级内存（最高优先级）**：如果在任务定义中指定了任务级内存，则代理直接使用此值。这优先于所有容器级内存设置。

1. **容器级内存总和（回退）**：如果未指定任务级内存（或为 0），代理会对任务中所有容器的内存需求进行求和。对于每个容器，它使用：

   1. *内存预留（软限制）*：如果容器在其配置中指定了 `memoryReservation`，则代理会使用此值。

   1. *容器内存（硬限制）*：如果未指定 `memoryReservation`，则 代理将使用容器的 `memory` 字段。

**Example 指定的任务级内存**  
当指定任务级内存时，其优先级高于容器级设置：  

```
{
  "family": "my-task",
  "memory": "2048",
  "containerDefinitions": [
    {
      "name": "container1",
      "memory": 1024,
      "memoryReservation": 512
    }
  ]
}
```
代理预留 2048 MiB（任务级内存优先）。

**Example 具有预留的容器级内存**  
当未指定任务级内存时，代理会计算容器内存需求的总和：  

```
{
  "family": "my-task",
  "containerDefinitions": [
    {
      "name": "container1",
      "memory": 1024,
      "memoryReservation": 512
    },
    {
      "name": "container2",
      "memory": 512
    }
  ]
}
```
代理预留 512 MiB（容器 1 预留）\$1 512 MiB（容器 2 内存）= 总计 1024 MiB。

ECS 托管实例代理分三个阶段执行内存计算：

1. **任务接收**：当来自 ECS 控制面板的任务有效载荷到达时，代理会立即计算所需的内存。

1. **资源存储**：计算出的内存需求存储在任务模型中，以便稍后在资源核算操作中使用。

1. **计划决策**：在接受任务之前，代理会检查是否有足够的内存可用。如果可用内存不足，则任务将被拒绝，并保留在 ECS 服务队列中，直到资源可用为止。

**注意**  
与 ECS on EC2 不同，ECS 托管实例不使用 `ECS_RESERVED_MEMORY` 配置变量。系统进程的内存预留通过底层平台的资源管理处理，代理根据任务定义执行准确的资源核算。

 对于 ECS on EC2，Amazon ECS 容器代理提供配置变量 `ECS_RESERVED_MEMORY`，您可以使用该变量从分配给您任务的池中移除指定 MiB 数的内存。这可以有效地为关键系统进程预留该内存。

如果您的任务占用容器实例上的所有内存，则您的任务可能会与关键系统进程争夺内存，并可能引起系统故障。

例如，如果您在容器代理配置文件中指定 `ECS_RESERVED_MEMORY=256`，则代理会为该实例注册总内存减去 256 MiB 后得到的内存量，这 256 MiB 内存无法由 ECS 任务分配。有关代理配置变量以及如何设置这些变量的更多信息，请参阅[Amazon ECS 容器代理配置](ecs-agent-config.md)和[引导启动 Amazon ECS Linux 容器实例以传递数据](bootstrap_container_instance.md)。

如果为任务指定 8192 MiB，并且没有任何容器实例具有 8192 MiB 或以上的可用内存来满足此要求，则任务无法放置在您的集群中。如果使用托管计算环境，则 AWS Batch 必须启动更大的实例类型来满足该要求。

Amazon ECS 容器代理使用 Docker `ReadMemInfo()` 函数来查询可用于操作系统的总内存。Linux 和 Windows 都提供了用来确定总内存的命令行实用程序。

**Example ：确定 Linux 总内存**  
**free** 命令可返回操作系统识别的总内存。  

```
$ free -b
```
运行经 Amazon ECS 优化的 Amazon Linux AMI 的 `m4.large` 实例的示例输出。  

```
             total       used       free     shared    buffers     cached
Mem:    8373026816  348180480 8024846336      90112   25534464  205418496
-/+ buffers/cache:  117227520 8255799296
```
此实例具有 8373026816 字节的总内存，这表示有 7985MiB 内存可用于任务。

**Example ：确定 Windows 总内存**  
**wmic** 命令可返回操作系统识别的总内存。  

```
C:\> wmic ComputerSystem get TotalPhysicalMemory
```
运行经 Amazon ECS 优化的 Windows Server AMI 的 `m4.large` 实例的示例输出。  

```
TotalPhysicalMemory
8589524992
```
此实例具有 8589524992 字节的总内存，这表示有 8191MiB 内存可用于任务。

## 查看容器实例内存
<a name="viewing-memory"></a>

您可以在 Amazon ECS 控制台中（或使用 [DescribeContainerInstances](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeContainerInstances.html) API 操作）查看容器实例注册的内存量。如果您试图通过为特定实例类型的任务提供尽可能多的内存来最大限度地提高资源利用率，则可以观察容器实例的可用内存，然后为您的任务分配足够的内存。

**查看容器实例内存**

1. 在 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2) 打开控制台。

1. 在导航窗格中，选择**集群**，然后选择托管您的容器实例的集群。

1. 选择**基础设施**，然后在容器实例下选择容器实例。

1. **资源**部分显示了容器实例的已注册内存和可用内存。

   **注册的**内存值是容器实例首次启动时向 Amazon ECS 注册的值，**可用**内存值是尚未分配给任务的值。

# 使用 AWS Systems Manager 远程管理 Amazon ECS 容器实例
<a name="ec2-run-command"></a>

您可以使用 AWS Systems Manager (Systems Manager) 中的 Run Command 功能安全地远程管理 Amazon ECS 容器实例的配置。Run Command 提供了一种无需在本地登录实例即可执行常见管理任务的简单方法。您可以通过同时对多个容器实例执行命令来管理集群中的配置更改。Run Command 将报告每个命令的状态和结果。

下面是您可使用 Run Command 执行的任务类型的一些示例：
+ 安装或卸载程序包。
+ 执行安全更新。
+ 清除 Docker 映像。
+ 停止或启动服务。
+ 查看系统资源。
+ 查看日志文件。
+ 执行文件操作。

有关 Run Command 的更多信息，请参阅 *AWS Systems Manager 用户指南*中的 [AWS Systems ManagerRun Command](https://docs.aws.amazon.com/systems-manager/latest/userguide/run-command.html)。

以下是将 Systems Manager 与 Amazon ECS 结合使用的先决条件。

1. 您必须向容器实例角色（**ecsInstanceRole**）授予访问 Systems Manager API 的权限。为此，您可以将 **AmazonSSMManagedInstanceCore** 分配给 `ecsInstanceRole` 角色。有关如何将策略附加到角色的信息，请参阅《AWS Identity and Access Management 用户指南》**中的[更新角色权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_update-role-permissions.html)

1. 验证您的容器实例上是否安装了 SSM Agent。有关更多信息，请参阅[在适用于 Linux 的 EC2 实例上手动安装和卸载 SSM Agent](https://docs.aws.amazon.com/systems-manager/latest/userguide/manually-install-ssm-agent-linux.html)。

将 Systems Manager 托管策略附加到您的 `ecsInstanceRole` 并验证容器实例上是否安装了 AWS Systems Manager Agent（SSM Agent）后，可以开始使用 Run Command 向容器实例发送命令。有关在实例上运行命令和 shell 脚本以及查看结果输出的信息，请参见 *AWS Systems Manager用户手册*中的[使用 Systems Manager Run Command 运行命令](https://docs.aws.amazon.com/systems-manager/latest/userguide/run-command.html)和 [Run Command 演练](https://docs.aws.amazon.com/systems-manager/latest/userguide/run-command-walkthroughs.html) 。

常见的使用案例是使用 Run Command 更新容器实例软件。您可以使用以下参数按照《AWS Systems Manager 用户指南》中的步骤进行操作。


| 参数 | 值 | 
| --- | --- | 
|  **命令文档**  | AWS-RunShellScript | 
| 命令 |  <pre>$ yum update -y</pre> | 
| 目标实例 | 您的容器实例 | 

# 为 Amazon ECS Linux 容器实例使用 HTTP 代理
<a name="http_proxy_config"></a>

您可以将 Amazon ECS 容器实例配置为对 Amazon ECS 容器代理和 Docker 进程守护程序使用 HTTP 代理。如果您的容器实例无法通过 Amazon VPC互联网网关、NAT 网关或实例访问外部网络，则这非常有用。

要将 Amazon ECS Linux 容器实例配置为使用 HTTP 代理，请在启动时在相关文件中设置以下变量（利用 Amazon EC2 用户数据）。您也可以手动编辑配置文件，然后重新启动代理。

`/etc/ecs/ecs.config`（Amazon Linux 2 和 AmazonLinux AMI）    
`HTTP_PROXY=10.0.0.131:3128`  
将此值设置为某个 HTTP 代理的主机名（或 IP 地址）和端口号，供 Amazon ECS 代理用来连接到互联网。例如，在容器实例无法通过 Amazon VPC互联网网关、NAT 网关或实例访问外部网络时。  
`NO_PROXY=169.254.169.254,169.254.170.2,/var/run/docker.sock`  
将此值设置为 `169.254.169.254,169.254.170.2,/var/run/docker.sock` 可筛选 EC2 实例元数据、任务的 IAM 角色以及来自代理的 Docker 进程守护程序流量。

`/etc/systemd/system/ecs.service.d/http-proxy.conf`（仅 Amazon Linux 2）    
`Environment="HTTP_PROXY=10.0.0.131:3128/"`  
将此值设置为某个 HTTP 代理的主机名（或 IP 地址）和端口号，供 `ecs-init` 代理用来连接到互联网。例如，在容器实例无法通过 Amazon VPC互联网网关、NAT 网关或实例访问外部网络时。  
`Environment="NO_PROXY=169.254.169.254,169.254.170.2,/var/run/docker.sock"`  
将此值设置为 `169.254.169.254,169.254.170.2,/var/run/docker.sock` 可筛选 EC2 实例元数据、任务的 IAM 角色以及来自代理的 Docker 进程守护程序流量。

`/etc/init/ecs.override`（仅限 Amazon Linux AMI）    
`env HTTP_PROXY=10.0.0.131:3128`  
将此值设置为某个 HTTP 代理的主机名（或 IP 地址）和端口号，供 `ecs-init` 代理用来连接到互联网。例如，在容器实例无法通过 Amazon VPC互联网网关、NAT 网关或实例访问外部网络时。  
`env NO_PROXY=169.254.169.254,169.254.170.2,/var/run/docker.sock`  
将此值设置为 `169.254.169.254,169.254.170.2,/var/run/docker.sock` 可筛选 EC2 实例元数据、任务的 IAM 角色以及来自代理的 Docker 进程守护程序流量。

`/etc/systemd/system/docker.service.d/http-proxy.conf`（仅 Amazon Linux 2）    
`Environment="HTTP_PROXY=http://10.0.0.131:3128"`  
将此值设置为某个 HTTP 代理的主机名（或 IP 地址）和端口号，供 Docker 进程守护程序用来连接到互联网。例如，在容器实例无法通过 Amazon VPC互联网网关、NAT 网关或实例访问外部网络时。  
`Environment="NO_PROXY=169.254.169.254,169.254.170.2"`  
将此值设置为 `169.254.169.254,169.254.170.2` 可筛选来自代理的 EC2 实例元数据。

`/etc/sysconfig/docker`（仅限 Amazon Linux AMI 和 Amazon Linux 2）    
`export HTTP_PROXY=http://10.0.0.131:3128`  
将此值设置为某个 HTTP 代理的主机名（或 IP 地址）和端口号，供 Docker 进程守护程序用来连接到互联网。例如，在容器实例无法通过 Amazon VPC互联网网关、NAT 网关或实例访问外部网络时。  
`export NO_PROXY=169.254.169.254,169.254.170.2`  
将此值设置为 `169.254.169.254,169.254.170.2` 可筛选来自代理的 EC2 实例元数据。

在以上文件中设置这些环境变量仅影响 Amazon ECS 容器代理、`ecs-init` 和 Docker 进程守护程序。它们不配置任何其他服务（如 **yum**）使用代理。

有关如何配置代理的信息，请参阅[如何在 Amazon Linux 2 或 AL2023 中为 Docker 和 Amazon ECS 容器代理设置 HTTP 代理？](https://repost.aws/knowledge-center/ecs-http-proxy-docker-linux2)。

# 为您的 Amazon ECS Auto Scaling 组配置预初始化的实例
<a name="using-warm-pool"></a>

Amazon ECS 支持 Amazon EC2 Auto Scaling 暖池。暖池是一组准备投入使用的预初始化 Amazon EC2 实例。每当您的应用程序需要横向扩展时，Amazon EC2 Auto Scaling 都会使用暖池中的预初始化实例，而不是启动冷实例，允许运行任何最终初始化过程，然后将实例投入使用。

要了解有关暖池以及如何将暖池添加到 自动扩缩组的更多信息，请参阅 *Amazon EC2 Auto Scaling 用户指南*中的 [Amazon EC2 Auto Scaling 的暖池](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-warm-pools.html)。

当您为 Amazon ECS 的自动扩缩组创建或更新温池时，无法设置在横向缩减时将实例退回暖池的选项（`ReuseOnScaleIn`）。有关更多信息，请参阅*《AWS Command Line Interface 参考》*中的 [put-warm-pool](https://docs.aws.amazon.com/cli/latest/reference/autoscaling/put-warm-pool.html)。

要将暖池与您的 Amazon ECS 集群一起使用，请在 Amazon EC2 Auto Scaling 组启动模板的 **User data**（用户数据）字段中将 `ECS_WARM_POOLS_CHECK` 代理配置变量设置为 `true`。

以下示例介绍如何在 Amazon EC2 启动模板的 **User data**（用户数据）字段中指定代理配置变量。将 *MyCluster* 替换为您的集群的名称。

```
#!/bin/bash
cat <<'EOF' >> /etc/ecs/ecs.config
ECS_CLUSTER=MyCluster
ECS_WARM_POOLS_CHECK=true
EOF
```

`ECS_WARM_POOLS_CHECK` 变量仅在代理版本 `1.59.0` 和更高版本上受支持。有关变量的更多信息，请参阅 [Amazon ECS 容器代理配置](ecs-agent-config.md)。

# 更新 Amazon ECS 容器代理
<a name="ecs-agent-update"></a>

有时，您可能需要更新 Amazon ECS 容器代理以获取错误修正和新功能。更新 Amazon ECS 容器代理不会中断容器实例上正在运行的任务或服务。更新代理的过程各不相同，具体取决于您的容器实例是否通过经 Amazon ECS 优化过的 AMI 或其他操作系统启动。

**注意**  
代理更新不适用于 Windows 容器实例。我们建议您启动新的容器实例来更新您的 Windows 集群中的代理版本。

## 检查 Amazon ECS 容器代理版本
<a name="checking_agent_version"></a>

您可以查看在容器实例上运行的容器代理的版本以确定是否需要更新它。Amazon ECS 控制台中的容器实例视图提供了代理版本。使用以下过程可以检查代理版本。

------
#### [ Amazon ECS console ]

1. 在 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2) 打开控制台。

1. 从导航栏中，选择您的外部实例将注册的区域。

1. 在导航窗格中，选择 **集群** 并选择托管外部实例的集群。

1. 在 **Cluster : *name***（集群：名称）页面上，选择 **Infrastructure**（基础设施）选项卡。

1. 在**容器实例**下，注意容器实例的**代理版本**列。如果容器实例未包含最新版本的容器代理，则控制台将通过消息来提醒您并标记已过期的代理版本。

   如果您的代理版本已过期，则可以使用以下过程更新容器代理：
   + 如果您的容器实例正在运行经 Amazon ECS 优化的 AMI，请参阅 [更新经 Amazon ECS 优化的 AMI 上的 Amazon ECS 容器代理](agent-update-ecs-ami.md)。
   + 如果您的容器实例未运行经 Amazon ECS 优化的 AMI，请参阅 [手动更新 Amazon ECS 容器代理（适用于非经 Amazon ECS 优化的 AMI）](manually_update_agent.md)。
**重要**  
要在经 Amazon ECS 优化的 AMI 上从 v1.0.0 之前的版本更新 Amazon ECS代理版本，建议您终止当前容器实例并启动具有最新 AMI 的新实例。使用预览版的任何容器实例都应停用并更换为最新的 AMI。有关更多信息，请参阅 [启动 Amazon ECS Linux 容器实例](launch_container_instance.md)。

------
#### [ Amazon ECS container agent introspection API  ]

您还可以使用 Amazon ECS 容器代理自检 API 从容器实例本身检查代理版本。有关更多信息，请参阅 [Amazon ECS 容器自检](ecs-agent-introspection.md)。

**利用自检 API 检查 Amazon ECS 容器代理运行的是否为最新版本**

1. 通过 SSH 登录到容器实例。

1. 查询自检 API。

   ```
   [ec2-user ~]$ curl -s 127.0.0.1:51678/v1/metadata | python3 -mjson.tool
   ```
**注意**  
自检 API 在 v1.0.0 版本的 Amazon ECS 容器代理中添加了 `Version` 信息。如果在查询自检 API 时 `Version` 不存在，或者自检 API 在您的代理中根本不存在，则表明运行的版本是 v0.0.3 或更早的版本。您应该更新版本。

------

# 更新经 Amazon ECS 优化的 AMI 上的 Amazon ECS 容器代理
<a name="agent-update-ecs-ami"></a>

如果您使用经 Amazon ECS 优化的 AMI，则可通过多种方式获取最新版本的 Amazon ECS 容器代理（按建议的顺序显示）：
+ 终止容器实例并启动最新版本的经 Amazon ECS 优化的 Amazon Linux 2 AMI（手动执行或者通过使用最新的 AMI 更新自动扩缩启动配置来执行）。这将提供全新的容器实例，其中包含最新的经测试和验证的版本的 Amazon Linux、Docker、`ecs-init` 和 Amazon ECS 容器代理。有关更多信息，请参阅 [经 Amazon ECS 优化的 Linux AMI](ecs-optimized_AMI.md)。
+ 使用 SSH 连接到实例，并将 `ecs-init` 程序包（及其依赖项）更新到最新版本。此操作提供了最新的经测试和验证的版本的 Docker 和 `ecs-init`（它们在 Amazon Linux 存储库中提供）以及最新版本的 Amazon ECS 容器代理。有关更多信息，请参阅 [更新经 Amazon ECS 优化过的 AMI 上的 `ecs-init` 程序包](#procedure_update_ecs-init)。
+ 使用 `UpdateContainerAgent` API 操作更新容器代理（通过控制台执行，或者通过 AWS CLI 或 AWS 开发工具包执行）。有关更多信息，请参阅 [使用 `UpdateContainerAgent` API 操作更新 Amazon ECS 容器代理](#agent-update-api)。

**注意**  
代理更新不适用于 Windows 容器实例。我们建议您启动新的容器实例来更新您的 Windows 集群中的代理版本。<a name="procedure_update_ecs-init"></a>

**更新经 Amazon ECS 优化过的 AMI 上的 `ecs-init` 程序包**

1. 通过 SSH 登录到容器实例。

1. 使用以下命令更新 `ecs-init` 包。

   ```
   sudo yum update -y ecs-init
   ```
**注意**  
将立即更新 `ecs-init` 程序包和 Amazon ECS 容器代理。但是，更新版本的 Docker 直至 Docker 进程守护程序重新启动后才会加载。通过重启实例或通过在您的实例上运行以下命令来重新启动：  
经 Amazon ECS 优化的 Amazon ECS Amazon Linux 2 AMI：  

     ```
     sudo systemctl restart docker
     ```
经 Amazon ECS 优化的 Amazon ECS Amazon Linux AMI：  

     ```
     sudo service docker restart && sudo start ecs
     ```

## 使用 `UpdateContainerAgent` API 操作更新 Amazon ECS 容器代理
<a name="agent-update-api"></a>

**重要**  
`UpdateContainerAgent` API 仅在经 Amazon ECS 优化的 AMI 的Linux变体上受支持，但 Amazon ECS 优化的 Amazon Linux 2（arm64）AMI 除外。对于使用经 Amazon ECS 优化的 Amazon Linux 2（arm64）AMI 的容器实例，请更新 `ecs-init` 程序包更新代理。有关运行其他操作系统的容器实例，请参阅[手动更新 Amazon ECS 容器代理（适用于非经 Amazon ECS 优化的 AMI）](manually_update_agent.md)。如果您使用的是 Windows 容器实例，建议您启动新的容器实例以更新 Windows 集群中的代理版本。

`UpdateContainerAgent` API 过程在您请求代理更新时开始（通过控制台执行，或者通过 AWS CLI 或 AWS 开发工具包。Amazon ECS 将对照最新的代理版本检查您当前的代理版本，并检查是否可以更新。如果更新不可用（例如代理已在运行最新版本），则会返回 `NoUpdateAvailableException`。

上面显示的更新过程的各个阶段如下所示：

`PENDING`  
代理更新可用，并且更新过程已开始。

`STAGING`  
代理已开始下载代理更新。如果代理无法下载更新，或者更新的内容不正确或已损坏，代理将发送失败通知，并且更新将变为 `FAILED` 状态。

`STAGED`  
代理下载已完成，且代理内容已经过验证。

`UPDATING`  
`ecs-init` 服务已重新启动，并且选取了新代理版本。如果代理出于某个原因无法重新启动，更新将变为 `FAILED` 状态；否则，代理将向 Amazon ECS 发送更新已完成的信号。

**注意**  
代理更新不适用于 Windows 容器实例。我们建议您启动新的容器实例来更新您的 Windows 集群中的代理版本。

**在控制台中更新经 Amazon ECS 优化的 AMI 上的 Amazon ECS 容器代理**

1. 在 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2) 打开控制台。

1. 从导航栏中，选择您的外部实例将注册的区域。

1. 在导航窗格中，选择 **Clusters** 并选择集群。

1. 在 **Cluster : *name***（集群：名称）页面上，选择 **Infrastructure**（基础设施）选项卡。

1. 在**容器实例**下，选择要更新的实例，然后选择**操作**、**更新代理**。

# 手动更新 Amazon ECS 容器代理（适用于非经 Amazon ECS 优化的 AMI）
<a name="manually_update_agent"></a>

有时，您可能需要更新 Amazon ECS 容器代理以获取错误修正和新功能。更新 Amazon ECS 容器代理不会中断容器实例上正在运行的任务或服务。
**注意**  
代理更新不适用于 Windows 容器实例。我们建议您启动新的容器实例来更新您的 Windows 集群中的代理版本。

1. 通过 SSH 登录到容器实例。

1. 检查您的代理是否使用 `ECS_DATADIR` 环境变量保存其状态。

   ```
   ubuntu:~$ docker inspect ecs-agent | grep ECS_DATADIR
   ```

   输出：

   ```
   "ECS_DATADIR=/data",
   ```
**重要**  
如果上一个命令未返回 `ECS_DATADIR` 环境变量，则您在更新代理前必须停止在此容器实例上运行的任何任务。具有 `ECS_DATADIR` 环境变量的较新的代理将保存其状态，您可以在任务运行的同时更新它们，而不会出现问题。

1. 停止 Amazon ECS 容器代理。

   ```
   ubuntu:~$ docker stop ecs-agent
   ```

1. 删除代理容器。

   ```
   ubuntu:~$ docker rm ecs-agent
   ```

1. 确保 `/etc/ecs/ecs.config`中存在 `/etc/ecs` 目录和 Amazon ECS 容器代理配置文件。

   ```
   ubuntu:~$ sudo mkdir -p /etc/ecs && sudo touch /etc/ecs/ecs.config
   ```

1. 编辑 `/etc/ecs/ecs.config` 文件，并确保它至少包含以下变量声明。如果不希望向默认集群注册容器实例，请将 `ECS_CLUSTER` 的值指定为集群名称。

   ```
   ECS_DATADIR=/data
   ECS_ENABLE_TASK_IAM_ROLE=true
   ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true
   ECS_LOGFILE=/log/ecs-agent.log
   ECS_AVAILABLE_LOGGING_DRIVERS=["json-file","awslogs"]
   ECS_LOGLEVEL=info
   ECS_CLUSTER=default
   ```

   有关这些和其他代理运行时选项的更多信息，请参阅 [Amazon ECS 容器代理配置](ecs-agent-config.md)。
**注意**  
您可以选择将代理环境变量存储在 Amazon S3 中（可在启动时使用 Amazon EC2 用户数据将其下载到容器实例）。建议对敏感信息（如私有存储库的身份验证凭证）采用此方法。有关更多信息，请参阅 [将 Amazon ECS 容器实例配置存储在 Amazon S3 中](ecs-config-s3.md) 和 [在 Amazon ECS 中使用非 AWS 容器映像](private-auth.md)。

1. 从 Amazon Elastic Container Registry Public 拉取最新的 Amazon ECS 容器代理映像。

   ```
   ubuntu:~$ docker pull public.ecr.aws/ecs/amazon-ecs-agent:latest
   ```

   输出：

   ```
   Pulling repository amazon/amazon-ecs-agent
   a5a56a5e13dc: Download complete
   511136ea3c5a: Download complete
   9950b5d678a1: Download complete
   c48ddcf21b63: Download complete
   Status: Image is up to date for amazon/amazon-ecs-agent:latest
   ```

1. 在容器实例上运行最新的 Amazon ECS 容器代理。
**注意**  
使用 Docker 重新启动策略或进程管理器（如 **upstart** 或 **systemd**）将容器代理作为服务或进程守护程序处理，并确保在容器代理退出后重新启动它。经 Amazon ECS 优化的 AMI 使用 `ecs-init` RPM 达到此目的，并且您可以在 GitHub 上查看[此 RPM 的源代码](https://github.com/aws/amazon-ecs-init)。

   以下示例代理运行命令分为若干个单独的行以显示每个选项。有关这些和其他代理运行时选项的更多信息，请参阅 [Amazon ECS 容器代理配置](ecs-agent-config.md)。
**重要**  
运行启用了 SELinux 的操作系统需要在 **docker run** 命令中使用 `--privileged` 选项。此外，对于启用了 SELinux 的容器实例，建议向 `/log` 和 `/data` 卷挂载添加 `:Z` 选项。但是，在运行该命令前，这些卷的主机挂载必须存在，否则会出现 `no such file or directory` 错误。如果您在启用了 SELinux 的容器实例上运行 Amazon ECS 代理时遇到困难，请执行以下操作：  
在容器实例上创建主机卷挂载点。  

     ```
     ubuntu:~$ sudo mkdir -p /var/log/ecs /var/lib/ecs/data
     ```
将 `--privileged` 选项添加到下面的 **docker run** 命令中。
将 `:Z` 选项追加到针对下面的 **docker run** 命令的 `/log` 和 `/data` 容器卷挂载（例如 `--volume=/var/log/ecs/:/log:Z`）。

   ```
   ubuntu:~$ sudo docker run --name ecs-agent \
   --detach=true \
   --restart=on-failure:10 \
   --volume=/var/run:/var/run \
   --volume=/var/log/ecs/:/log \
   --volume=/var/lib/ecs/data:/data \
   --volume=/etc/ecs:/etc/ecs \
   --volume=/etc/ecs:/etc/ecs/pki \
   --net=host \
   --env-file=/etc/ecs/ecs.config \
   amazon/amazon-ecs-agent:latest
   ```
**注意**  
如果您收到一条 `Error response from daemon: Cannot start container` 消息，则可以利用 **sudo docker rm ecs-agent** 命令删除失败的容器并重新尝试运行代理。

# 经 Amazon ECS 优化的 Windows AMI
<a name="ecs-optimized_windows_AMI"></a>

经 Amazon ECS 优化的 AMI 预配置了运行 Amazon ECS 工作负载所需的必要组件。尽管您可以自行创建在 Amazon ECS 上运行您的容器化工作负载所需的符合基本规范的容器实例 AMI，但 AWS 工程师仍会在 Amazon ECS 上预配置并测试经 Amazon ECS 优化的 AMI。这是可供您开始操作并快速获取 AWS 上运行的容器的最简单方式。

经 Amazon ECS 优化的 AMI 元数据，包括 AMI 名称、Amazon ECS 容器代理版本和 Amazon ECS 运行时版本（其中包括 Docker 版本，对于每个变体可以编程方式检索）。有关更多信息，请参阅 [检索经 Amazon ECS 优化的 Windows AMI 元数据](retrieve-ecs-optimized_windows_AMI.md)。

**重要**  
 2022 年 8 月之后生产的所有经 ECS 优化的 AMI 变体都将从 Docker EE（Mirantis）迁移到 Docker CE（Moby 项目）。  
为了确保客户预设情况下安装了最新的安全更新，Amazon ECS 保留至少三个 Windows 经 Amazon ECS 优化的 AMI。在发布新的 Windows 经 Amazon ECS 优化的 AMI 后，Amazon ECS 将使 Windows 经 Amazon ECS 优化的 AMI 成为旧版专用。如果存在需要访问的私有 AMI，请通过向 Cloud Support 提交服务单来告知我们。

## 经 Amazon ECS 优化的 AMI 变体
<a name="ecs-optimized-ami-variants"></a>

以下 Windows 服务器版本的经 Amazon ECS优化 AMI 适用于您的 Amazon EC2 实例。

**重要**  
8 月之后生产的所有经 ECS 优化的 AMI 变体都将从 Docker EE（Mirantis）迁移到 Docker CE（Moby 项目）。
+ **Amazon ECS 优化版 Windows Server 2025 Full AMI** 
+ **Amazon ECS 优化版 Windows Server 2025 Core AMI** 
+ **经 Amazon ECS 优化的 Windows Server 2022 Full AMI** 
+ **经 Amazon ECS 优化的 Windows Server 2022 Core AMI** 
+ **经 Amazon ECS 优化的 Windows Server 2019 Full AMI ** 
+ **经 Amazon ECS 优化的 Windows Server 2019 Core AMI ** 
+ **经 Amazon ECS 优化的 Windows Server 2016 Full AMI**

**重要**  
Windows Server 2016 不支持最新的 Docker 版本，例如 25.x.x。因此，Windows Server 2016 Full AMI 将不会收到 Docker 运行时的安全补丁或错误补丁。建议您迁移到以下 Windows 平台之一：  
Windows Server 2022 Full
Windows Server 2022 Core
Windows Server 2019 Full
Windows Server 2019 Core

2022 年 8 月 9 日，经 Amazon ECS 优化的 Windows Server 20H2 Core AMI 达到终止支持日期。不会发布此 AMI 的任何新版本。有关更多信息，请参阅 [Windows Server 发行版信息](https://learn.microsoft.com/en-us/windows-server/get-started/windows-server-release-info)。

Windows Server 2025、Windows Server 2022、Windows Server 2019 和 Windows Server 2016 是长期服务渠道（LTSC）版本。Windows Server 20H2 是一个半年服务渠道（SAC）版本。有关更多信息，请参阅 [Windows Server 发行版信息](https://learn.microsoft.com/en-us/windows-server/get-started/windows-server-release-info)。

### 注意事项
<a name="windows_caveats"></a>

下面是您应了解的有关 Amazon EC2 Windows 容器和 Amazon ECS 的一些事项。
+ Windows 容器无法在 Linux 容器实例上运行，情况也相反。为了更好地放置 Windows 和 Linux 任务，请将 Windows 和 Linux 容器实例保持在单独的集群中，并且仅将 Windows 任务放置在 Windows 集群上。您可以设置以下放置约束，确保 Windows 任务定义仅放置在 Windows 实例上：`memberOf(ecs.os-type=='windows')`。
+ 使用 EC2 和 Fargate 的任务支持 Windows 容器。
+ Windows 容器和容器实例并不完全支持适用于 Linux 容器和容器实例的所有任务定义和参数。对于某些参数，它们完全不受支持，而其他参数在 Windows 和 Linux 上的行为不相同。有关更多信息，请参阅 [运行 Windows 的 EC2 实例的 Amazon ECS 任务定义差异](windows_task_definitions.md)。
+ 对于任务的 IAM 角色功能，您需要将 Windows 容器实例配置为在启动时允许该功能。容器在使用此功能时必须运行一些提供的 PowerShell 代码。有关更多信息，请参阅 [Amazon EC2 Windows 实例附加配置](task-iam-roles.md#windows_task_IAM_roles)。
+ 任务的 IAM 角色功能使用凭证代理来向容器提供凭证。此凭证代理占用了容器实例上的端口 80，因此，如果您使用 IAM 角色处理任务，则端口 80 不可用于任务。对于 Web 服务容器，您可以使用应用程序负载均衡器和动态端口映射来向容器提供标准 HTTP 端口 80 连接。有关更多信息，请参阅 [使用负载均衡分配 Amazon ECS 服务流量](service-load-balancing.md)。
+ Windows Server Docker 映像很大（9GiB）。因此，您的 Windows 容器实例需要比 Linux 容器实例更多的存储空间。
+ 要在 Windows Server 上运行 Windows 容器，容器的基本映像操作系统版本必须与主机的操作系统版本匹配。有关更多信息，请参阅 Microsoft 文档网站上的 [Windows 容器版本兼容性](https://learn.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/version-compatibility?tabs=windows-server-2022%2Cwindows-11)。如果您的集群运行多个 Windows 版本，则可以使用置放约束来确保将任务放在运行相同版本的 EC2 实例上：`memberOf(attribute:ecs.os-family == WINDOWS_SERVER_<OS_Release>_<FULL or CORE>)`。有关更多信息，请参阅 [检索经 Amazon ECS 优化的 Windows AMI 元数据](retrieve-ecs-optimized_windows_AMI.md)。

# 检索经 Amazon ECS 优化的 Windows AMI 元数据
<a name="retrieve-ecs-optimized_windows_AMI"></a>

经 Amazon ECS 优化的 AMI 的 AMI ID、映像名称、操作系统、容器代理版本和运行时版本可通过查询 Systems Manager Parameter Store API 以编程方式检索。有关 Systems Manager Parameter Store API 的更多信息，请参阅 [GetParameters](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameters.html) 和 [GetParametersByPath](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParametersByPath.html)。

**注意**  
您的管理用户必须具有以下 IAM 权限才能检索经 Amazon ECS 优化的 AMI 元数据。这些权限已添加到 `AmazonECS_FullAccess` IAM 策略。  
ssm:GetParameters
ssm:GetParameter
ssm:GetParametersByPath

## Systems Manager Parameter Store 参数格式
<a name="ecs-optimized-ami-parameter-format"></a>

**注意**  
以下 Systems Manager Parameter Store API 参数已被弃用，不应使用这些参数来检索最新的 Windows AMI：  
`/aws/service/ecs/optimized-ami/windows_server/2016/english/full/recommended/image_id `
`/aws/service/ecs/optimized-ami/windows_server/2019/english/full/recommended/image_id`

以下是经 Amazon ECS 优化的 AMI 变体参数名称的格式。
+ Windows Server 2025 Full AMI 元数据：

  ```
  /aws/service/ami-windows-latest/Windows_Server-2025-English-Full-ECS_Optimized
  ```
+ Windows Server 2025 Core AMI 元数据：

  ```
  /aws/service/ami-windows-latest/Windows_Server-2025-English-Core-ECS_Optimized
  ```
+ Windows Server 2022 Full AMI 元数据：

  ```
  /aws/service/ami-windows-latest/Windows_Server-2022-English-Full-ECS_Optimized
  ```
+ Windows Server 2022 Core AMI 元数据：

  ```
  /aws/service/ami-windows-latest/Windows_Server-2022-English-Core-ECS_Optimized
  ```
+ Windows Server 2019 Full AMI 元数据：

  ```
  /aws/service/ami-windows-latest/Windows_Server-2019-English-Full-ECS_Optimized
  ```
+ Windows Server 2019 Core AMI 元数据：

  ```
  /aws/service/ami-windows-latest/Windows_Server-2019-English-Core-ECS_Optimized
  ```
+ Windows Server 2016 Full AMI 元数据：

  ```
  /aws/service/ami-windows-latest/Windows_Server-2016-English-Full-ECS_Optimized
  ```

以下参数名称格式检索最新稳定的 Windows Server 2019 Full AMI 都元数据

```
aws ssm get-parameters --names /aws/service/ami-windows-latest/Windows_Server-2019-English-Full-ECS_Optimized
```

以下是针对参数值返回的 JSON 对象的示例。

```
{
    "Parameters": [
        {
            "Name": "/aws/service/ami-windows-latest/Windows_Server-2019-English-Full-ECS_Optimized",
            "Type": "String",
            "Value": "{\"image_name\":\"Windows_Server-2019-English-Full-ECS_Optimized-2023.06.13\",\"image_id\":\"ami-0debc1fb48e4aee16\",\"ecs_runtime_version\":\"Docker (CE) version 20.10.21\",\"ecs_agent_version\":\"1.72.0\"}",
            "Version": 58,
            "LastModifiedDate": "2023-06-22T19:37:37.841000-04:00",
            "ARN": "arn:aws:ssm:us-east-1::parameter/aws/service/ami-windows-latest/Windows_Server-2019-English-Full-ECS_Optimized",
            "DataType": "text"
        }
    ],
    "InvalidParameters": []
}
```

上述输出中的每个字段都可作为子参数查询。通过将子参数名称追加到所选 AMI 的路径来构造子参数的参数路径。可用子参数如下：
+ `schema_version`
+ `image_id`
+ `image_name`
+ `os`
+ `ecs_agent_version`
+ `ecs_runtime_version`

## 示例
<a name="ecs-optimized-ami-windows-parameter-examples"></a>

以下示例说明了可用于检索经 Amazon ECS 优化的 AMI 变体的元数据的方法。

### 检索最新稳定的经 Amazon ECS 优化的 AMI 的元数据
<a name="ecs-optimized-ami-windows-parameter-examples-1"></a>

您可以使用 AWS CLI 和以下 AWS CLI 命令检索最新版稳定的经 Amazon ECS 优化的 AMI。
+ **对于 Amazon ECS 优化版 Windows Server 2025 Full AMI：**

  ```
  aws ssm get-parameters --names /aws/service/ami-windows-latest/Windows_Server-2025-English-Full-ECS_Optimized --region us-east-1
  ```
+ **对于 Amazon ECS 优化版 Windows Server 2025 Core AMI：**

  ```
  aws ssm get-parameters --names /aws/service/ami-windows-latest/Windows_Server-2025-English-Core-ECS_Optimized --region us-east-1
  ```
+ **对于经 Amazon ECS 优化的 Windows Server 2022 Full AMI：**

  ```
  aws ssm get-parameters --names /aws/service/ami-windows-latest/Windows_Server-2022-English-Full-ECS_Optimized --region us-east-1
  ```
+ **对于经 Amazon ECS 优化的 Windows Server 2022 Core AMI：**

  ```
  aws ssm get-parameters --names /aws/service/ami-windows-latest/Windows_Server-2022-English-Core-ECS_Optimized --region us-east-1
  ```
+ **对于经 Amazon ECS 优化的 Windows Server 2019 Full AMI：**

  ```
  aws ssm get-parameters --names /aws/service/ami-windows-latest/Windows_Server-2019-English-Full-ECS_Optimized --region us-east-1
  ```
+ **对于经 Amazon ECS 优化的 Windows Server 2019 Core AMI：**

  ```
  aws ssm get-parameters --names /aws/service/ami-windows-latest/Windows_Server-2019-English-Core-ECS_Optimized --region us-east-1
  ```
+ **对于经 Amazon ECS 优化的 Windows Server 2016 Full AMI：**

  ```
  aws ssm get-parameters --names /aws/service/ami-windows-latest/Windows_Server-2016-English-Full-ECS_Optimized --region us-east-1
  ```

### 在 CloudFormation 模板中使用最新推荐的经 Amazon ECS 优化的 AMI
<a name="ecs-optimized-ami-windows-parameter-examples-5"></a>

您可以参考 Systems Manager 参数存储名称引用 CloudFormation 模板中最新推荐的经 Amazon ECS 优化的 AMI。

```
Parameters:
  LatestECSOptimizedAMI:
    Description: AMI ID
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: /aws/service/ami-windows-latest/Windows_Server-2019-English-Full-ECS_Optimized/image_id
```

# 经 Amazon ECS 优化的 Windows AMI 版本
<a name="ecs-windows-ami-versions"></a>

查看当前和以前版本的经 Amazon ECS 优化的 AMI 及其相应版本的 Amazon ECS 容器代理、Docker 和 `ecs-init` 程序包。

每个变体的经 Amazon ECS 优化的 AMI 元数据（包括 AMI ID）均可通过编程方式检索。有关更多信息，请参阅 [检索经 Amazon ECS 优化的 Windows AMI 元数据](retrieve-ecs-optimized_windows_AMI.md)。

以下选项卡显示了 Windows 经 Amazon ECS 优化的 AMI 版本列表。有关在 CloudFormation 模板中引用 Systems Manager Parameter Store参数的详细信息，请参阅 [在 CloudFormation 模板中使用最新推荐的经 Amazon ECS 优化的 AMI](retrieve-ecs-optimized_AMI.md#ecs-optimized-ami-parameter-examples-5)。

**重要**  
为了确保客户预设情况下安装了最新的安全更新，Amazon ECS 保留至少三个 Windows 经 Amazon ECS 优化的 AMI。在发布新的 Windows 经 Amazon ECS 优化的 AMI 后，Amazon ECS 将使 Windows 经 Amazon ECS 优化的 AMI 成为旧版专用。如果存在需要访问的私有 AMI，请通过向 Cloud Support 提交服务单来告知我们。  
Windows Server 2016 不支持最新的 Docker 版本，例如 25.x.x。因此，Windows Server 2016 Full AMI 将不会收到 Docker 运行时的安全补丁或错误补丁。建议您迁移到以下 Windows 平台之一：  
Windows Server 2022 Full
Windows Server 2022 Core
Windows Server 2019 Full
Windows Server 2019 Core

**注意**  
gMSA 插件日志记录已使用 2025 年 8 月的 AMI 版本从基于文件的日志记录 `(C:\ProgramData\Amazon\gmsa)` 迁移到 Windows Event logging 。公共日志收集器脚本将收集所有的 gMSA 日志。有关更多信息，请参阅 [使用 Amazon ECS 日志收集器收集容器日志](ecs-logs-collector.md)。

------
#### [ Windows Server 2025 Full AMI versions ]

下表列出了当前和早期版本的 Amazon ECS 优化版 Windows Server 2025 Full AMI 及其相应版本的 Amazon ECS 容器代理和 Docker。


|  Amazon ECS 优化版 Windows Server 2025 Full AMI  |  Amazon ECS 容器代理版本  |  Docker 版本  |  可见性  | 
| --- | --- | --- | --- | 
|  **Windows\$1Server-2025-English-Full-ECS\$1Optimized-2025.09.13**  |  `1.99.0`  |  `25.0.6 (Docker CE)`  |  Public  | 
|  **Windows\$1Server-2025-English-Full-ECS\$1Optimized-2025.08.24**  |  `1.98.0`  |  `25.0.6 (Docker CE)`  |  Public  | 
| Windows\$1Server-2025-English-Full-ECS\$1Optimized-2025.08.16 | 1.97.1 | 25.0.6 (Docker CE) | Public | 
|  **Windows\$1Server-2025-English-Full-ECS\$1Optimized-2025.07.16**  |  `1.96.0`  |  `25.0.6 (Docker CE)`  |  Public  | 
|  **Windows\$1Server-2025-English-Full-ECS\$1Optimized-2025.06.13**  |  `1.94.0`  |  `25.0.6 (Docker CE)`  |  Public  | 

使用以下 AWS CLI 命令检索当前 Amazon ECS 优化版 Windows Server 2025 Full AMI。

```
aws ssm get-parameters --names /aws/service/ami-windows-latest/Windows_Server-2025-English-Full-ECS_Optimized
```

------
#### [ Windows Server 2025 Core AMI versions ]

下表列出了当前和早期版本的 Amazon ECS 优化版 Windows Server 2025 Core AMI 及其相应版本的 Amazon ECS 容器代理和 Docker。


|  Amazon ECS 优化版 Windows Server 2025 Core AMI  |  Amazon ECS 容器代理版本  |  Docker 版本  |  可见性  | 
| --- | --- | --- | --- | 
|  **Windows\$1Server-2025-English-Core-ECS\$1Optimized-2025.09.13**  |  `1.99.0`  |  `25.0.6 (Docker CE)`  |  Public  | 
|  **Windows\$1Server-2025-English-Core-ECS\$1Optimized-2025.08.24**  |  `1.98.0`  |  `25.0.6 (Docker CE)`  |  Public  | 
| Windows\$1Server-2025-English-Core-ECS\$1Optimized-2025.08.16 | 1.97.1 | 25.0.6 (Docker CE) | Public | 
|  **Windows\$1Server-2025-English-Core-ECS\$1Optimized-2025.07.16**  |  `1.96.0`  |  `25.0.6 (Docker CE)`  |  Public  | 
|  **Windows\$1Server-2025-English-Core-ECS\$1Optimized-2025.06.13**  |  `1.94.0`  |  `25.0.6 (Docker CE)`  |  Public  | 

使用以下 AWS CLI 命令检索当前 Amazon ECS 优化版 Windows Server 2025 Core AMI。

```
aws ssm get-parameters --names /aws/service/ami-windows-latest/Windows_Server-2025-English-Core-ECS_Optimized
```

------
#### [ Windows Server 2022 Full AMI versions ]

下表列出了当前和以前版本的经 Amazon ECS 优化的 Windows Server 2022 Full AMI 及其相应版本的 Amazon ECS 容器代理和 Docker。


|  经 Amazon ECS 优化的 Windows Server 2022 Full AMI  |  Amazon ECS 容器代理版本  |  Docker 版本  |  可见性  | 
| --- | --- | --- | --- | 
|  **Windows\$1Server-2022-English-Full-ECS\$1Optimized-2025.09.13**  |  `1.99.0`  |  `25.0.6 (Docker CE)`  |  Public  | 
|  **Windows\$1Server-2022-English-Full-ECS\$1Optimized-2025.08.24**  |  `1.98.0`  |  `25.0.6 (Docker CE)`  |  Public  | 
| Windows\$1Server-2022-English-Full-ECS\$1Optimized-2025.08.16 | 1.97.1 | 25.0.6 (Docker CE) | Public | 
|  **Windows\$1Server-2022-English-Full-ECS\$1Optimized-2025.07.16**  |  `1.95.0`  |  `25.0.6 (Docker CE)`  |  Public  | 

使用以下 AWS CLI 命令检索当前经 Amazon ECS 优化的 Windows Server 2022 Full AMI。

```
aws ssm get-parameters --names /aws/service/ami-windows-latest/Windows_Server-2022-English-Full-ECS_Optimized
```

------
#### [ Windows Server 2022 Core AMI versions ]

下表列出了当前和以前版本的经 Amazon ECS 优化的 Windows Server 2022 Core AMI 及其相应版本的 Amazon ECS 容器代理和 Docker。


|  经 Amazon ECS 优化的 Windows Server 2022 Core AMI  |  Amazon ECS 容器代理版本  |  Docker 版本  |  可见性  | 
| --- | --- | --- | --- | 
|  **Windows\$1Server-2022-English-Core-ECS\$1Optimized-2025.09.13**  |  `1.99.0`  |  `25.0.6 (Docker CE)`  |  Public  | 
|  **Windows\$1Server-2022-English-Core-ECS\$1Optimized-2025.08.24**  |  `1.98.0`  |  `25.0.6 (Docker CE)`  |  Public  | 
| Windows\$1Server-2022-English-Core-ECS\$1Optimized-2025.08.16 | 1.97.1 | 25.0.6 (Docker CE) | Public | 
|  **Windows\$1Server-2022-English-Core-ECS\$1Optimized-2025.07.16**  |  `1.95.0`  |  `25.0.6 (Docker CE)`  |  Public  | 

使用以下 AWS CLI 命令检索当前经 Amazon ECS 优化的 Windows Server 2022 Full AMI。

```
aws ssm get-parameters --names /aws/service/ami-windows-latest/Windows_Server-2022-English-Core-ECS_Optimized
```

------
#### [ Windows Server 2019 Full AMI versions ]

下表列出了当前和以前版本的经 Amazon ECS 优化的Windows Server 2019 Full AMI 及其相应版本的 Amazon ECS 容器代理和 Docker。


|  经 Amazon ECS 优化的 Windows Server 2019 Full AMI  |  Amazon ECS 容器代理版本  |  Docker 版本  |  可见性  | 
| --- | --- | --- | --- | 
|  **Windows\$1Server-2019-English-Full-ECS\$1Optimized-2025.09.13**  |  `1.99.0`  |  `25.0.6 (Docker CE)`  |  Public  | 
|  **Windows\$1Server-2019-English-Full-ECS\$1Optimized-2025.08.24**  |  `1.98.0`  |  `25.0.6 (Docker CE)`  |  Public  | 
| Windows\$1Server-2019-English-Full-ECS\$1Optimized-2025.08.16 | 1.97.1 | 25.0.6 (Docker CE) | Public | 
|  **Windows\$1Server-2019-English-Full-ECS\$1Optimized-2025.07.16**  |  `1.95.0`  |  `25.0.6 (Docker CE)`  |  Public  | 

使用以下 AWS CLI 命令检索当前经 Amazon ECS 优化的 Windows Server 2019 Full AMI。

```
aws ssm get-parameters --names /aws/service/ami-windows-latest/Windows_Server-2019-English-Full-ECS_Optimized
```

------
#### [ Windows Server 2019 Core AMI versions ]

下表列出了当前和以前版本的经 Amazon ECS 优化的Windows Server 2019 Core AMI 及其相应版本的 Amazon ECS 容器代理和 Docker。


|  经 Amazon ECS 优化的 Windows Server 2019 Core AMI  |  Amazon ECS 容器代理版本  |  Docker 版本  |  可见性  | 
| --- | --- | --- | --- | 
|  **Windows\$1Server-2019-English-Core-ECS\$1Optimized-2025.09.13**  |  `1.99.0`  |  `25.0.6 (Docker CE)`  |  Public  | 
|  **Windows\$1Server-2019-English-Core-ECS\$1Optimized-2025.08.24**  |  `1.98.0`  |  `25.0.6 (Docker CE)`  |  Public  | 
| Windows\$1Server-2019-English-Core-ECS\$1Optimized-2025.08.16 | 1.97.1 | 25.0.6 (Docker CE) | Public | 
|  **Windows\$1Server-2019-English-Core-ECS\$1Optimized-2025.07.16**  |  `1.95.0`  |  `25.0.6 (Docker CE)`  |  Public  | 

使用以下 AWS CLI 命令检索当前经 Amazon ECS 优化的 Windows Server 2019 Full AMI。

```
aws ssm get-parameters --names /aws/service/ami-windows-latest/Windows_Server-2019-English-Core-ECS_Optimized
```

------
#### [ Windows Server 2016 Full AMI versions ]

**重要**  
Windows Server 2016 不支持最新的 Docker 版本，例如 25.x.x。因此，Windows Server 2016 Full AMI 将不会收到 Docker 运行时的安全补丁或错误补丁。建议您迁移到以下 Windows 平台之一：  
Windows Server 2022 Full
Windows Server 2022 Core
Windows Server 2019 Full
Windows Server 2019 Core

下表列出了当前和以前版本的经 Amazon ECS 优化的Windows Server 2016 Full AMI 及其相应版本的 Amazon ECS 容器代理和 Docker。


|  经 Amazon ECS 优化的 Windows Server 2016 Full AMI  |  Amazon ECS 容器代理版本  |  Docker 版本  |  可见性  | 
| --- | --- | --- | --- | 
|  **Windows\$1Server-2016-English-Full-ECS\$1Optimized-2025.09.13**  |  `1.99.0`  |  `20.10.23 (Docker CE)`  |  Public  | 
|  **Windows\$1Server-2016-English-Full-ECS\$1Optimized-2025.08.16**  |  `1.97.1`  |  `20.10.23 (Docker CE)`  |  Public  | 
|  **Windows\$1Server-2016-English-Full-ECS\$1Optimized-2025.07.16**  |  `1.95.0`  |  `20.10.23 (Docker CE)`  |  Public  | 
|  **Windows\$1Server-2016-English-Full-ECS\$1Optimized-2025.06.13**  |  `1.94.0`  |  `20.10.23 (Docker CE)`  |  Public  | 

使用以下 AWS CLI 经 Amazon ECS 优化的 Windows Server 2016 Full AMI。

```
aws ssm get-parameters --names /aws/service/ami-windows-latest/Windows_Server-2016-English-Full-ECS_Optimized
```

------

# 构建您自己的经 Amazon ECS 优化的 Windows AMI
<a name="windows-custom-ami"></a>

使用 EC2 Image Builder 构建您自定义的经 Amazon ECS 优化的 Windows AMI。这样，您可以轻松地在 Amazon ECS 上使用具有您自己的许可证的 Windows AMI。Amazon ECS 有一个托管 Image Builder 组件，提供了运行 Windows 实例以托管容器所需的系统配置。每个 Amazon ECS 托管组件都包含一个特定的容器代理和 Docker 版本。您可以自定义映像以使用最新的 Amazon ECS 托管组件，或者如果需要较旧的容器代理或 Docker 版本，则可以指定其他组件。

有关使用 EC2 Image Builder 的完整演练，请参阅[EC2 Image Builder 入门](https://docs.aws.amazon.com/imagebuilder/latest/userguide/set-up-ib-env.html#image-builder-accessing-prereq)中的 *EC2 Image Builder 用户指南*。

使用 EC2 Image Builder 构建您自己的经 Amazon ECS 优化 Windows AMI 时，您可以创建映像配方。您的映像配方必须满足以下要求：
+ **源映像**应基于 Windows 服务器 2019 Core、Windows Server 2019 Full、Windows Server 2022 Core 或 Windows Server 2022 Full。不支持任何其他 Windows 操作系统，并且可能与该组件不兼容。
+ 在指定**生成组件**，`ecs-optimized-ami-windows` 组件是必需的。推荐 `update-windows` 组件，确保映像包含最新的安全更新。

  要指定其他组件版本，请展开**版本控制选项**菜单并指定要使用的组件版本。有关更多信息，请参阅 [列出 `ecs-optimized-ami-windows` 组件版本](#windows-component-list)。

## 列出 `ecs-optimized-ami-windows` 组件版本
<a name="windows-component-list"></a>

创建 EC2 Image Builder 配方并指定 `ecs-optimized-ami-windows` 组件，您可以使用默认选项，也可以指定特定组件版本。要确定可用的组件版本以及组件中包含的 Amazon ECS 容器代理和 Docker 版本，您可以使用 AWS 管理控制台。

**要列出可用的 `ecs-optimized-ami-windows` 组件版本**

1. 打开位于 [https://console.aws.amazon.com/imagebuilder/](https://console.aws.amazon.com/imagebuilder/)的 EC2 Image Builder 控制台

1. 在导航栏上，选择构建映像所在的区域。

1. 在导航窗格中的**保存的配置**菜单下，选择**组件**。

1. 在**组件**页面上，在搜索栏中键入 `ecs-optimized-ami-windows`，下拉资质菜单，然后选择**快速启动（Amazon 托管）**。

1. 使用**说明**列确定您映像所需的 Amazon ECS 容器代理和 Docker 版本的组件版本。

# Amazon ECS Windows 容器实例管理
<a name="manage-windows"></a>

为 Amazon ECS 工作负载使用 EC2 实例时，您负责维护这些实例。

代理更新不适用于 Windows 容器实例。我们建议您启动新的容器实例来更新您的 Windows 集群中的代理版本。

**Topics**
+ [启动容器实例](launch_window-container_instance.md)
+ [引导启动容器实例](bootstrap_windows_container_instance.md)
+ [为 Windows 容器实例使用 HTTP 代理](http_proxy_config-windows.md)
+ [配置容器实例以接收竞价型实例通知](windows-spot-instance-draining-container.md)

# 启动 Amazon ECS Windows 容器实例
<a name="launch_window-container_instance"></a>

Amazon ECS 容器实例是使用 Amazon EC2 控制台创建的。开始之前，请确保您已完成 [设置以使用 Amazon ECS](get-set-up-for-amazon-ecs.md) 中的步骤。

有关启动向导的更多信息，请参阅《Amazon EC2 用户指南》中的[使用新启动实例向导启动实例](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ec2-launch-instance-wizard.html)**。

您可以使用新 Amazon EC2 向导启动实例。您可以使用以下列表中的参数，将未列出的参数作为默认值。以下说明将引导您完成每个参数组。

## 过程
<a name="liw-initiate-instance-launch"></a>

在开始之前，请完成 [设置以使用 Amazon ECS](get-set-up-for-amazon-ecs.md) 中的步骤。

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在屏幕顶部的导航栏中，会显示当前 AWS 区域，例如，美国东部美国东部（俄亥俄州）。选择要在其中启动实例的区域。选择该内容是非常重要的，因为可以在区域之间共享某些 Amazon EC2 资源，而无法共享其他资源。

1. 从 Amazon EC2 控制台控制面板中，选择**启动实例**。

## 名称和标签
<a name="liw-name-and-tags"></a>

实例名称是一个标签，其中密钥为**名称**，而值为您指定的名称。您可以为实例、卷和弹性图形添加标签。对于竞价型实例，您只能标记竞价型实例请求。

指定实例名称和其它标签为可选项。
+ 对于**名称**，为实例输入一个描述性名称。如果您没有指定名称，则可以通过其 ID 标识实例，该 ID 将在您启动实例时自动生成。
+ 要添加其它标签，请选择**添加其他标签**。选择**添加标签**，然后输入密钥和值，然后选择要标记的资源类型。为每个要添加的其它标签选择**添加标签**。

## 应用程序和操作系统映像（亚马逊机器映像）
<a name="liw-ami"></a>

亚马逊机器映像（AMI）中包含了创建实例所需的信息。例如，AMI 可能包含充当 Web 服务器所需的软件，例如 Apache 和您的网站。

有关最新的经 Amazon ECS 优化的 AMI 及其值，请参阅[经 Windows Amazon ECS 优化的 AMI](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_windows_AMI.html)。

使用**搜索**栏查找由 AWS 发布的合适的经 Amazon ECS 优化的 AMI。

1. 根据您的要求，在**搜索**栏中输入以下 AMI 之一，然后按 **Enter**。
   + Windows\$1Server-2022-English-Full-ECS\$1Optimized
   + Windows\$1Server-2022-English-Core-ECS\$1Optimized
   + Windows\$1Server-2019-English-Full-ECS\$1Optimized
   + Windows\$1Server-2019-English-Core-ECS\$1Optimized
   + Windows\$1Server-2016-English-Full-ECS\$1Optimized

1. 在**选择亚马逊机器映像（AMI）**页面上，选择**社区 AMI** 类别。

1. 从显示的列表中，选择经过 Microsoft 验证且具有最新发布日期的 AMI，然后单击**选择**。

## 实例类型
<a name="liw-instance-type"></a>

实例类型定义了实例的硬件配置和大小。更大的实例类型拥有更多的 CPU 和内存。有关更多信息，请参阅[实例类型](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html)。
+ 对于**实例类型**，请为实例选择实例类型。

   您选择的实例类型决定了可用于运行您的任务的资源。

## 密钥对（登录）
<a name="liw-key-pair"></a>

为**密钥对名称**选择一个现有密钥对，或选择**创建新的密钥对**来新建一个密钥对。

**重要**  
如果您选择**在没有密钥对的情况下继续（不推荐）**选项，则将无法连接到此实例，除非您选择配置为允许用户以其它方式登录的 AMI。

## 网络设置
<a name="liw-network-settings"></a>

根据需要配置网络设置。
+ **联网平台**：选择**虚拟私有云（VPC）**，则在**网络接口**部分中指定子网。
+ **VPC**：选择要在其中创建安全组的现有 VPC。
+ **子网**：您可以在与可用区、本地扩展区、Wavelength 区域或 Outpost 关联的子网中启动实例。

  要在可用区中启动实例，请选择要在其中启动实例的子网。要创建新子网，请选择**新建子网**转到 Amazon VPC 控制台。完成此操作后，返回到启动实例向导并选择“刷新”图标，以便将您的子网加载到列表中。

  要在本地区域中启动实例，请选择您在本地区域中创建的子网。

  要在 Outpost 中启动实例，请在 VPC 中选择与 Outpost 关联的子网。
+ **自动分配公有 IP**：如果实例应可从互联网进行访问，请验证**自动分配公有 IP** 字段设置为**启用**。如果不是，请将此字段设置为**禁用**。
**注意**  
容器实例需要访问才能与 Amazon ECS 服务端点通信。这可以通过接口 VPC 端点或具有公共 IP 地址的容器实例实现。  
有关接口 VPC 端点的更多信息，请参阅 [Amazon ECS 接口 VPC 端点（AWS PrivateLink）](vpc-endpoints.md)  
如果您没有配置接口 VPC 端点，并且您的容器实例没有公有 IP 地址，必须使用网络地址转换（NATI）来提供此访问。有关更多信息，请参阅《Amazon VPC 用户指南》**中的 [NAT 网关](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)和本指南中的 [为 Amazon ECS Linux 容器实例使用 HTTP 代理](http_proxy_config.md)。
+ **防火墙（安全组）**：使用安全组为容器实例定义防火墙规则。这些规则指定哪些传入的网络流量可传输到您的容器实例。所有其他的流量将被忽略。
  + 要选择现有安全组，请选择**选择一个现有的安全组**，然后选择您在 [设置以使用 Amazon ECS](get-set-up-for-amazon-ecs.md) 中创建的安全组

## 配置存储
<a name="liw-storage"></a>

您选择的 AMI 包含一个或多个存储卷，包括根卷。您可以指定要附加到实例的其它卷。

您可以使用**简单**视图。
+ **存储类型**：为您的容器实例配置存储。

  如果使用的是经 Amazon ECS 优化的 Amazon Linux AMI，则实例已配置了两个卷。**根**卷适合操作系统使用，第二个 Amazon EBS 卷（已挂载到 `/dev/xvdcz`）适合 Docker 使用。

  您可以选择增大或减小实例的卷大小以满足您的应用程序需求。

## 高级详细信息
<a name="liw-advanced-details"></a>

对于**高级详细信息**，请展开该部分以查看字段并为实例指定任何其他参数。
+ **购买选项**：选择**请求竞价型实例**以请求竞价型实例。您还需要设置与竞价型实例相关的其他字段。有关更多信息，请参阅竞价型实例[请求](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-requests.html)。
**注意**  
如果使用竞价型实例时看到 `Not available` 消息，则需要选择其他实例类型。

  .
+ **IAM 实例配置文件**：选择您的容器实例 IAM 角色。其通常被命名为 `ecsInstanceRole`。
**重要**  
如果未使用适当的 IAM 权限启动容器实例，则 Amazon ECS 代理无法连接到集群。有关更多信息，请参阅 [Amazon ECS 容器实例 IAM 角色](instance_IAM_role.md)。
+ （可选）**用户数据**：使用用户数据（如 [Amazon ECS 容器代理配置](ecs-agent-config.md) 中的代理环境变量）配置 Amazon ECS 容器实例。Amazon EC2 用户数据脚本仅在实例首次启动时执行一次。以下是用户数据的常用示例：
  + 默认情况下，您的容器实例将启动到您的默认集群中。要在非默认集群中启动，请选择 **Advanced Details** 列表。然后，将以下脚本粘贴到 **User data** 字段中，将 *your\$1cluster\$1name* 替换为您的集群的名称。

    `EnableTaskIAMRole` 打开任务的任务 IAM 角色功能。

    此外，使用 `awsvpc` 网络模式时，以下选项可用。
    + `EnableTaskENI`：此标志打开任务联网，并且在使用 `awsvpc` 网络模式时是必需的。
    + `AwsvpcBlockIMDS`：此可选标志阻止在 `awsvpc` 网络模式下运行的任务容器的 IMDS 访问。
    + `AwsvpcAdditionalLocalRoutes`：此可选标志允许您在任务命名空间中有其他路由。

      将 `ip-address` 替换为附加路由的IP地址，例如172.31.42.23/32。

    ```
    <powershell>
    Import-Module ECSTools
    Initialize-ECSAgent -Cluster your_cluster_name -EnableTaskIAMRole -EnableTaskENI -AwsvpcBlockIMDS -AwsvpcAdditionalLocalRoutes
    '["ip-address"]'
    </powershell>
    ```

# 引导启动 Amazon ECS Windows 容器实例以传递数据
<a name="bootstrap_windows_container_instance"></a>

在启动 Amazon EC2 实例时，您可以将用户数据传递到 EC2 实例。数据可以用于执行常见的自动配置任务，甚至用于在实例启动时运行脚本。对于 Amazon ECS，最常见的用户数据使用案例是将配置信息传递到 Docker 进程守护程序和 Amazon ECS 容器实例。

您可以将多类用户数据传递到 Amazon EC2，其中包括云 boothook、Shell 脚本和 `cloud-init` 指令。有关这些和其他格式类型的更多信息，请参阅 [Cloud-Init 文档](https://cloudinit.readthedocs.io/en/latest/explanation/format.html)。

您可以在使用 Amazon EC2 启动向导时传递此用户数据。有关更多信息，请参阅 [启动 Amazon ECS Linux 容器实例](launch_container_instance.md)。

## 原定设置 Windows 用户数据
<a name="windows-default-userdata"></a>

该示例用户数据脚本显示了在使用控制台时 Windows 容器实例接收的默认用户数据。下面的脚本将执行以下操作：
+ 将集群名称设置为您输入的名称。
+ 设置任务的 IAM 角色。
+ 将 `json-file` 以及 `awslogs` 设置为可用的日志记录驱动程序。

此外，使用 `awsvpc` 网络模式时，以下选项可用。
+ `EnableTaskENI`：此标志打开任务联网，并且在使用 `awsvpc` 网络模式时是必需的。
+ `AwsvpcBlockIMDS`：此可选标志阻止在 `awsvpc` 网络模式下运行的任务容器的 IMDS 访问。
+ `AwsvpcAdditionalLocalRoutes`：此可选标志允许您有其他路由。

  将 `ip-address` 替换为附加路由的IP地址，例如172.31.42.23/32。

您可以将该脚本用于自己的容器实例，但前提是它们是从经 Amazon ECS 优化的 Windows Server AMI 启动的。

替换 `-Cluster cluster-name` 行以指定您自己的集群名称。

```
<powershell>
Initialize-ECSAgent -Cluster cluster-name -EnableTaskIAMRole -LoggingDrivers '["json-file","awslogs"]' -EnableTaskENI -AwsvpcBlockIMDS -AwsvpcAdditionalLocalRoutes
'["ip-address"]'
</powershell>
```

 对于配置为使用 `awslogs` 日志记录驱动程序的 Windows 任务，您还必须在容器实例上设置 `ECS_ENABLE_AWSLOGS_EXECUTIONROLE_OVERRIDE` 环境变量。使用下面的语法。

替换 `-Cluster cluster-name` 行以指定您自己的集群名称。

```
<powershell>
[Environment]::SetEnvironmentVariable("ECS_ENABLE_AWSLOGS_EXECUTIONROLE_OVERRIDE", $TRUE, "Machine")
Initialize-ECSAgent -Cluster cluster-name -EnableTaskIAMRole -LoggingDrivers '["json-file","awslogs"]'
</powershell>
```

## Windows 代理安装用户数据
<a name="agent-service-userdata"></a>

此示例用户数据脚本在使用 **Windows\$1Server-2016-English-Full-Containers** AMI 启动的实例上安装 Amazon ECS 容器代理。该脚本已根据 [Amazon ECS 容器代理的 GitHub 存储库](https://github.com/aws/amazon-ecs-agent) README 页面中的代理安装说明进行了调整。

**注意**  
此脚本作为示例分享。使用经 Amazon ECS 优化的 Windows AMI 的 Windows 容器更容易上手。有关更多信息，请参阅 [为 Fargate 工作负载创建 Amazon ECS 集群](create-cluster-console-v2.md)。

有关如何在 Windows Server 2022 完整版上安装 Amazon ECS 代理的信息，请参阅 GitHub 上的[问题 3753](https://github.com/aws/amazon-ecs-agent/issues/3753)。

您可以将该脚本用于自己的容器实例（前提是它们是使用 **Windows\$1Server-2016-English-Full-Containers** AMI 版本启动的）。请记得替换 `windows` 行来指定自己的集群名称（如果您使用的不是名为 `windows` 的集群）。

```
<powershell>
# Set up directories the agent uses
New-Item -Type directory -Path ${env:ProgramFiles}\Amazon\ECS -Force
New-Item -Type directory -Path ${env:ProgramData}\Amazon\ECS -Force
New-Item -Type directory -Path ${env:ProgramData}\Amazon\ECS\data -Force
# Set up configuration
$ecsExeDir = "${env:ProgramFiles}\Amazon\ECS"
[Environment]::SetEnvironmentVariable("ECS_CLUSTER", "windows", "Machine")
[Environment]::SetEnvironmentVariable("ECS_LOGFILE", "${env:ProgramData}\Amazon\ECS\log\ecs-agent.log", "Machine")
[Environment]::SetEnvironmentVariable("ECS_DATADIR", "${env:ProgramData}\Amazon\ECS\data", "Machine")
# Download the agent
$agentVersion = "latest"
$agentZipUri = "https://s3.amazonaws.com/amazon-ecs-agent/ecs-agent-windows-$agentVersion.zip"
$zipFile = "${env:TEMP}\ecs-agent.zip"
Invoke-RestMethod -OutFile $zipFile -Uri $agentZipUri
# Put the executables in the executable directory.
Expand-Archive -Path $zipFile -DestinationPath $ecsExeDir -Force
Set-Location ${ecsExeDir}
# Set $EnableTaskIAMRoles to $true to enable task IAM roles
# Note that enabling IAM roles will make port 80 unavailable for tasks.
[bool]$EnableTaskIAMRoles = $false
if (${EnableTaskIAMRoles}) {
  $HostSetupScript = Invoke-WebRequest https://raw.githubusercontent.com/aws/amazon-ecs-agent/master/misc/windows-deploy/hostsetup.ps1
  Invoke-Expression $($HostSetupScript.Content)
}
# Install the agent service
New-Service -Name "AmazonECS" `
        -BinaryPathName "$ecsExeDir\amazon-ecs-agent.exe -windows-service" `
        -DisplayName "Amazon ECS" `
        -Description "Amazon ECS service runs the Amazon ECS agent" `
        -DependsOn Docker `
        -StartupType Manual
sc.exe failure AmazonECS reset=300 actions=restart/5000/restart/30000/restart/60000
sc.exe failureflag AmazonECS 1
Start-Service AmazonECS
</powershell>
```

# 为 Amazon ECS Windows 容器实例使用 HTTP 代理
<a name="http_proxy_config-windows"></a>

您可以将 Amazon ECS 容器实例配置为对 Amazon ECS 容器代理和 Docker 进程守护程序使用 HTTP 代理。如果您的容器实例无法通过 Amazon VPC互联网网关、NAT 网关或实例访问外部网络，则这非常有用。

要将 Amazon ECS Windows 容器实例配置为使用 HTTP 代理，请在启动时设置以下变量（利用 Amazon EC2 用户数据）来达到此目的。

`[Environment]::SetEnvironmentVariable("HTTP_PROXY", "http://proxy.mydomain:port", "Machine")`  
将 `HTTP_PROXY` 设置为某个 HTTP 代理的主机名（或 IP 地址）和端口号，供 Amazon ECS 代理用来连接到互联网。例如，在容器实例无法通过 Amazon VPC互联网网关、NAT 网关或实例访问外部网络时。

`[Environment]::SetEnvironmentVariable("NO_PROXY", "169.254.169.254,169.254.170.2,\\.\pipe\docker_engine", "Machine")`  
将 `NO_PROXY` 设置为 `169.254.169.254,169.254.170.2,\\.\pipe\docker_engine` 可筛选 EC2 实例元数据、任务的 IAM 角色以及来自代理的 Docker 进程守护程序流量。

**Example Windows HTTP 代理用户数据脚本**  
下面的示例用户数据 PowerShell 脚本会将 Amazon ECS 容器代理和 Docker 进程守护程序配置为使用您指定的 HTTP 代理。您还可以指定容器实例在其中自行进行注册的集群。  
要在启动容器实例时使用此脚本，请执行[启动 Amazon ECS Windows 容器实例](launch_window-container_instance.md)中的步骤。只需将下面的 PowerShell 脚本复制并粘贴到**用户数据**字段中（请务必将红色示例值替换为您自己的代理和集群信息）。  
启用任务的 IAM 角色需要使用 `-EnableTaskIAMRole` 选项。有关更多信息，请参阅 [Amazon EC2 Windows 实例附加配置](task-iam-roles.md#windows_task_IAM_roles)。

```
<powershell>
Import-Module ECSTools

$proxy = "http://proxy.mydomain:port"
[Environment]::SetEnvironmentVariable("HTTP_PROXY", $proxy, "Machine")
[Environment]::SetEnvironmentVariable("NO_PROXY", "169.254.169.254,169.254.170.2,\\.\pipe\docker_engine", "Machine")

Restart-Service Docker
Initialize-ECSAgent -Cluster MyCluster -EnableTaskIAMRole
</powershell>
```

# 配置 Amazon ECS Windows 容器实例以接收竞价型实例通知
<a name="windows-spot-instance-draining-container"></a>

当 Spot 价格超过您请求的最高价格或容量不再可用时，Amazon EC2 会终止、停止或休眠您的竞价型实例。Amazon EC2 将提供竞价型实例中断通知，这会在实例中断之前为其提供两分钟的警告。如果在实例上启用了 Amazon ECS 竞价型实例耗尽，则 ECS 会收到竞价型实例中断通知，并将实例置于 `DRAINING` 状态。

**重要**  
Amazon ECS 监控具有 `terminate` 和 `stop` 实例操作的竞价型实例中断通知。如果您在请求竞价型实例或竞价型实例集时指定了 `hibernate` 实例中断行为，则这些实例不支持 Amazon ECS 竞价型实例耗尽。

当某个容器实例设置为 `DRAINING` 时，Amazon ECS 将阻止安排放置在该容器实例上的新任务。连接即将耗尽的容器实例上处于 `PENDING` 状态的服务任务将立即停止。如果集群中有可用的容器实例，则在这些容器实例上启动替换服务任务。

您可以在启动实例时开启竞价型实例耗尽功能。在启动容器代理之前，您必须设置 `ECS_ENABLE_SPOT_INSTANCE_DRAINING` 参数。将 *my-cluster* 替换为您的集群的名称。

```
[Environment]::SetEnvironmentVariable("ECS_ENABLE_SPOT_INSTANCE_DRAINING", "true", "Machine")

# Initialize the agent
Initialize-ECSAgent -Cluster my-cluster
```

有关更多信息，请参阅 [启动 Amazon ECS Windows 容器实例](launch_window-container_instance.md)。