代码管道:权限不足 无法访问带有Amazon S3对象键的工件

33

你好,我创建了一个代码管道项目,配置如下:

  • 从Bitbucket中拉取S3的源代码。
  • 使用CodeBuild进行构建,生成Docker镜像并将其存储在Amazon ECS存储库中。
  • 部署提供程序为Amazon ECS。

整个过程工作正常,直到尝试部署时出现以下错误:

权限不足,无法访问位于 Amazon S3 构件存储桶 'codepipeline-us-west-2-913731893217' 中的 Amazon S3 物体密钥 'FailedScanSubscriber/MyAppBuild/Wmu5kFy' 的构件。提供的角色权限不足。

在构建阶段期间,它甚至能够在ECS存储库中创建新的Docker镜像。

我尝试了所有方法,更改了IAM角色和策略,在S3上添加了完全访问权限,甚至将S3存储桶设置为公共浏览,但仍无法解决问题。我已经没有选择了,如果有人能帮助我,那将是非常棒的,因为我对AWS的经验很少,所以任何帮助都会受到赞赏。

3个回答

41
我找到了解决方案。真正的问题在于,当部署提供程序设置为Amazon ECS时,我们需要生成一个输出构件(在CodeBuild中),指示任务定义的名称和镜像URI,例如:
phase:
  post_build:
    commands:
      - printf '[{"name":"your.task.definition.container.name","imageUri":"%s"}]' $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG > imagedefinitions.json

artifacts:
  files: imagedefinitions.json

这是一个非常令人困惑的错误信息,但其根本问题正是如此,谢谢! - rszalski
2
这确实是解决方法,但在我的情况下,“name”应该是容器的名称。 - webjay
1
可以在此处找到有关图像定义文件的文档,同时还提供了一个教程 - LCC
2
根据文档所述,构件不像此回复中的代码所示在“阶段”序列(例如pre_build、post_build)中。它在阶段序列之外! - Luxior

19

当 AWS CodeDeploy 无法从 AWS CodeBuild 找到构建工件时会出现此问题。 如果您进入 S3 存储桶并检查路径,实际上会发现工件对象不存在!

尽管错误提到了权限问题,但由于缺少工件对象,可能会出现此问题。

解决方案:正确配置 buildspec.yml 中的 artifacts 部分,并正确配置 AWS Codepipeline 阶段,指定输入和输出工件名称。

artifacts:
  files:
    - '**/*'
  base-directory: base_dir
  name: build-artifact-name
  discard-paths: no

请参考这篇文章 - https://medium.com/@shanikae/insufficient-permissions-unable-to-access-the-artifact-with-amazon-s3-247f27e6cdc3


谢谢,这正是问题所在。 - Tony

1
我的问题是,我的CodeBuild步骤使用了默认的AWS托管S3密钥加密工件。
我的部署步骤使用了跨账号角色,因此无法检索工件。一旦我将Codebuild加密密钥更改为原始的CMK,我的部署步骤就成功了。

谢谢你提供的好提示。我们目前正在面临这个问题,没有注意到在codebuild步骤中有一个额外的字段用于加密密钥。我们以为它会采用设置为artifact Bucket的加密密钥。 - NiklasLehnfeld

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接