首页 > 解决方案 > AWS ECS:VPC 终端节点和 NAT 网关

问题描述

根据关于NAT 网关的 AWS 文档,它们无法通过VPC 端点发送流量,除非以下列方式设置:

NAT 网关无法通过 VPC 端点发送流量 [...]。如果私有子网中的实例必须通过 VPC 端点访问资源 [...],请使用私有子网的路由表将流量直接路由到这些设备。

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

  1. vpc-app具有 CIDR 172.31.0.0/16 的VPC ( )。
  2. subnet-app具有以下路由表的应用子网 ( ):
    Destination     |  Target
    ----------------|-----------
    172.31.0.0/16   |   local  
    0.0.0.0/0       |  nat-main
  1. 子网中的NAT 网关 ( nat-main)具有以下路由表:vpc-appdefault-1
    Destination     |    Target
    ----------------|--------------
    172.31.0.0/16   |     local  
    0.0.0.0/0       |  igw-xxxxxxxx
  1. 安全组 ( sg-app),端口 443 为subnet-app.
  2. VPC Endpoints (Interface type) with vpc-app,subnet-appsg-app以下服务:
    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 端点启用了DNS 解析DNS 主机名vpc-app以及启用私有 DNS 名称选项。ecr-dkrecr-api

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

使用 Fargate 启动类型的任务仅需要 com.amazonaws.region.ecr.dkr Amazon ECR VPC 终端节点和 Amazon S3 网关终端节点即可利用此功能。

这也不起作用,每次我的Fargate任务运行时,我都会在's Monitoring下看到Bytes out to source的峰值。nat-main

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

我已重新启动ECS 代理并确保选中ECS 接口 VPC 端点指南和ECR 接口端点指南中的所有框。

我在这里想念什么?

任何帮助,将不胜感激。

标签: amazon-web-servicesamazon-ecsamazon-vpcamazon-ecr

解决方案


经过数小时的反复试验,并在@jogold 的大力帮助下,在这篇博文中找到了缺失的部分:

下一步是为 S3 创建网关 VPC 终端节点。这是必要的,因为 ECR 使用 S3 来存储 Docker 镜像层。当您的实例从 ECR 下载 Docker 映像时,它们必须访问 ECR 以获取映像清单和 S3 以下载实际的映像层。

创建 S3 网关 VPCE 后,我忘记将其地址添加到subnet-app的路由表中,因此尽管对我的 ECR URI 的初始请求是使用内部地址进行的,但从 S3 下载图像仍然使用 NAT 网关。

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

可以在此处找到有关如何设置网关 VPCE 的更多信息。


推荐阅读