Codepipeline:权限不足无法使用 Amazon S3 对象密钥访问工件

Posted

技术标签:

【中文标题】Codepipeline:权限不足无法使用 Amazon S3 对象密钥访问工件【英文标题】:Codepipeline: Insufficient permissions Unable to access the artifact with Amazon S3 object key 【发布时间】:2018-08-03 23:03:32 【问题描述】:

您好,我创建了一个具有以下配置的代码管道项目:

从 Bitbucket 中提取的 S3 中的源代码。 使用 CodeBuild 构建,生成 docker 映像并将其存储到 Amazon ECS 存储库中。 部署提供商 Amazon ECS。

在尝试部署之前,所有过程都可以正常工作,由于某种原因,我在部署期间收到以下错误:

权限不足 无法使用 Amazon S3 访问工件 对象键“FailedScanSubscriber/MyAppBuild/Wmu5kFy”位于 Amazon S3 工件存储桶“codepipeline-us-west-2-913731893217”。这 提供的角色没有足够的权限。

在构建阶段,它甚至可以在 ECS 存储库中创建一个新的 docker 镜像。

我尝试了一切,更改了 IAM 角色和策略,添加了对 S3 的完全访问权限,我什至将 S3 存储桶设置为公开,但没有任何效果。我没有选择,如果有人可以帮助我,那就太好了,我对 AWS 的体验很差,所以任何帮助都值得赞赏。

【问题讨论】:

【参考方案1】:

我找到了解决方案。真正的问题是,当部署提供商设置为 Amazon ECS 时,我们需要生成一个输出工件,指示任务定义的名称和图像 uri,例如:

post_build:
    commands:
      - printf '["name":"your.task.definition.name","imageUri":"%s"]' $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG > imagedefinitions.json

artifacts:
    files: imagedefinitions.json

【讨论】:

这是一个非常令人困惑的错误消息,但根本问题正是这个,谢谢! 这确实是解决办法,但在我的情况下,name 应该是容器的名称。 可以在here找到图像定义文件的文档,并且可以找到教程here.【参考方案2】:

当 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

【讨论】:

谢谢...这正是问题所在。【参考方案3】:

对我来说,问题在于我的 CodeBuild 步骤是使用默认 AWS 托管 S3 密钥加密工件。

我的部署步骤使用跨账户角色,因此无法检索工件。将 Codebuild 加密密钥更改为我的 CMK 后,我的部署步骤就成功了。

【讨论】:

以上是关于Codepipeline:权限不足无法使用 Amazon S3 对象密钥访问工件的主要内容,如果未能解决你的问题,请参考以下文章

由于权限错误,无法在 AWS CodePipeline 中完成部署阶段

AWS CloudFormation CodePipeline:无法从 GitHub 获取存储库的内容

访问权限不足,无法创建文件夹

由于权限不足,无法读取配置文件

如果 repo 是组织存储库,AWS CodePipeline GitHub webhook 无法注册到 GitHub

s-s-rS 权限不足,无法执行此操作