amazon-web-services - AWS ECS:VPC 终端节点和 NAT 网关
问题描述
根据关于NAT 网关的 AWS 文档,它们无法通过VPC 端点发送流量,除非以下列方式设置:
NAT 网关无法通过 VPC 端点发送流量 [...]。如果私有子网中的实例必须通过 VPC 端点访问资源 [...],请使用私有子网的路由表将流量直接路由到这些设备。
按照文档中的这个示例,我为我的 ECS 应用程序创建了以下配置:
vpc-app
具有 CIDR 172.31.0.0/16 的VPC ( )。subnet-app
具有以下路由表的应用子网 ( ):
Destination | Target
----------------|-----------
172.31.0.0/16 | local
0.0.0.0/0 | nat-main
- 子网中的NAT 网关 (
nat-main
)具有以下路由表:vpc-app
default-1
Destination | Target
----------------|--------------
172.31.0.0/16 | local
0.0.0.0/0 | igw-xxxxxxxx
- 安全组 (
sg-app
),端口 443 为subnet-app
. - VPC Endpoints (Interface type) with
vpc-app
,subnet-app
和sg-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-dkr
ecr-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 接口端点指南中的所有框。
我在这里想念什么?
任何帮助,将不胜感激。
解决方案
经过数小时的反复试验,并在@jogold 的大力帮助下,在这篇博文中找到了缺失的部分:
下一步是为 S3 创建网关 VPC 终端节点。这是必要的,因为 ECR 使用 S3 来存储 Docker 镜像层。当您的实例从 ECR 下载 Docker 映像时,它们必须访问 ECR 以获取映像清单和 S3 以下载实际的映像层。
创建 S3 网关 VPCE 后,我忘记将其地址添加到subnet-app
的路由表中,因此尽管对我的 ECR URI 的初始请求是使用内部地址进行的,但从 S3 下载图像仍然使用 NAT 网关。
添加该条目后,NAT网关的网络使用率急剧下降。
可以在此处找到有关如何设置网关 VPCE 的更多信息。
推荐阅读
- tensorflow - Tensorflow:从多项分布中生成样本[空间有效方式?]
- sql - 表中的唯一字段变体是什么
- laravel - Laravel QR 阅读器不使用 .vue 文件
- python - 最适合存储交叉引用的文件格式
- replace - 如何在以另一个字符串开头的行中查找和替换字符串的所有实例?记事本++
- sql - Oracle SQL 时间格式
- javascript - 如何使用 js 更改 jquery 滑块值
- ruby-on-rails-5 - 更新与 ActiveRecord 关联的哈希中的信息 rails 5
- css - avoid redundant sass imports in webpack3 client bundle's
- javascript - Angular ngx-infinite-scroll is not working