从 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 ... 无法安装工件...(访问被拒绝)