4

根据关于NAT 网关的 AWS 文档,它们无法通过VPC 端点发送流量,除非以下列方式设置:

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

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

  1. vpc-app具有 CIDR 172.31.0.0/16 的VPC ( )。
  2. subnet-app具有以下路由表的应用子网 ( ):
    Destination     |  Target
    ----------------|-----------
    172.31.0.0/16   |   local  
    0.0.0.0/0       |  nat-main
  1. 子网中的NAT 网关 ( nat-main)具有以下路由表:vpc-appdefault-1
    Destination     |    Target
    ----------------|--------------
    172.31.0.0/16   |     local  
    0.0.0.0/0       |  igw-xxxxxxxx
  1. 安全组 ( sg-app),端口 443 为subnet-app.
  2. VPC Endpoints (Interface type) with vpc-app,subnet-appsg-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-dkrecr-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 接口端点指南中的所有框。

我在这里想念什么?

任何帮助,将不胜感激。

4

2 回答 2

5

经过数小时的反复试验,并在@jogold 的大力帮助下,在这篇博文中找到了缺失的部分:

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

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

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

可以在此处找到有关如何设置网关 VPCE 的更多信息。

于 2019-04-29T14:41:33.927 回答
3

接口 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 存储桶下载图像层。为 Amazon ECS 和 Amazon ECR 设置 AWS PrivateLink 中的更多信息

于 2019-04-29T07:39:52.020 回答