AWS CodePipeline触发多CodeBuild失败:Access Denied(GitHub源)
解决CodePipeline触发CodeBuild报Access Denied的问题
这种情况我之前处理过好几次,核心原因是CodePipeline触发CodeBuild时使用的权限身份和你手动启动CodeBuild时不一样——手动运行通常用的是你的IAM用户权限或者CodeBuild自身的服务角色,但CodePipeline是用它专属的服务角色来调用CodeBuild的,这个角色权限不足就会触发Access Denied。下面是一步步的排查和解决方法:
1. 检查CodePipeline服务角色的权限
首先确认CodePipeline的服务角色是否拥有调用CodeBuild的权限:
- 打开IAM控制台,搜索并找到你的CodePipeline对应的服务角色(默认命名格式是
AWSCodePipelineServiceRole-<区域>-<流水线名称>) - 查看该角色附加的权限策略,确保包含
codebuild:StartBuild动作,并且资源范围覆盖你的目标CodeBuild项目ARN - 如果没有对应的权限,添加一条类似下面的策略片段(替换成你的实际资源ARN):
{ "Effect": "Allow", "Action": "codebuild:StartBuild", "Resource": "arn:aws:codebuild:<你的区域>:<你的账号ID>:project/<你的CodeBuild项目名>" }
2. 检查CodeBuild项目的资源策略
有些场景下,CodeBuild项目会设置资源策略,限制只有特定主体能触发构建,这时候需要把CodePipeline的服务角色加入允许列表:
- 打开CodeBuild控制台,进入你的项目配置页面,切换到资源策略标签
- 如果已有策略,检查是否包含允许CodePipeline角色调用
codebuild:StartBuild的语句;如果没有,添加如下语句(替换对应的ARN):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "<你的CodePipeline服务角色ARN>" }, "Action": "codebuild:StartBuild", "Resource": "<你的CodeBuild项目ARN>" } ] }
3. 额外排查:KMS密钥权限(如果使用了加密)
如果你的CodeBuild项目使用了加密的S3存储桶或者其他需要KMS加密的资源,还要确认CodePipeline的服务角色拥有对应的KMS密钥解密权限:
- 找到对应的KMS密钥,在密钥策略中添加允许CodePipeline角色执行
kms:Decrypt和kms:GenerateDataKey的语句
如果以上步骤都没解决问题,建议去CloudTrail控制台搜索codebuild:StartBuild的API调用记录,查看具体的拒绝原因(比如是哪个资源的权限不足),这样能更精准定位问题。
内容的提问来源于stack exchange,提问作者Eugenio Valeiras
相关产品推荐
相关产品推荐

