Aws ecs fargate ResourceInitializationError:无法提取机密或注册表身份验证

NIr*_*odi 61 amazon-web-services amazon-ecs docker-registry aws-fargate

我正在尝试在 aws-ecs-fargate-1.4.0 平台上运行一个私有存储库。

对于私有存储库身份验证,我遵循了文档并且运行良好。

以某种方式更新现有服务多次后,它无法运行任务并抱怨错误,例如

ResourceInitializationError: unable to pull secrets or registry auth: execution resource retrieval failed: unable to get registry auth from asm: service call has been retried 1 time(s): asm fetching secret from the service for <secretname>: RequestError: ...
Run Code Online (Sandbox Code Playgroud)

我没有更改它ecsTaskExecutionRole,它包含获取秘密值所需的所有策略。

  1. AmazonECSTaskExecutionRolePolicy
  2. CloudWatch 完全访问
  3. AmazonECSTaskExecutionRolePolicy
  4. 获取秘密值
  5. 获取SSMParamters

nat*_*eck 70

AWS 员工在这里。

您所看到的原因是 Fargate 平台版本 1.3.0 和 Fargate 平台版本 1.4.0 之间的网络工作方式发生了变化。作为从使用 Docker 到使用 containerd 的变化的一部分,我们还对网络的工作方式进行了一些更改。在 1.3.0 及以下版本中,每个 Fargate 任务都有两个网络接口:

  • 一个网络接口用于来自应用程序容器的应用程序流量,以及日志和容器镜像层拉取。
  • Fargate 平台本身使用辅助网络接口来获取 ECR 身份验证凭据并获取机密。

不过,这个辅助网络接口有一些缺点。此辅助流量未显示在您的 VPC 流日志中。此外,虽然大多数流量留在客户 VPC 中,但辅助网络接口正在向您的 VPC 之外发送流量。许多客户抱怨他们没有能力在这个辅助网络接口上指定网络级别的控制以及它能够连接到什么。

为了减少网络模型的混乱并为客户提供更多控制权,我们在 Fargate 平台版本 1.4.0 中更改为使用单个网络接口并将所有流量保留在您的 VPC 内,甚至是 Fargate 平台流量。用于获取 ECR 身份验证和任务机密的 Fargate 平台流量现在使用与其余任务流量相同的任务网络接口,您可以在 VPC 流日志中观察此流量,并使用您自己的 AWS VPC 中的路由表控制此流量.

但是,随着观察和控制 Fargate 平台网络的能力增强,您还需要负责确保在您的 VPC 中实际配置了一个网络路径,允许任务与 ECR 和 AWS Secrets Manager 进行通信。

有几种方法可以解决这个问题:

  • 使用公共 IP 地址将任务启动到公共子网中,以便它们可以使用 Internet 网关与 ECR 和其他支持服务进行通信
  • 在私有子网中启动任务,该子网的 VPC 路由表配置为通过公有子网中的 NAT 网关路由出站流量。通过这种方式,NAT 网关可以代表任务打开与 ECR 的连接。
  • 在私有子网中启动任务并确保您在 VPC 中配置了 AWS PrivateLink 终端节点,用于您需要的服务(用于图像拉取身份验证的 ECR、用于图像层的 S3 和用于密钥的 AWS Secrets Manager)。

您可以在此官方博客文章中阅读有关此更改的更多信息,在“任务弹性网络接口 (ENI) 现在运行其他流量”部分下

