AWS Fargate ResourceInitializationError:无法提取机密或注册表身份验证:拉命令失败::信号:已杀死
Posted
技术标签:
【中文标题】AWS Fargate ResourceInitializationError:无法提取机密或注册表身份验证:拉命令失败::信号:已杀死【英文标题】:AWS Fargate ResourceInitializationError: unable to pull secrets or registry auth: pull command failed: : signal: killed 【发布时间】:2021-07-21 20:54:35 【问题描述】:这个有点让我毛骨悚然...我正在尝试在公有子网中的 VPC 中的 Fargate 上运行 Docker 映像。当我将其作为任务运行时,我得到:
ResourceInitializationError: unable to pull secrets or registry auth: pull
command failed: : signal: killed
如果我通过 NAT 在私有子网中运行任务,它就可以工作。如果我在默认 VPC 的公共子网中运行它,它也可以工作。
我已经检查了这里的建议:
Aws ecs fargate ResourceInitializationError: unable to pull secrets or registry auth
特别是,我设置了安全组以允许所有流量。还设置了网络 ACL 以允许所有流量。我什至对 IAM 权限非常开放,以便尝试消除这种可能性:
任务执行角色有:
"Action": [
"kms:*",
"secretsmanager:*",
"ssm:*",
"s3:*",
"ecr:*",
"ecs:*",
"ec2:*"
],
"Resource": "*",
"Effect": "Allow"
具有信任关系以允许 ecs-tasks 承担此角色:
"Version": "2012-10-17",
"Statement": [
"Effect": "Allow",
"Principal":
"Service": "ecs-tasks.amazonaws.com"
,
"Action": "sts:AssumeRole"
]
安全组是:
sg-093e79ca793d923ab All traffic All traffic All 0.0.0.0/0
而网络 ACL 是:
Inbound
Rule number Type Protocol Port range Source Allow/Deny
100 All traffic All All 0.0.0.0/0 Allow
* All traffic All All 0.0.0.0/0 Deny
Outbound
Rule number Type Protocol Port range Destination Allow/Deny
100 All traffic All All 0.0.0.0/0 Allow
* All traffic All All 0.0.0.0/0 Deny
我在子网上设置了流日志,可以看到双向的流量都是Accept Ok。
我没有设置任何接口终端节点以在不通过 Internet 网关的情况下访问 AWS 服务。
我还在 Fargate 实例创建时分配了公共 IP 地址。
这应该可行,因为公共子网应该可以通过 Internet 网关访问所有需要的服务。它也适用于默认 VPC 或私有子网。
谁能建议我还应该检查什么来调试它?
【问题讨论】:
【参考方案1】:原来我没有为 VPC 启用 DNS 支持。一旦启用,它就可以工作。
我没有在 Fargate 的任何文档中明确提到 DNS 支持 - 我猜它非常明显,或者它会如何查找所需的各种 AWS 服务。但认为在针对此错误消息的答案中值得注意。
【讨论】:
您是否还必须为容器使用的每个服务添加 VPC 端点? @santamanno 是的,您需要为每个服务创建一个 VPC 端点。 好的,谢谢。它必须位于公共子网、具有 NAT 的私有子网或所需服务的私有 VPC 终端节点上。无论如何,正如 OP 指出的那样,根据我的经验,必须启用 DNS 解析。【参考方案2】:ResourceInitializationError: unable to pull secrets or registry auth: pull command failed: : signal: killed
的一个潜在问题是禁用自动分配公共 IP。在我启用它(从 Scrath 重新创建服务)后,任务可以正常运行,没有问题。
【讨论】:
嗨 valdem,我应该在哪里启用自动分配公共 IP? 嗨,切兹。我更新了答案,添加了可以配置自动分配公共 IP 的屏幕截图 但是如果您不希望任务拥有公共 IP 怎么办? 这解决了这个问题,但是如果您想在私有子网中进行 Fargate,那么它仍然无法到达 ERC(在我的情况下,即使 DNS 开启且私有链路端点连接到 ECR) 对于私有子网,您可能需要一个 NAT 网关。这也将允许您在没有公共 IP 的情况下执行任务。请注意,NAT 网关非常昂贵。使用公共 IP 和锁定的安全组通常会更好。【参考方案3】:AWS 容器运行程序需要访问容器存储库和 AWS 服务。
如果您在公共子网上,最简单的方法是“自动分配公共 IP”以让您的容器访问互联网,即使您的应用不需要出口访问互联网。
否则,如果您只使用 AWS 服务(ECR,并且没有从 docker.io 提取图像),那么您可以使用 VPC endpoints to access ECR/S3/Cloudwatch,并在您的 VPC 上启用 DNS 选项。
私有子网也一样。
如果您使用的是 docker.io 映像,那么无论如何您都需要在子网中访问互联网。
【讨论】:
对不起,不起作用。我有一个带有 NAT 的私有子网(并且尝试过没有),并且所有端点都添加到了 VPC,但仍然无法访问...... 如果您有一个 NAT 网关用于专用网络上的出口流量(没有 Internet 网关/实例/任务上的公共 IP),则甚至不需要使用 VPC 端点。我建议您在子网上启动一个 EC2 实例,通过 ssh 连接到它,并在那里测试您的连接性。正确设置 AWS 网络可能会非常令人沮丧。【参考方案4】:我遇到了同样的问题。但就我而言,我是使用 RunTask 操作从 Lambda 函数触发 Fargate 容器。所以在 RunTask 操作中,我没有传递以下参数:
assignPublicIp:已启用
添加后,容器触发没有任何问题。
【讨论】:
【参考方案5】:清单:
“任务执行角色”有权访问 ECR。例如具有 AmazonECSTaskExecutionRolePolicy 角色 VPC 启用了 DNS 容器有一个公共 IP 子网可以访问互联网。例如为 VPC 分配 Internet 网关【讨论】:
这是一个很好的清单,适用于运行容器的人员,该容器将在私有子网中触发任务,其 VPC 路由表配置为通过位于公共子网中的 NAT 网关路由出站流量。【参考方案6】:对于那些不幸的灵魂,还有一件事要检查。
我的 VPC 中已经有一个互联网网关,为该 VPC 启用了 DNS,所有容器都获得了公共 IP,并且执行角色已经可以访问 ECR。但即便如此,我仍然遇到同样的错误。
原来问题出在路由表。我的 VPC 的路由表不包含用于将出站流量定向到 Internet 网关的路由,因此我的子网无法访问 Internet。
将第二行添加到将 0.0.0.0/0 流量路由到 Internet 网关的表中解决了该问题。
【讨论】:
这终于成功了!!谢谢!!!!!! 终于成功了!!【参考方案7】:对于使用 Fargate 的 AWS Batch,此错误是由禁用“分配公共 IP”设置触发的。
此设置可在作业定义步骤中配置。但是,在 Job Definition 创建之后,它就无法在 UI 中进行配置。
【讨论】:
这很有帮助,主要答案没有指定在哪里启用此参数,而且我没有面对“创建服务”界面,因为我正在使用 CDK 创建我的作业定义。【参考方案8】:在我处理上述错误的情况下,在运行 run-task 命令时(是的,不是通过服务路由),我没有在 aws ecs run-task --network-configuration
中指定安全组。这导致从任务 VPC 中获取默认 SG。我在那个 VPC 中的默认 SG 没有定义入站/出站规则。我只添加了出站规则以允许所有流量到任何地方并且错误消失了。
我的设置是 ECS/Fargate 任务将在私有子网中运行,并通过 VPC 接口端点进行 ECR 连接。我检查了上面提到的清单,并添加了 SG 规则。
【讨论】:
以上是关于AWS Fargate ResourceInitializationError:无法提取机密或注册表身份验证:拉命令失败::信号:已杀死的主要内容,如果未能解决你的问题,请参考以下文章