AWS ECS:VPC端点和NAT网关

问题描述 投票:1回答:2

根据有关NAT Gateways的AWS文档,他们无法通过VPC endpoints发送流量,除非按以下方式设置:

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

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

  1. VPC(vpc-app),CIDR 172.31.0.0/16。
  2. 应用子网(subnet-app)与以下路由表:
    Destination     |  Target
    ----------------|-----------
    172.31.0.0/16   |   local  
    0.0.0.0/0       |  nat-main
  1. nat-main的子网vpc-app中的NAT网关(default-1),具有以下路由表:
    Destination     |    Target
    ----------------|--------------
    172.31.0.0/16   |     local  
    0.0.0.0/0       |  igw-xxxxxxxx
  1. 安全组(sg-app)为subnet-app开放了443号港口。
  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 VPCE启用了私有DNS名称选项,以下是详细信息部分的两个屏幕截图:ecr-dkrecr-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指南中的所有方框。

我在这里错过了什么?

任何帮助,将不胜感激。

amazon-web-services amazon-ecs amazon-vpc amazon-ecr
2个回答
1
投票

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

为了使配置正常工作,您需要确保在创建端点时选中了“启用专用DNS名称”。这使您可以使用其默认DNS主机名而不是特定于端点的DNS主机名向服务发出请求。

enter image description here

来自documentation

创建接口端点时,我们会生成特定于端点的DNS主机名,您可以使用这些主机名与服务进行通信。对于AWS服务和AWS Marketplace合作伙伴服务,您可以选择为端点启用专用DNS。此选项将私有托管区域与您的VPC相关联。托管区域包含服务的默认DNS名称的记录集(例如,ec2.us-east-1.amazonaws.com),该记录集解析为VPC中端点网络接口的专用IP地址。这使您可以使用其默认DNS主机名而不是特定于端点的DNS主机名向服务发出请求。例如,如果现有应用程序向AWS服务发出请求,则他们可以继续通过接口端点发出请求,而无需进行任何配置更改。

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

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

enter image description here

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


1
投票

经过几个小时的试验和错误,以及@jogold的大量帮助,在this博客文章中找到了丢失的部分:

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

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

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

有关如何设置Gateway VPCE的更多信息,请访问here

© www.soinside.com 2019 - 2024. All rights reserved.