

# Amazon ECS 接口 VPC 端点（AWS PrivateLink）
<a name="vpc-endpoints"></a>

您可以将 Amazon ECS 配置为使用接口 VPC 端点以改善 VPC 的安全状况。接口端点由 AWS PrivateLink 提供支持，通过该技术，您可以使用私有 IP 地址私密访问 Amazon ECS API。AWS PrivateLink 限制您的 VPC 和 Amazon ECS 之间的所有网络流量到达 Amazon 网络。您无需互联网网关、NAT 设备或虚拟私有网关。

有关 AWS PrivateLink 和 VPC 端点的更多信息，请参阅《Amazon VPC 用户指南》**中的 [VPC 端点](https://docs.aws.amazon.com/vpc/latest/privatelink/concepts.html#concepts-vpc-endpoints)。

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

### 从 2023 年 12 月 23 日起推出的区域中的端点注意事项
<a name="fargate-ecs-vpc-endpoint-region-considerations"></a>

在为 Amazon ECS 设置接口 VPC 端点之前，请注意以下事项：
+ 您必须拥有以下区域特定的 VPC 端点：
**注意**  
如果未配置所有端点，则您的流量将通过公共端点，而不是 VPC 端点。
  + `com.amazonaws.region.ecs-agent`
  + `com.amazonaws.region.ecs-telemetry`
  + `com.amazonaws.region.ecs`

  例如，加拿大西部（卡尔加里）（ca-west-1）区域需要以下 VPC 端点：
  + `com.amazonaws.ca-west-1.ecs-agent`
  + `com.amazonaws.ca-west-1.ecs-telemetry`
  + `com.amazonaws.ca-west-1.ecs`
+ 使用模板在新区域中创建 AWS 资源并且该模板是从 2023 年 12 月 23 日之前推出的区域复制而来时，则根据具体的复制来源区域，请执行以下操作之一。

  例如，复制来源区域为美国东部（弗吉尼亚州北部）（us-east-1），复制目的地区域为加拿大西部（卡尔加里）（ca-west-1）。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonECS/latest/developerguide/vpc-endpoints.html)

### Fargate 的 Amazon ECS VPC 端点注意事项
<a name="fargate-ecs-vpc-endpoint-considerations"></a>

当 `ecr.dkr` 和 `ecr.api` 的 VPC 端点所在 VPC 与部署 Fargate 任务的 VPC 相同时，则将使用该 VPC 端点。如果没有 VPC 端点，则其将使用 Fargate 接口。

