从 S3 下载工件时代码构建访问被拒绝

Posted

技术标签:

【中文标题】从 S3 下载工件时代码构建访问被拒绝【英文标题】:Code Build Access denied while downloading artifact from S3 【发布时间】:2019-05-14 07:24:01 【问题描述】:

我的 CodeBuild 配置了 CodePipeline。 S3 是我的神器商店。尽管附加了具有足够访问权限的 IAM 角色,但我仍然收到拒绝访问消息。

错误信息截图

我已经检查了与 Codebuild 关联的服务角色。它附有以下政策。


"Version": "2012-10-17",
"Statement": [
    
        "Effect": "Allow",
        "Resource": [
            "arn:aws:logs:ap-southeast-1:682905754632:log-group:/aws/codebuild/Build",
            "arn:aws:logs:ap-southeast-1:682905754632:log-group:/aws/codebuild/Build:*"
        ],
        "Action": [
            "logs:CreateLogGroup",
            "logs:CreateLogStream",
            "logs:PutLogEvents"
        ]
    ,
    
        "Effect": "Allow",
        "Resource": [
            "arn:aws:s3:::codepipeline-ap-southeast-1-*"
        ],
        "Action": [
            "s3:PutObject",
            "s3:GetObject",
            "s3:GetObjectVersion"
        ]
    
]

但是当我使用 IAM 策略验证器对其进行测试时,我收到以下错误消息。

根据对这个问题的公认答案,我目前拥有的政策应该允许我从 S3 毫无问题地获取工件 - AWS Codebuild fails while downloading source. Message: Access Denied

如何摆脱拒绝访问消息?

【问题讨论】:

【参考方案1】:

当您已经拥有 CodeBuild 项目并将其集成到 CodePipeline 管道时,通常会发生这种情况。当您将 Codebuild 项目与 CodePipeline 集成时,该项目将从 CodePipeline 源输出中检索其源。源输出将存储在工件存储位置,这是一个 S3 存储桶,可以是 CodePipeline 创建的默认存储桶,也可以是您在创建管道时指定的存储桶。

因此,您需要向 CodeBuild 服务角色提供访问 S3 中的 CodePipline 存储桶的权限。该角色需要权限才能将 S3 对象放入存储桶以及获取对象。

我尝试过的政策同样有效:


  "Version": "2012-10-17",
  "Statement": [

  "Sid": "CodeBuildDefaultPolicy",
  "Effect": "Allow",
  "Action": [
    "codebuild:*",
    "iam:PassRole"
  ],
  "Resource": "*"      
,

  "Sid": "CloudWatchLogsAccessPolicy",
  "Effect": "Allow",
  "Action": [
    "logs:FilterLogEvents",
    "logs:GetLogEvents"
  ],
  "Resource": "*"
,

  "Sid": "S3AccessPolicy",
  "Effect": "Allow",
  "Action": [
    "s3:CreateBucket",
    "s3:GetObject",
    "s3:List*",
    "s3:PutObject"
  ],
  "Resource": "*"
  
 ]

政策模拟器

AWS Reference

【讨论】:

嘿!谢谢你帮我解决这个问题。因此,我需要做的就是将此策略添加到代码管道角色中,这应该有效,对吧?我需要允许 CodePipeline 角色访问 codebuild 角色吗?我说对了吗? 您需要一个 AWS CodeBuild 服务角色,以便 AWS CodeBuild 可以代表您与依赖的 AWS 服务(代码管道)进行交互 我发布的策略来自我的 codebuild 服务角色,它有权从代码管道获取 getObject 和 putObject。我将尝试使用 codebuild 创建一个新的 CodePipeline,看看问题是否再次发生。 是的,请参考以下链接,这将有助于了解服务角色以及如何将 AWS CodePipeline 与 AWS CodeBuild 一起使用 docs.aws.amazon.com/codebuild/latest/userguide/… 我遇到了问题,我有 get、getobjectversion 并已经放在那里。我添加了“s3:List*”...我很确定代码构建不需要 createBucket 权限:)

以上是关于从 S3 下载工件时代码构建访问被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 lambda 函数在尝试访问 S3 存储桶时会被拒绝访问?

使用 IAM 角色从 ECS 的 S3 存储桶中提取对象被拒绝访问

未能执行目标... maven-install-plugin ... 无法安装工件...(访问被拒绝)

Amazon S3 上传访问被拒绝

Amazon S3 访问仅在 CopyObject 中被拒绝

Amazon Cloudfront 签名 URL 访问被拒绝问题