已停止(CannotPullContainerError:API 错误(500)?
Posted
技术标签:
【中文标题】已停止(CannotPullContainerError:API 错误(500)?【英文标题】:STOPPED (CannotPullContainerError: API error (500)? 【发布时间】:2018-06-30 07:29:13 【问题描述】:在我的 Amazon Fargate 集群上运行任务时出现此错误。有没有人见过这种情况?
【问题讨论】:
看起来你在你的 repo 中将http
错误输入为htt
,很可能
github.com/aws/amazon-ecs-agent/issues/1128 这个可能有帮助
我也在解决这个问题...这不是错字@MrDuk,只是他们截断了 ECS 控制台中的日志
Austin,你找到解决办法了吗?我正在尝试解决同样的问题——所有 SG 都是正确的,路由到 NAT 实例是正确的,等等
相关:AWS Fargate - CannotPullContainerError (500)?
【参考方案1】:
转到文档以获取此问题的答案。
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...
对于私有子网中的任务,在启动任务时为 Auto-assign public IP 指定 DISABLED,并在您的 VPC 中配置 NAT 网关以将请求路由到互联网...
如果您遇到与 ECS 任务无法启动或启动时出现奇怪行为有关的任何其他问题,请查看ECS troubleshooting topics 的完整列表。
我遇到了类似的错误(404
而不是500
),但是,即使详细状态列出了错误,任务仍显示它正在运行。
事实证明,ecs-tasks 无法承担与任务关联的角色(在这种情况下,与运行它的 EC2 实例的角色相同)。向角色添加以下信任关系声明解决了该问题:
"Effect": "Allow",
"Principal":
"Service": "ecs-tasks.amazonaws.com"
,
"Action": "sts:AssumeRole"
更多详情请查看Task Execution Roles上的具体页面。
【讨论】:
【参考方案2】:公共 IP 不是强制性的,缺少创建工作 NAT 网关的规范。在GitHub issue Amazon 技术人员不断重复您“只是”需要私有 IP + NAT,但事实并非如此。我自己为此苦苦挣扎了很多,但最终在不为我的 Fargate 服务使用公共 IP 的情况下让它正常工作。
要让 Fargate 服务在没有公共 IP 的情况下访问互联网,您需要设置一个具有 2 个子网的 VPC:
带有互联网网关的公共子网允许双向互联网访问 带有 NAT 网关的私有子网允许仅传出互联网访问您可以通过两种方式创建这样的 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
、Actions
、Attach to VPC
并将其附加到焦点所在的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
子网的每个服务都将具有 双向 互联网访问权限,并且您放入 private
子网的每个服务将具有仅传出 Internet 访问权限(是的,private
子网中没有公共 IP 的 Fargate 和 EC2 服务将具有 Internet 访问权限)。
【讨论】:
【参考方案3】:分配 公共 IP 对于 Fargate 是强制性的。 详情见https://github.com/aws/amazon-ecs-agent/issues/1128
【讨论】:
我相信 Fargate 启动类型不需要分配公共 IP。在this Doc page 的“任务网络注意事项”下,它显示“您可以配置 [Fargate 启动类型] 任务以接收公共 IP 地址”,暗示它是可选的。如果您想在 vpc 的私有子网中部署任务(使用“awsvpc”网络模式),这将是有意义的。【参考方案4】:当容器无法从注册表中拉取容器时会出现此错误。
-
检查您是否为容器分配了公共 IP 地址。目前,AWS 容器注册表没有 internal-in-*** 端点。
检查您的容器是否可以连接到互联网(例如:nat 实例或类似的。
检查您与容器关联的安全组是否允许出站流量。如果您使用 terraform 或类似工具创建 SG,您可能会发现它默认没有出站规则。
【讨论】:
【参考方案5】:您必须为您的服务分配一个公共 IP,您可以在服务定义期间执行此操作,但据我所知,您无法从更新菜单更新您的服务。
【讨论】:
【参考方案6】:如果您在无法访问 Internet 的私有 VPC 中运行 ECS,请设置VPC endpoint for ECR and S3 first。
【讨论】:
【参考方案7】:确保您的子网可以访问互联网。在我的例子中,fargate 任务被部署到一个私有子网。虽然此子网配置了 nat 网关,但公共子网没有到 Internet 网关的路由。
【讨论】:
以上是关于已停止(CannotPullContainerError:API 错误(500)?的主要内容,如果未能解决你的问题,请参考以下文章