根据NAT Gateways上的AWS文档,除非以以下方式进行设置,否则他们将无法通过VPC endpoints发送流量:
NAT网关无法通过VPC端点发送流量。如果您在专用子网中的实例必须通过VPC端点访问资源,请使用专用子网的路由表将流量直接路由到这些设备。
按照文档中的this示例,我为ECS应用程序创建了以下配置:
vpc-app
)。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
打开了端口443的安全组(subnet-app
)。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主机名,以及启用专用DNS名称ecr-dkr
和ecr-api
VPCE的选项,这是“详细信息”部分的两个屏幕截图:
ecr-dkr和ecr-api。
我还尝试过仅使用 Fargate 容器,因为它们没有 ECS Agent 的复杂性,而且根据文档:>
使用Fargate启动类型的任务仅需要com.amazonaws.region.ecr.dkr Amazon ECR VPC终端节点和Amazon S3网关终端节点来利用此功能。
这也不起作用,每次我的 Fargate 任务运行时,我都会在nat-main
的下看到要输出的字节的峰值监视。
无论我如何尝试,subnet-app
中的EC2实例(和Fargate任务)仍在使用nat-main
提取图像,而不去ECR服务的本地地址。
我已经重新启动 ECS代理,并确保选中ECS Interface VPC Endpoints指南和ECR Interface Endpoints指南中的所有框。
我在这里想念什么?
任何帮助将不胜感激。
答案 0 :(得分:1)
接口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
中的更多信息答案 1 :(得分:1)