问题描述
我已经使用first run wizard of ECS on AWS console创建了集群,VPC,子网和Fargate服务,并将映像上传到了ECR并成功部署了。
现在,我需要该服务来访问远程数据库。因此,我需要在防火墙的白名单中添加IP。我分配了一个弹性IP,创建了NAT网关,并更新了this tutorial之后的路由器表。
我停止了任务,然后尝试再次运行它。但是,由于以下错误消息,我无法从ECR中提取图像以运行新任务:
CannotPullContainerError:来自守护程序的错误响应:Get https://account-id.dkr.ecr.sa-east-1.amazonaws.com/v2/:net / http:等待连接时请求被取消(等待标头时超过Client.Timeout)
我的设置:
- 具有CIDR 10.0.0.0/16的VPC(在ECS向导上自动创建)
- 具有以下路由器表的子网:
Destination | Target
----------------|-------------
10.0.0.0/16 | local
0.0.0.0/0 | nat-<nat-id>
-
在VPC上的NAT网关和在ECS向导中创建的子网以及分配的弹性IP。
-
当前,我允许入站和出站规则中的所有流量:
Type | Protocol | Port range | Source | Description - optional
-----|----------|------------|---------|------------------------
All | All | All |0.0.0.0/0| -
我想念什么?这是我完成自己想要的事情的唯一方法吗?有没有更简单的方法来实现? I found in Stack Overflow another way to associate an Elastic IP by using Application Load Balancer or Network Load Balancer。这是更好的方法吗?
解决方法
ECS向导创建具有两个公共子网 10.0.0.0/24
和10.0.1.0/24
的VPC。它们都使用一个指向 Internet网关(IGW)的RT。但是,从您的问题来看,您似乎已将其修改为使用NAT。
遗憾的是,这已经不起作用,如您所知。要解决此问题,您可以创建一个第三个子网(如果需要HA,则可以创建更多子网)。子网将为私有,没有互联网连接。相反,它将有一个新的RT,它将Internet流量路由到NAT。您的Fargate任务将在专用子网中启动。
新子网的新RT为:
Destination | Target
----------------|-------------
10.0.0.0/16 | local
0.0.0.0/0 | nat-<nat-id>
应该修改两个原始公共子网的RT,以将流量路由到IGW,就像原来那样:
Destination | Target
----------------|-------------
10.0.0.0/16 | local
0.0.0.0/0 | IGW
,
我想解释一下。您收到CannotPullContainerError
错误是因为没有通往互联网的路由。默认情况下,流向ECR的流量通过Internet。
您的Fargate服务在私有子网中运行,该子网没有到Internet的直接路由。为了获得Internet访问,运行Fargate任务的专用子网应在其路由表中具有路由,以将流量通过NatGateway路由到Internet(您已经完成了此操作)。在那里
Destination | Target
----------------|-------------
10.0.0.0/16 | local
0.0.0.0/0 | Natgateway
NatGateway只需将流量路由到Internet网关。 Nat网关部署在公共子网中,它将具有通过Internet网关到达Internet的路由。因此,部署Nat网关的子网应创建以下路由。
Destination | Target
----------------|-------------
10.0.0.0/16 | local
0.0.0.0/0 | InternetGateway
注意: 您还可以通过创建Private ECR VPC端点来与ECR私下交谈,而无需通过Internet。