根据有关NAT Gateways的AWS文档,他们无法通过VPC endpoints发送流量,除非按以下方式设置:
NAT网关无法通过VPC端点发送流量[...]。如果私有子网中的实例必须通过VPC端点访问资源[...],请使用私有子网的路由表将流量直接路由到这些设备。
按照文档中的this示例,我为我的ECS应用程序创建了以下配置:
vpc-app
),CIDR 172.31.0.0/16。subnet-app
)与以下路由表: Destination | Target
----------------|-----------
172.31.0.0/16 | local
0.0.0.0/0 | nat-main
nat-main
的子网vpc-app
中的NAT网关(default-1
),具有以下路由表: Destination | Target
----------------|--------------
172.31.0.0/16 | local
0.0.0.0/0 | igw-xxxxxxxx
sg-app
)为subnet-app
开放了443号港口。vpc-app
,subnet-app
和sg-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-dkr
和ecr-api
VPCE启用了私有DNS名称选项,以下是详细信息部分的两个屏幕截图:ecr-dkr和ecr-api。
我也尝试过只使用Fargate容器,因为它们没有ECS代理的额外复杂性,并且因为根据文档:
使用Fargate启动类型的任务仅需要com.amazonaws.region.ecr.dkr Amazon ECR VPC端点和Amazon S3网关端点才能利用此功能。
这也不起作用,每次我的Fargate任务运行时,我都会看到在nat-main
的监控下,Bytes出现了一个尖峰。
无论我尝试什么,subnet-app
中的EC2实例(和Fargate任务)仍然使用nat-main
拉图像而不是去ECR服务的本地地址。
我重新启动了ECS代理,并确保检查ECS Interface VPC Endpoints指南和ECR Interface Endpoints指南中的所有方框。
我在这里错过了什么?
任何帮助,将不胜感激。
接口VPC端点使用DNS解析,而不是路由。
为了使配置正常工作,您需要确保在创建端点时选中了“启用专用DNS名称”。这使您可以使用其默认DNS主机名而不是特定于端点的DNS主机名向服务发出请求。
创建接口端点时,我们会生成特定于端点的DNS主机名,您可以使用这些主机名与服务进行通信。对于AWS服务和AWS Marketplace合作伙伴服务,您可以选择为端点启用专用DNS。此选项将私有托管区域与您的VPC相关联。托管区域包含服务的默认DNS名称的记录集(例如,ec2.us-east-1.amazonaws.com),该记录集解析为VPC中端点网络接口的专用IP地址。这使您可以使用其默认DNS主机名而不是特定于端点的DNS主机名向服务发出请求。例如,如果现有应用程序向AWS服务发出请求,则他们可以继续通过接口端点发出请求,而无需进行任何配置更改。
另一种方法是更新您的应用程序以使用特定于端点的DNS主机名。
请注意,要使用专用DNS名称,必须为您的VPC启用DNS解析和DNS主机名:
另请注意,为了在没有NAT网关的情况下使用ECR / ECS,您需要配置S3端点(网关,需要路由表更新),以允许实例从托管它们的底层私有Amazon S3存储桶下载映像层。有关Setting up AWS PrivateLink for Amazon ECS, and Amazon ECR的更多信息