跳至内容

如何解决在我尝试从 Amazon ECR 拉取映像时出现的 ResourceInitializationError 错误?

2 分钟阅读
0

当我的 Amazon Elastic Container Service (Amazon ECS) 任务尝试从 Amazon Elastic Container Registry (Amazon ECR) 拉取映像时,我收到 ResourceInitializationError 错误。

简短描述

当您启动 Amazon ECS 任务时,您可能会收到以下 ResourceInitializationError 错误消息之一:

“无法拉取密钥或注册表身份验证: 该任务无法从 Amazon ECR 拉取注册表身份验证: 该任务与 Amazon ECR 之间存在连接问题。请检查您的任务网络配置。RequestError:发送请求失败,原因是: 发布“https://api.ecr.region-code.amazonaws.com/”:拨打 tcp ip.xx.xx.xx.xx: 443:I/O 超时”

-或-

“无法拉取密钥或注册表身份验证:执行资源检索失败:无法检索 ecr 注册表身份验证:服务调用已重试 3 次: RequestError:发送请求失败,原因是: 发布“https://api.ecr.region-code.amazonaws.com/”:拨打 tcp ip.xx.xx.xx.xx: 443:I/O 超时。请检查您的任务网络配置。”

当您的 Amazon ECS 任务无法从 Amazon ECR 拉取容器映像或检索身份验证信息时,就会发生这些错误。

解决方法

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

测试任务连接

使用 AWSSupport-TroubleshootECSTaskFailedToStart 运行手册来测试您的任务连接。您必须在您的 Amazon ECS 集群资源所在的同一 AWS 区域使用运行手册。另外,使用最近失败的任务的 ID。如果失败的任务是 Amazon ECS 服务的一部分,则使用服务中最近一次失败的任务。在自动化执行期间,失败的任务必须在 ECS:DescribeTasks 中可见。默认情况下,已停止的任务将在进入 Stopped(已停止)状态后的 1 小时内保持可见。

根据自动化的输出,使用以下手动故障排除步骤之一。

检查从您的子网到互联网的路由

检查您在其中部署 Amazon ECS 任务的子网的路由表。确保您的任务具有通往互联网的默认路由 (0.0.0.0/0),并且任务安全组允许端口 443 上的出站流量。

公有子网

如果您的 AWS Fargate 任务位于公有子网中,则必须为任务分配公共 IP 地址。

要查看任务的弹性网络接口和私有 IP 地址,请运行以下 describe-tasks AWS CLI 命令:

aws ecs describe-tasks --cluster cluster-name --tasks task-arn

**注意:**将 cluster-name 替换为您的集群名称,将 task-arn 替换为您的任务 ARN。

要检查任务的网络接口上是否连接了公共 IP 地址,请运行以下 describe-network-interfaces 命令:

aws ec2 describe-network-interfaces --network-interface-ids example-eni

**注意:**将 example-eni 替换为您的任务的网络接口。

配置 Amazon ECS 以自动为与您的任务相关联的网络接口分配公共 IPv4 地址。运行新任务创建新服务时,为 Public IP(公共 IP)选择 Turned on(已启用)。

您无法自动为现有任务或服务分配公共 IP 地址。相反,要在激活自动公共 IP 地址分配的情况下重新创建服务,请运行以下 create-service 命令:

aws ecs create-service --cluster cluster-name --service-name service-name --task-definition taskdef:revision --desired-count 1 --launch-type FARGATE --network-configuration "awsvpcConfiguration={subnets=[subnet-aaaaaa,subnet-bbbbbb],securityGroups=[sg-ccccccc],assignPublicIp=ENABLED}"

**注意:**请将 cluster-name 替换为您的集群名称,将 service-name 替换为您的服务名称,将 taskdef:revision 替换为您的任务定义。将 subnet-aaaaaasubnet-bbbbbb 替换为您的子网,将 sg-ccccccc 替换为您的安全组。

确保您的集群的 Amazon Virtual Private Cloud (Amazon VPC) 连接已激活 DNS 主机名和 DNS 解析

私有子网

如果您的任务位于私有子网中,请根据您的互联网连接来源检查以下配置:

  • 如果您使用 NAT 网关,请将 NAT 网关放置于公有子网中。
  • 如果您使用 AWS PrivateLink,请验证 VPC 端点的安全组是否允许端口 443 上来自 VPC CIDR 或服务安全组的入站流量。

检查网络 ACL 和安全组设置

确保网络访问控制列表和安全组允许子网对端口 443 的出站访问

**注意:**Fargate 任务必须具有对端口 443 的出站访问权限,才能允许传出流量并访问 Amazon ECS 端点。

(仅限 PrivateLink)检查您的 Amazon VPC 端点

如果您使用 PrivateLink,则必须创建以下所需的端点

  • 对于 Amazon ECR,创建 com.amazonaws.region.ecr.dkrcom.amazonaws.region.ecr.api
  • 对于 Amazon Simple Storage Service (Amazon S3) 网关,创建 com.amazonaws.region.s3
  • 如果您使用 Amazon CloudWatch 来存储应用程序日志,则还要创建 com.amazonaws.region.logs

**注意:**在前面的端点中,请将 region 替换为您的区域。

有关详细信息,请参阅 ](https://docs.aws.amazon.com/AmazonECR/latest/userguide/vpc-endpoints.html#ecr-vpc-endpoint-considerations)Amazon ECR VPC 端点注意事项[。

如果您的 VPC 没有互联网网关且您的任务使用 awslogs 日志驱动程序,请为 CloudWatch Logs 创建 VPC 端点

确保 VPC 端点的安全组在 TCP 端口 443 上允许来自 Fargate 任务安全组或 VPC CIDR 范围的流量。

检查您的 IAM 角色和权限

确保 AWS Identity and Access Management (IAM) 任务执行角色拥有 AmazonECSTaskExecutionRolePolicy 或同等权限。

有关角色权限和任务执行角色的详细信息,请参阅 Amazon ECS 任务执行 IAM 角色

相关信息

验证 Amazon ECS 已停止任务连接