

# 增加 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)。要使用 Amazon CLI 开启该功能，请参阅[使用 Amazon 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 请求）**选项。要使用 Amazon 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.amazonaws.cn/vpc/latest/userguide/security-group-rules.html)**。

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

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

  ```
  aws iam [create-service-linked-role](https://docs.amazonaws.cn/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 请求**选项。要使用 Amazon CLI 禁用此选项，使用以下命令：  

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

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

每个容器实例都有一个默认网络接口，该接口称为中继网络接口。使用以下命令通过查询 `ecs.awsvpc-trunk-id` 属性来列出具有增加的 ENI 限制的容器实例，这表明其具有中继网络接口。
+ [list-attributes](https://docs.amazonaws.cn/cli/latest/reference/ecs/list-attributes.html) (Amazon 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.amazonaws.cn/powershell/latest/reference/items/Get-ECSAttributeList.html) (Amazon Tools for Windows PowerShell)

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