AWS ECS:VPC端点和NAT网关

时间:2019-04-28 18:45:35

标签: amazon-web-services amazon-ecs amazon-vpc amazon-ecr

根据NAT Gateways上的AWS文档,除非以以下方式进行设置,否则他们将无法通过VPC endpoints发送流量:

  

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

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

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

我在这里想念什么?

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分: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 :(得分:1)

经过数小时的反复试验,在@jogold的大量帮助下,this博客文章中找到了缺失的部分:

  

下一步是为S3创建网关VPC端点。这是必需的,因为ECR使用S3存储Docker图像层。当您的实例从ECR下载Docker映像时,它们必须访问ECR以获得映像清单,并必须访问S3才能下载实际的映像层。

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

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

有关如何设置网关VPCE的更多信息,请参见here