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:无法提取机密或注册表身份验证:拉命令失败::信号:已杀死的主要内容,如果未能解决你的问题,请参考以下文章

AWS Fargate 启动时间

AWS ECS Fargate - 任务未运行

如何将 AWS-Fargate 用作 Python 脚本

AWS ECS Fargate 和端口映射

AWS Fargate 容器中的持久性

AWS Fargate - CannotPullContainerError (500)?