AWS ECS Fargate ResourceInitializationError:无法提取机密或注册表身份验证

时间:2020-04-17 06:05:39

标签: amazon-web-services amazon-ecs docker-registry aws-fargate

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

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

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

的错误
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: ...

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

  1. AmazonECSTaskExecutionRolePolicy
  2. CloudWatchFullAccess
  3. AmazonECSTaskExecutionRolePolicy
  4. GetSecretValue
  5. GetSSMParamters

10 个答案:

答案 0 :(得分:48)

这里的 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 地址将任务启动到公共子网中,以便它们可以使用互联网网关与 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/

答案 1 :(得分:6)

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

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

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

答案 2 :(得分:5)

当Fargate代理无法创建或引导启动容器或任务所属的资源所需的资源时,将发生此错误。仅当使用平台版本1.4或更高版本(最有可能是because the version 1.4 uses Task ENI(在您的VPC中)而不是Fargate ENI(在AWS的VPC中)才出现此错误。我认为这可能是由于需要一些额外的IAM权限才能从ECR中提取图像所致。您是否在使用任何私人链接?如果是,您可能想看看ECR​​端点的策略。

我将尝试复制它,但我建议您尽可能使用AWS打开支持票证,以便他们可以仔细查看您的资源并提出更好的建议。

答案 3 :(得分:4)

我不确定您的设置,但是在禁用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....

原来,我必须为这些服务名称创建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创建一个VPC端点。

答案 4 :(得分:3)

如果Fargate Task / Service网络配置中的IGW,则确保通过IGWNAT的Internet连接并确保启用了公用IP。

{
  "awsvpcConfiguration": {
    "subnets": ["string", ...],
    "securityGroups": ["string", ...],
    "assignPublicIp": "ENABLED"|"DISABLED"
  }
}

答案 5 :(得分:3)

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

您必须确保Secret Manager api(secretsmanager。{region} .amazonaws.com)的流量为“打开”状态:

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

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

答案 6 :(得分:0)

我通过更新ECS服务的安全组中的规则解决了类似的问题。以下规则配置。

Inbound Rules:
* HTTP          TCP   80    0.0.0.0/0
Outbound Rules:
* All traffic   All   All   0.0.0.0/0

答案 7 :(得分:0)

使用Fargate作为平台版本1.4.0的启动类型时,我遇到了完全相同的问题。最后,由于我正在使用公共子网,所以我要做的就是enable the assignment of public ip进入任务,以允许该任务具有出站网络访问权限以提取映像。

当我尝试使用平台版本1.3.0创建服务时,我得到了解决的提示,并且任务创建失败并出现了类似但fortunately documented的错误。

答案 8 :(得分:0)

如果您的 Fargate 在无法访问互联网的私有子网中运行,从技术上讲,您的 vpc 内应该已经有 dkr vpc 端点,以便您的 Fargate(1.3 版及以下)可以到达该端点并启动容器.对于 Fargate 1.4 版,只需要额外的 api ecr 端点。

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

答案 9 :(得分:0)

我刚刚遇到了这个问题,我之所以遇到这个问题,是因为我忘记向与我的服务关联的安全组添加入站和出站规则。 (添加从我的 ALB 入站和出站 *)

相关问题