You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在多个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 16:55:25