在为 Amazon ECS 设置接口 VPC 端点之前，请注意以下事项：
+ 使用 Fargate 的任务不需要 Amazon ECS 的接口 VPC 端点，但您可能需要 Amazon ECR、Secrets Manager 或 Amazon CloudWatch Logs 的接口 VPC 端点，如以下几点所述。
  + 要允许您的任务从 Amazon ECR 拉取私有映像，您必须为 Amazon ECR 创建接口 VPC 端点。有关更多信息，请参阅《Amazon Elastic Container Registry 用户指南》**中的[接口 VPC 端点（AWS PrivateLink）](https://docs.aws.amazon.com/AmazonECR/latest/userguide/vpc-endpoints.html)。
**重要**  
如果您将 Amazon ECR 配置为使用接口 VPC 端点，则可以创建包含条件键的任务执行角色，以限制对特定 VPC 或 VPC 端点的访问。有关更多信息，请参阅 [Fargate 任务通过接口端点拉取 Amazon ECR 映像的权限](task_execution_IAM_role.md#task-execution-ecr-conditionkeys)。
如果您的任务采用仅 IPv6 配置并使用 Amazon ECR 双堆栈映像 URI，请注意 Amazon ECR 不支持双堆栈接口 VPC 端点。有关更多信息，请参阅《Amazon Elastic Container Registry 用户指南》**中的[通过 IPv6 发出请求入门](https://docs.aws.amazon.com/AmazonECR/latest/userguide/ecr-requests.html#ipv6-access-getting-started)。
  + 要允许您的任务从 Secrets Manager 拉取敏感数据，您必须为 Secrets Manager 创建接口 VPC 端点。有关更多信息，请参阅 *AWS Secrets Manager 用户指南*中的[将 Secrets Manager 与 VPC 端点结合使用](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html)。
  + 如果您的 VPC 没有互联网网关，并且您的任务使用 `awslogs` 日志驱动程序将日志信息发送到 CloudWatch Logs，则必须为 CloudWatch Logs 创建一个接口 VPC 端点。有关更多信息，请参阅 *Amazon CloudWatch Logs 用户指南*中的[将 CloudWatch Logs 与接口 VPC 端点结合使用](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/cloudwatch-logs-and-interface-VPC.html)。
+ VPC 端点当前不支持跨区域请求。确保在计划向 Amazon ECS 发出 API 调用的同一区域中创建端点。例如，假设您要在美国东部（弗吉尼亚州北部）运行任务。然后，您必须在美国东部（弗吉尼亚州北部）创建 Amazon ECS VPC 端点。在任何其他区域创建的 Amazon ECS VPC 端点都无法在美国东部（弗吉尼亚州北部）运行任务。
+ VPC 端点仅通过 Amazon Route 53 支持 Amazon 提供的 DNS。如果您希望使用自己的 DNS，可以使用条件 DNS 转发。有关更多信息，请参阅*《Amazon VPC 用户指南》*中的 [DHCP 选项集](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_DHCP_Options.html)。
+ 附加到 VPC 端点的安全组必须允许 TCP 端口 443 上来自 VPC 私有子网的传入连接。
+ Envoy 代理的 Service Connect 管理使用 `com.amazonaws.region.ecs-agent` VPC 端点。当您不使用 VPC 端点时，Envoy 代理的 Service Connect 管理将使用该区域中的 `ecs-sc` 端点。有关每个区域的 Amazon ECS 端点的列表，请参阅 [Amazon ECS 端点和配额](https://docs.aws.amazon.com/general/latest/gr/ecs-service.html)。

### EC2 的 Amazon ECS VPC 端点注意事项
<a name="ec2-ecs-vpc-endpoint-considerations"></a>

在为 Amazon ECS 设置接口 VPC 端点之前，请注意以下事项：
+ 使用 EC2 的任务要求启动它们的容器实例运行 `1.25.1` 或更高版本的 Amazon ECS 容器代理。有关更多信息，请参阅 [Amazon ECS Linux 容器实例管理](manage-linux.md)。
+ 要允许您的任务从 Secrets Manager 拉取敏感数据，您必须为 Secrets Manager 创建接口 VPC 端点。有关更多信息，请参阅 *AWS Secrets Manager 用户指南*中的[将 Secrets Manager 与 VPC 端点结合使用](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html)。
+ 如果您的 VPC 没有互联网网关，并且您的任务使用 `awslogs` 日志驱动程序将日志信息发送到 CloudWatch Logs，则必须为 CloudWatch Logs 创建一个接口 VPC 端点。有关更多信息，请参阅 *Amazon CloudWatch Logs 用户指南*中的[将 CloudWatch Logs 与接口 VPC 端点结合使用](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/cloudwatch-logs-and-interface-VPC.html)。
+ VPC 端点当前不支持跨区域请求。确保在计划向 Amazon ECS 发出 API 调用的同一区域中创建端点。例如，假设您要在美国东部（弗吉尼亚州北部）运行任务。然后，您必须在美国东部（弗吉尼亚州北部）创建 Amazon ECS VPC 端点。在任何其他区域创建的 Amazon ECS VPC 端点都无法在美国东部（弗吉尼亚州北部）运行任务。
+ VPC 端点仅通过 Amazon Route 53 支持 Amazon 提供的 DNS。如果您希望使用自己的 DNS，可以使用条件 DNS 转发。有关更多信息，请参阅*《Amazon VPC 用户指南》*中的 [DHCP 选项集](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_DHCP_Options.html)。
+ 附加到 VPC 端点的安全组必须允许 TCP 端口 443 上来自 VPC 私有子网的传入连接。

## 了解 Amazon ECS 端点命名模式
<a name="ecs-endpoint-naming-patterns"></a>

需要注意的是，Amazon ECS 代理可能会向带有编号后缀的端点发出请求，例如：
+ `ecs-a-1.region.amazonaws.com`、`ecs-a-2.region.amazonaws.com` 等，用于代理端点
+ `ecs-t-1.region.amazonaws.com`、`ecs-t-2.region.amazonaws.com` 等，用于遥测端点

之所以会出现此行为，是因为 Amazon ECS 代理使用 [DiscoverPollEndpoint](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DiscoverPollEndpoint.html) API 来动态确定要连接的特定端点。如果您的 VPC 端点未正确处理这些带编号的端点变体，则即使您已为基本名称配置了 VPC 端点，代理也会回滚到使用公共端点。

### DiscoverPollEndpoint API 的作用
<a name="ecs-discoverpollendpoint-role"></a>

Amazon ECS 代理使用 [DiscoverPollEndpoint](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DiscoverPollEndpoint.html) API 来发现合适的端点以轮询任务。当代理调用此 API 时，它会收到一个可能包含带编号后缀的特定端点 URL。为确保您的 VPC 端点正常工作，您的网络配置必须允许代理：

1. 访问 DiscoverPollEndpoint API

1. 连接到返回的端点 URL，包括带有编号后缀的 URL

如果您要排查 VPC 端点连接问题，则请确认您的代理可以同时访问基本端点和 DiscoverPollEndpoint API 可能返回的任何带编号的变体。

## 为 Amazon ECS 创建 VPC 端点
<a name="ecs-setting-up-vpc-create"></a>

要为 Amazon ECS 服务创建 VPC 端点，请使用《Amazon VPC 用户指南》中的 [Access an AWS service using an interface VPC endpoint](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#create-interface-endpoint)**。如果您的 VPC 中当前有容器实例，则应按其列出的顺序创建端点。如果您计划在创建 VPC 端点后创建容器实例，则顺序无关紧要。

**注意**  
如果未配置所有端点，则您的流量将通过公共端点，而不是 VPC 端点。  
创建端点时，Amazon ECS 还会为该端点创建一个私有 DNS 名称。例如，ecs-agent 为 `ecs-a.region.amazonaws.com`，ecs-telemetry 为 `ecs-t.region.amazonaws.com`。
+ `com.amazonaws.region.ecs-agent`
+ `com.amazonaws.region.ecs-telemetry`
+ `com.amazonaws.region.ecs`

**注意**  
*区域* 表示 Amazon ECS 支持的 AWS 区域的区域标识符，例如美国东部（俄亥俄州）区域的 `us-east-2`。

`ecs-agent` 端点使用 `ecs:poll` API，而 `ecs-telemetry` 端点使用 `ecs:poll` 和 `ecs:StartTelemetrySession` API。

如果您当前有使用 EC2 启动类型的任务，则在创建 VPC 端点后，每个容器实例都需要采用新的配置。为实现此目的，您必须重新启动每个容器实例或重新启动每个容器实例上的 Amazon ECS 容器代理。要重新启动容器代理，请执行以下操作。<a name="procedure_restart_ecs_agent"></a>

**重启 Amazon ECS 容器代理**

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

1. 停止 容器代理。

   ```
   sudo docker stop ecs-agent
   ```

1. 启动容器代理。

   ```
   sudo docker start ecs-agent
   ```

在创建 VPC 端点并在每个容器实例上重新启动 Amazon ECS 容器代理后，所有新启动的任务都将采用新配置。

## 为 Amazon ECS 创建 VPC 端点策略
<a name="vpc-endpoint-policy"></a>

您可以为 VPC 端点附加控制对 Amazon ECS 的访问的端点策略。该策略指定以下信息：
+ 可执行操作的主体。
+ 可执行的操作。
+ 可对其执行操作的资源。

有关更多信息，请参阅《Amazon VPC 用户指南》**中的[使用 VPC 端点控制对服务的访问](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-access.html)。

**示例：Amazon ECS 操作的 VPC 端点策略**  
下面是用于 Amazon ECS 的端点策略示例。当附加到端点时，此策略会向您授予创建和列出集群的访问权限。`CreateCluster` 和 `ListClusters` 操作不接受任何资源，因此，所有资源的资源定义将设置为 \$1。

```
{
   "Statement":[
    {
      "Principal":"*",
      "Effect": "Allow",
      "Action": [
        "ecs:CreateCluster",
        "ecs:ListClusters"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}
```