https://aws.amazon.com/blogs/containers/aws-fargate-launches-platform-version-1-4/

  • “它只会破坏少数实例”无疑是一个重大变化。这不是灰色阴影。 (51认同)
  • 我在私有子网 + NAT 上遇到了类似的错误。除了确保 NAT 设置正确之外,您还需要确保任务的角色可以提取机密。这些错误确实需要显示完整的消息,否则很难找到根本原因(https://github.com/aws/containers-roadmap/issues/1133) (7认同)
  • 我认为第一个选项“使用公共 IP 地址将任务启动到公共子网中,以便它们可以使用互联网网关与 ECR 和其他支持服务进行通信”并不是真正的最佳实践,因为它直接公开了正在运行的任务到公共互联网,这意味着互联网上的其他主机可以直接打开与这些任务的连接?另外,我们通常需要在这些任务之前放置一些网络负载均衡器和防火墙? (6认同)
  • 感谢您的详细解释@nathanpeck,但是我们今天在 us-west-1 地区面临着同样的问题。我们已经验证该任务正在公共子网中运行,具有公共 IP 地址。 (3认同)
  • SO:选项 1:不安全。选项 2:费用 38 美元/月。选项 3:不适用于多个帐户设置。 (3认同)
  • @nathanpeck 哪个选项的成本更低? (2认同)
  • 听说过语义版本控制吗?AWS?这将使其版本为 2.0.0。对于那些认为 Fargate 正在通过 DNS 或其他废话窃取数据的奇怪雪花来说,如果这是可配置的,那就太好了。 (2认同)
  • 具有公共 IP 地址的 Fargate 任务仍然可以具有拒绝入站流量的安全组。仅仅因为任务具有公共 IP 地址并不一定意味着公众能够向其发起入站通信,但它确实允许任务发起出站通信。希望这能解决您的担忧@YangLiu (2认同)

Rob*_*eiz 14

我不完全确定您的设置,但在我禁用 NAT 网关以节省一些美元后,我在 aws-ecs-fargate-1.4.0 平台上收到了非常相似的错误消息:

Stopped reason: ResourceInitializationError: unable to pull secrets or registry auth: execution resource retrieval failed: unable to retrieve ecr registry auth: service call has been retried 1 time(s): RequestError: send request failed caused by: Post https://api.ecr....
Run Code Online (Sandbox Code Playgroud)

事实证明,我必须为这些服务名称创建 VPC 端点:

  • com.amazonaws.REGION.s3
  • com.amazonaws.REGION.ecr.dkr
  • com.amazonaws.REGION.ecr.api
  • com.amazonaws.REGION.logs
  • com.amazonaws.REGION.ssm

我不得不降级到 aws-ecs-fargate-1.3.0 平台。降级后,可以从 ECR 中提取 Docker 映像,并且部署再次成功。

如果您使用的是没有 NAT 网关的机密管理器,则可能需要为com.amazonaws.REGION.secretsmanager.

  • 我不认为降级到以前的平台是使其正常工作的合理建议。我觉得这个答案也没有明确区分访问 Secrets API 和其他问题。就我而言,授予 IAM 权限 `secretsmanager:GetSecretValue` 以及开放网络访问(特别是当我尝试访问的 ECR 位于另一个帐户中时)是解决问题的关键。 (2认同)
  • 好吧,有时最新的平台版本有点问题。使用某些东西的第二个最新版本,很多时候是有意义的,因为第二个最新版本更成熟。与此同时,我升级到了1.4.0版本,一切正常。 (2认同)
  • 我不能同意你的立场@RobertReiz。当然,有时版本会包含错误;但它们经过了广泛的测试,并且发布日期也为您提供了成熟度的指示——而不仅仅是版本历史中的位置。另外,如果您现在可以使用 1.4.0,则可以排除平台版本是您一开始的问题;因为如果是由于错误造成的,您现在将使用 1.4.1 或更高版本,因为我确信他们正在使用语义版本控制。我认为你应该从你的答案中删除这个方面,因为它似乎不相关。 (2认同)

Pow*_*chu 12

将 Cloudformation 文件转换为 Terraform 文件后,我遇到了这个问题。

经过一番努力,我发现我的 Fargate 安全组中缺少一条出站规则。事实上,AWS 会自动创建“ALLOW ALL”规则,但 terraform 会禁用它。您需要添加到您的aws_security_group

resource "aws_security_group" "example" {
  # ... other configuration ...

  egress = [
    {
      from_port        = 0
      to_port          = 0
      protocol         = "-1"
      cidr_blocks      = ["0.0.0.0/0"]
      ipv6_cidr_blocks = ["::/0"]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处查看文档。


Ali*_*Ali 11

当 Fargate 代理无法创建或引导启动容器所需的资源或任务所属的资源时,会发生此错误。此错误仅在使用平台版本 1.4 或更高版本时发生,很可能是因为版本 1.4 使用 Task ENI(位于您的 VPC 中)而不是 Fargate ENI(位于 AWS 的 VPC 中)。我认为这可能是由于需要从 ECR 中提取图像所需的额外 IAM 权限造成的。你在使用任何私人链接吗?如果是,您可能想查看 ECR 端点的策略。

我会尝试复制它,但如果可以的话,我建议您向 AWS 开一张支持票,这样他们就可以仔细查看您的资源并提出更好的建议。


Man*_*gal 10

确保通过IGW或确保互联网连接NAT,并确保公共 IP 已启用(如果其 IGW 在 Fargate 任务/服务网络配置中)。

{
  "awsvpcConfiguration": {
    "subnets": ["string", ...],
    "securityGroups": ["string", ...],
    "assignPublicIp": "ENABLED"|"DISABLED"
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 这就是答案。使用非公共服务将无法到达图像。 (5认同)

小智 8

对于我的情况,我尝试了上述所有解决方案,但似乎没有一个有效。这是一个非常简单的错误,但如果没有一个答案适合您,其他人可能会发现有用的错误。

任务定义 json 文件的部分需要valueFrom在值的末尾。containerDefinition::

即就我而言:

{
  "containerDefinitions": [{
    "secrets": [{
      "name": "MY_SECRET",
      "valueFrom": "arn:aws:secretsmanager:<region>:<aws_account_id>:secret:<sm_resource_name>:MY_SECRET"
    }]
  }]
}
Run Code Online (Sandbox Code Playgroud)

正确的格式是:

{
  "containerDefinitions": [{
    "secrets": [{
      "name": "MY_SECRET",
      "valueFrom": "arn:aws:secretsmanager:<region>:<aws_account_id>:secret:<sm_resource_name>:MY_SECRET::"
    }]
  }]
}
Run Code Online (Sandbox Code Playgroud)

::请注意正确解决方案末尾的额外内容valueFrom


jen*_*nja 7

转至任务定义 > 更新任务定义。在任务角色下拉列表中选择ecsTaskExecutionRole

您需要ecsTaskExecutionRole在 IAM 设置中修改此设置以包含以下权限:

  1. SecretsManager读写
  2. CloudWatch完全访问
  3. 亚马逊SSM完全访问
  4. AmazonECSTaskExecutionRolePolicy

然后创建新的任务定义并且应该可以工作。

参考: https: //docs.aws.amazon.com/AmazonECS/latest/developerguide/specifying-sensitive-data-parameters.html


小智 6

由于 FARGATE 1.4.0 版中的 ECS 代理使用任务 ENI 来检索信息,因此对 Secret Manager 的请求将通过此 eni。

您必须确保 Secret Manager api (secretsmanager.{region}.amazonaws.com) 的流量是 'open' :

  • 如果您的任务是私有的,您必须有一个 vpc 端点 (com.amazonaws.{region}.secretsmanager) 或 NAT 网关,并且任务 ENI 的安全组必须允许 https 出站流量到它。

  • 如果您的任务是公开的,则安全组必须允许 https 出站流量到外部(或 AWS 公共 cidrs)。


Sai*_*ram 6

如果您使用的是公共子网并选择“不分配公共地址”,则可能会发生此错误。

如果您有一个私有子网并且您的 VPC 中没有互联网网关或 NAT 网关,这同样适用。它需要一条通往互联网的路线。

这是整个 AWS 生态系统的相同行为。如果 AWS 能够在这种情况下显示大横幅警告,那就太好了。


Zag*_*ags 5

该服务的安全组需要端口 443 上的出站访问(所有端口上的出站访问都适用)。否则,它无法访问 Secrets Manager。

  • 奇怪的是,它仅在我允许端口 443 上的入站访问时才有效!我正在使用 NAT 网关来允许 Internet 访问,但为什么它需要入站 443 端口访问(我通过端口 5000 为应用程序提供服务)! (3认同)

Jos*_*lff 5

我必须自动分配公共IP。

要从控制台执行此操作,运行任务时,... 在此输入图像描述

...我必须为“自动分配公共IP”选择“启用”。

在此输入图像描述


Raj*_*uka 5

您的问题可能是您没有将公共 IP 分配给集群。

在集群上创建任务时启用它。

自动分配公共 IP = TRUE


Lia*_*iam 5

新的 VPC 连接映射对解决这个问题有很大帮助。确保您的公共子网有到互联网网关的路由,您的配置应如下所示:

在此输入图像描述

如果没有,那么您将需要更改或添加路由表

至少有一个子网能够连接到互联网网关。

您需要这个来确保 ECS 可以从公共 url 中提取图像