如何在多个AWS CodePipeline中复用CodeBuild项目并配置权限
解决方案
1. 补全S3权限覆盖两个流水线的工件桶
你当前的S3权限仅针对teststack*前缀的桶,但Pipeline B的工件桶是mypipeline-ia1llzrl9at8,必须把这个桶及其中的对象加入资源列表:
testProject.role?.addToPrincipalPolicy( new PolicyStatement({ effect: Effect.ALLOW, actions: [ "s3:GetObject*", "s3:GetBucket*", "s3:List*", ], resources: [ "arn:aws:s3:::teststack*", "arn:aws:s3:::mypipeline-ia1llzrl9at8", "arn:aws:s3:::mypipeline-ia1llzrl9at8/*" ], }), );
2. 配置KMS密钥的密钥策略(关键步骤)
仅给CodeBuild角色添加IAM权限还不够,必须在KMS密钥自身的密钥策略中允许该角色访问:
- 登录AWS KMS控制台,找到对应的密钥
- 编辑密钥策略,添加以下语句(替换成你的CodeBuild角色ARN):
{ "Sid": "AllowSharedCodeBuildAccess", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::413000313257:role/[你的共享CodeBuild角色名称]" }, "Action": [ "kms:Decrypt", "kms:DescribeKey" ], "Resource": "*" }
注:下载加密S3工件只需要kms:Decrypt和kms:DescribeKey,可以去掉不需要的Encrypt、GenerateDataKey*等权限。
3. 安全获取CodeBuild角色,避免非空断言风险
CDK代码中testProject.role!的非空断言可能导致潜在问题,建议用可选链判断角色是否存在:
if (testProject.role) { // 在这里添加权限语句 } else { // 如果角色不存在,可手动创建IAM角色并关联到CodeBuild项目 const codeBuildRole = new Role(this, "SharedCodeBuildRole", { assumedBy: new ServicePrincipal("codebuild.amazonaws.com"), managedPolicies: [ ManagedPolicy.fromAwsManagedPolicyName("AWSCodeBuildDeveloperAccess") ] }); (testProject as CfnProject).role = codeBuildRole.roleArn; }
4. 验证Pipeline B的工件传递配置
确认Pipeline B中,传递给CodeBuild项目的工件来源路径、S3桶和KMS密钥匹配,没有引用错误的资源。
内容的提问来源于stack exchange,提问作者Gwen
相关产品推荐
相关产品推荐

