AWS ECS:VPC 终端节点和 NAT 网关

AWS ECS: VPC Endpoints and NAT Gateways

根据 NAT Gateways, they cannot send traffic over VPC endpoints 上的 AWS 文档,除非按以下方式设置:

A NAT gateway cannot send traffic over VPC endpoints [...]. If your instances in the private subnet must access resources over a VPC endpoint [...], use the private subnet’s route table to route the traffic directly to these devices.

按照文档中的 this 示例,我为我的 ECS 应用程序创建了以下配置:

  1. 具有 CIDR 172.31.0.0/16 的 VPC (vpc-app)。
  2. 具有以下路由的应用子网 (subnet-app) table:
    Destination     |  Target
    ----------------|-----------
    172.31.0.0/16   |   local  
    0.0.0.0/0       |  nat-main
  1. 子网 default-1vpc-app 中的 NAT 网关 (nat-main) 具有以下路由 Table:
    Destination     |    Target
    ----------------|--------------
    172.31.0.0/16   |     local  
    0.0.0.0/0       |  igw-xxxxxxxx
  1. 安全组 (sg-app) 端口 443 为 subnet-app 打开。
  2. 具有 vpc-appsubnet-appsg-app 的 VPC 端点(接口类型)用于以下服务:
    com.amazonaws.eu-west-1.ecr.api  
    com.amazonaws.eu-west-1.ecr.dkr  
    com.amazonaws.eu-west-1.ecs  
    com.amazonaws.eu-west-1.ecs-agent  
    com.amazonaws.eu-west-1.ecs-telemetry  
    com.amazonaws.eu-west-1.s3 (Gateway)

同样重要的是,我已经为 vpc-app 启用了 DNS 解析DNS 主机名,以及ecr-dkrecr-api VPC 端点启用私有 DNS 名称 选项。

我也试过只使用 Fargate 容器,因为它们没有 ECS Agent 的额外复杂性,并且因为根据文档:

Tasks using the Fargate launch type only require the com.amazonaws.region.ecr.dkr Amazon ECR VPC endpoint and the Amazon S3 gateway endpoint to take advantage of this feature.

这也行不通,每次我的 Fargate 任务 运行 我都看到 字节输出到源 nat-main 监控 下。

无论我尝试什么,subnet-app 中的 EC2 实例(和 Fargate 任务)仍在使用 nat-main 拉取图像,而不是转到 ECR 服务的本地地址。

我已重新启动 ECS 代理 并确保选中 ECS Interface VPC Endpoints guide AND the ECR Interface Endpoints 指南中的所有复选框。

我在这里错过了什么?

如有任何帮助,我们将不胜感激。

接口 VPC 端点使用 DNS 解析,而不是路由。

为了让您的配置生效,您需要确保在创建端点时选中启用私有 DNS 名称。这使您能够使用其默认 DNS 主机名而不是端点特定的 DNS 主机名向服务发出请求。

来自documentation

When you create an interface endpoint, we generate endpoint-specific DNS hostnames that you can use to communicate with the service. For AWS services and AWS Marketplace partner services, you can optionally enable private DNS for the endpoint. This option associates a private hosted zone with your VPC. The hosted zone contains a record set for the default DNS name for the service (for example, ec2.us-east-1.amazonaws.com) that resolves to the private IP addresses of the endpoint network interfaces in your VPC. This enables you to make requests to the service using its default DNS hostname instead of the endpoint-specific DNS hostnames. For example, if your existing applications make requests to an AWS service, they can continue to make requests through the interface endpoint without requiring any configuration changes.

另一种方法是更新您的应用程序以使用特定于端点的 DNS 主机名。

请注意,要使用私有 DNS 名称,必须为您的 VPC 启用 DNS 解析DNS 主机名

另请注意,为了在没有 NAT 网关的情况下使用 ECR/ECS,您需要配置 S3 端点(网关,需要路由 table 更新)以允许实例从中下载图像层托管它们的底层私有 Amazon S3 存储桶。 Setting up AWS PrivateLink for Amazon ECS, and Amazon ECR

中的更多信息

经过数小时的反复试验,并在@jogold 的大量帮助下,在 this 博客 post 中找到了丢失的部分:

The next step is to create a gateway VPC endpoint for S3. This is necessary because ECR uses S3 to store Docker image layers. When your instances download Docker images from ECR, they must access ECR to get the image manifest and S3 to download the actual image layers.

创建 S3 网关 VPCE 后,我忘记将其地址添加到 subnet-app 的路由 table,因此尽管对我的 ECR URI 的初始请求是使用内部地址发出的,从S3下载镜像还是使用了NAT网关。

添加条目后,NAT 网关的网络使用率急剧下降。

可以找到有关如何设置网关 VPCE 的更多信息here