基于CodePipeline实现跨账号CodeCommit部署故障求助
解决方案:AWS跨账号CodePipeline访问DevOps账号CodeCommit仓库
核心问题定位
CodePipeline默认会在流水线所在账号(Dev/QA/Prod)内查找CodeCommit资源,跨账号访问必须通过双向角色信任+资源权限配置实现,仅填写ARN或单角色配置无法解决账号隔离问题。
1. DevOps账号侧配置(共享CodeCommit资源)
创建跨账号访问角色
在DevOps账号中创建IAM角色(例如命名为CodePipelineCrossAccountSourceRole),信任Dev/QA/Prod三个账号的根用户:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::<Dev账号ID>:root", "arn:aws:iam::<QA账号ID>:root", "arn:aws:iam::<Prod账号ID>:root" ] }, "Action": "sts:AssumeRole" } ] }
附加CodeCommit访问权限
给上述角色绑定权限策略,允许访问目标CodeCommit仓库:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codecommit:GetBranch", "codecommit:GetCommit", "codecommit:GitPull", "codecommit:ListBranches" ], "Resource": "arn:aws:codecommit::<区域>:<DevOps账号ID>:<目标仓库名>" } ] }
KMS密钥权限补充(如果启用加密)
若使用DevOps账号的KMS密钥加密流水线 artifacts,需给上述角色添加KMS解密权限,同时给Dev/QA/Prod的CodePipeline角色添加加密权限。
2. Dev/QA/Prod账号侧配置(流水线访问授权)
给CodePipeline服务角色添加角色扮演权限
找到当前账号的CodePipeline服务角色(通常命名为AWSCodePipelineServiceRole-<区域>-<流水线名>),添加以下权限策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::<DevOps账号ID>:role/CodePipelineCrossAccountSourceRole" } ] }
配置CodePipeline源阶段
创建/编辑流水线的源阶段时:
- 选择CodeCommit作为源提供商
Repository Name字段填写完整的DevOps账号CodeCommit ARN(例如arn:aws:codecommit:<区域>:<DevOps账号ID>:<目标仓库名>)Role ARN字段填写DevOps账号中创建的跨账号角色ARN(arn:aws:iam::<DevOps账号ID>:role/CodePipelineCrossAccountSourceRole)
3. VPC与安全组验证
因为流水线在EKS集群VPC内执行,需确保:
- VPC已创建CodeCommit的VPC端点(
com.amazonaws.<区域>.codecommit) - 流水线所在资源的安全组允许访问该VPC端点的443端口
- VPC路由表已配置端点的路由规则,避免走公网访问CodeCommit
4. 快速排查步骤
- 用
aws sts assume-role命令在Dev/QA/Prod账号测试能否成功扮演DevOps的跨账号角色,再执行aws codecommit get-branch --repository-name <仓库名> --branch-name <分支名>验证访问权限 - 查看CodePipeline执行日志,定位具体错误(是
AccessDenied还是ResourceNotFound,前者是权限问题,后者是ARN拼写错误)
内容的提问来源于stack exchange,提问作者Math.Random
相关产品推荐
相关产品推荐

