在我的 Amazon Fargate 集群上运行任务时出现此错误。有没有人见过这种情况?
7 回答
转到文档以获取此问题的答案。
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_cannot_pull_image.html
由于您遇到500
错误,我会注意第一个错误描述的建议,“连接超时”:
当启动 Fargate 任务时,其弹性网络接口需要到 Internet 的路由来拉取容器映像。如果您在启动任务时收到类似以下的错误,这是因为到 Internet 的路由不存在:
CannotPullContainerError: API error (500): Get https://111122223333.dkr.ecr.us-east-1.amazonaws.com/v2/: net/http: request canceled while waiting for connection
要解决此问题,您可以:
对于公有子网中的任务,请在启动任务时将自动分配公有 IP指定为ENABLED ...
对于私有子网中的任务,在启动任务时将自动分配公共 IP指定为DISABLED,并在您的 VPC 中配置 NAT 网关以将请求路由到互联网...
如果您遇到与 ECS 任务未启动或启动时出现奇怪行为有关的任何其他问题,请查看ECS 故障排除主题的完整列表。
我遇到了类似的错误(404
而不是500
),但是,即使详细状态列出了错误,任务仍显示它正在运行。
事实证明,与任务关联的角色(在这种情况下与运行它的 EC2 实例的角色相同)无法由 ecs-tasks 承担。向角色添加以下信任关系语句解决了该问题:
{
"Effect": "Allow",
"Principal": {
"Service": "ecs-tasks.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
有关详细信息,请参阅任务执行角色的特定页面。
Fargate 必须分配公共 IP。有关详细信息,请参阅https://github.com/aws/amazon-ecs-agent/issues/1128
公共 IP不是强制性的,缺少创建工作 NAT 网关的规范。在GitHub 问题上,亚马逊技术人员不断重复您“只是”需要私有 IP + NAT,但事实并非如此。我自己为此苦苦挣扎,但最终在不为我的 Fargate 服务使用公共 IP 的情况下让它正常工作。
要让 Fargate 服务在没有公共 IP 的情况下访问 Internet,您需要设置一个具有 2 个子网的 VPC:
- 带有允许双向Internet 访问的 Internet 网关的公共子网
- 带有 NAT 网关的私有子网,仅允许传出Internet 访问
您可以通过 2 种方式创建这样的 VPC:转到Services
> VPC
> VPC Dashboard
,单击Launch VPC Wizard
并选择"VPC with Public and Private Subnets"
;或手动:
注意:以下所有步骤均在Services
>VPC
- 转到
Your VPCs
和Create a VPC
- 去
Subnets
和Create subnet
2 次private
子网- 将其附加到焦点所在的 VPC。无论 CIDR 块,您喜欢的任何可用区
public
子网- 将其附加到焦点所在的 VPC。无论 CIDR 块,您喜欢的任何可用区
- 转到
Internet Gateways
和Create internet gateway
- 随意命名
- 选择新创建的
Internet Gateway
,并将其附加到焦点所在的 VPCActions
Attach to VPC
- 转到
NAT Gateways
和Create NAT Gateway
- 重要:选择
public
子网 Create New EIP
或使用现有的,因为你有一个- 等待网关成为
Available
- 重要:选择
- 去
Route Tables
和Create route table
2 次private
路由表- 将其附加到焦点所在的 VPC
- 返回列表,选择路由表
Routes
底部的标签,Edit routes
Add route
, 目的地:0.0.0.0/0
, 以之前创建的 NAT 网关为目标Save routes
- 仍然选择了路由表,
Actions
并且Set Main Route Table
(如果还没有)
public
路由表- 将其附加到焦点所在的 VPC
- 返回列表,选择路由表
Routes
底部的标签,Edit routes
Add route
, 目的地:0.0.0.0/0
, 以先前创建的 Internet 网关为目标Save routes
Subnet Associations
底部的标签,Edit subnet associations
- 选择
public
子网,Save
- 把黄瓜放在眼睛上。
您放入public
子网的每项服务都将具有双向Internet 访问权限,并且您放入private
子网中的每项服务都将仅具有传出private
Internet 访问权限(是的,没有公共 IP的子网中的 Fargate 和 EC2 服务将具有 Internet 访问权限)。
当容器无法从注册表中拉取容器时会发生此错误。
- 检查您是否为容器分配了公共 IP 地址。目前,AWS 容器注册表没有 internal-in-vpn 端点。
- 检查您的容器是否可以连接到互联网(例如:nat instance 或类似的。
- 检查您与容器关联的安全组是否允许出站流量。如果您使用 terraform 或类似工具创建了 SG,您可能会发现它默认没有出站规则。
确保您的子网可以访问 Internet。在我的例子中,fargate 任务被部署到一个私有子网。虽然此子网配置了 nat 网关,但公共子网没有到 Internet 网关的路由。
您必须为您的服务分配一个公共 IP,您可以在服务定义期间执行此操作,但据我所知,您无法从更新菜单更新您的服务。