AWS CodeBuild ECR CannotPullContainerError

Cha*_*pat 23 amazon-ecr aws-codebuild

由于以下错误,CodeBuild 项目在配置阶段失败

BUILD_CONTAINER_UNABLE_TO_PULL_IMAGE: Unable to pull customer's container image. CannotPullContainerError: Error response from daemon: pull access denied for <image-name>, repository does not exist or may require 'docker login': denied: User: arn:aws:sts::<id>
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Cha*_*pat 55

问题出在图像拉取凭证上。当 ECRAccessPolicy 附加到项目服务角色时,CodeBuild 使用默认的 AWS CodeBuild 凭证来拉取映像。

我通过更新图像拉取凭据以使用项目服务角色来修复它。

在此输入图像描述

  • 感谢@chaitanya-bapta。对于无法找到在何处编辑现有构建项目的这些设置的其他人,您需要在构建项目的“编辑”菜单中选择“环境”,然后选择“覆盖图像”,然后选择“自定义图像”单选按钮按钮,然后选择“环境类型”。ECR 选项将出现在下面。 (14认同)

Evi*_*hea 8

terraformfwiw 我在使用创建代码构建管道时偶然发现了这个问题。

为此更改的设置image_pull_credentials_type应该设置为which而SERVICE_ROLE不是.CODEBUILDenvironmentresource "aws_codebuild_project"

感谢 Chaitanya 的回复,它通过接受的答案为我指明了这个方向。

  • 为了澄清 - 我添加了我的答案以扩展 Chaitanya 的答案。他们的答案是如何使用 AWS 控制台来解决这个问题,但是,这个问题可能会发生在使用 terraform 构建的系统中,这就是我添加答案的原因。 (2认同)

小智 7

为了增加清晰度(还没有足够的声誉来评论现有答案),如果尝试从私有存储库中提取,CodeBuild 项目服务角色需要具有以下权限:

{
   "Action":[
      "ecr:BatchCheckLayerAvailability",
      "ecr:BatchGetImage",
      "ecr:GetDownloadUrlForLayer"
   ],
   "Effect":"Allow",
   "Resource":[
      "arn:aws:ecr:us-east-1:ACCOUNT_ID:repository/REPOSITORY_NAME*"
   ]
}
Run Code Online (Sandbox Code Playgroud)

此外,ECR 存储库策略也应如下所示(如果需要,范围可向下延伸):

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowAccess",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::ACCOUNT_ID:root"
      },
      "Action": [
        "ecr:BatchCheckLayerAvailability",
        "ecr:BatchGetImage",
        "ecr:GetDownloadUrlForLayer"
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)