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

AWS CDK(TypeScript)跨账号跨区域部署配置求助

AWS CDK v2(TypeScript)跨账号跨区域流水线部署问题

我正在用TypeScript搭建AWS CDK v2栈,要在账号A、区域A创建一个多阶段流水线栈,其中一个阶段需要通过CloudFormationCreateUpdateStackAction()部署到账号B、区域B。

已经完成所有账号和区域的引导操作,所有栈都配置了Environment Stack Property,现在卡在cdk.Pipeline()的配置上。网上找不到这个场景的有效示例,试过相关方案但没解决。

目前的阻塞问题都和Artifact Bucket及KMS密钥有关,不同配置会触发以下错误:

  • Error: Cannot add assets to a Stack that uses the BootstraplessSynthesizer
  • An error occurred while validating the artifact bucket 'ACCOUNT_B_BUCKET_NAME':The bucket named ACCOUNT_B_BUCKET_NAME is not located in the REGION_B AWS region. Choose a valid artifact bucket in 'REGION_B', or create a new artifact bucket to use in your pipeline.
  • Error: Artifact Bucket must have a KMS Key to add cross-account action 'ACTION_STAGE_NAME' (pipeline account: 'ACCOUNT_A', action account: 'ACCOUNT_B'). Create Pipeline with 'crossAccountKeys: true' (or pass an existing Bucket with a key)

我期望CDK栈能根据构造属性自动完成跨账号跨区域的资源部署配置。


2024年9月23日更新

MainStack.ts(运行于源AWS账号)

...
    const cp_stackName = `${service}-cp-stack`;
    const cp_props: PipelineStackProps = {
        // 继承的栈属性
        crossRegionReferences: true,

        // 流水线创建/运行的源账号信息
        env: {
          account: {SOURCE_ACCOUNT_A_ID},
          region: {SOURCE_ACCOUNT_A_REGION}
        },
        tags: props.tags,
        stackName: cp_stackName
    };
    new PipelineStack(this, cp_stackName, cp_props);

PipelineStack.ts(运行于源AWS账号,部分阶段部署至目标AWS账号)

// 提前创建好目标存储桶
   // 目标存储桶必须已配置KMS密钥
   const destinationBucketName = {从栈外部获取的桶名};

   // KMS密钥必须是字符串ARN引用,不能是Token引用
   const destinationEncryptionKey = Key.fromKeyArn(this, 'DestinationBucketKey', KEY_ARN);
   ...
    targetBucket = Bucket.fromBucketAttributes(this, 'DestBucket', {
        account: TARGET_ACCOUNT_B_ID,
        bucketName: destinationBucketName,
        region: TARGET_ACCOUNT_B_REGION,
        encryptionKey: destinationEncryptionKey // 重要:必须包含这个属性
    });
    ... 

    // 创建跨账号跨区域的阶段/操作
    const crossAcctCrossRegionAction = new CloudFormationCreateUpdateStackAction({
            account: TARGET_ACCOUNT_B_ID,
            region: TARGET_ACCOUNT_B_REGION,

            // 为简洁起见省略其他配置
        });

    ...
    const cp = new Pipeline(this, 'Pipeline', {
        ...
        // 默认启用跨账号部署
        // 为跨账号部署创建KMS密钥
        // 该配置控制流水线是否支持跨账号部署
        // 
        // 如果不需要跨账号部署,可以设为false以避免创建这些密钥、节省成本(此时工件桶会用AWS托管密钥加密)。
        // 但这样就无法再进行跨账号部署了。
        // crossAccountKeys: true,
        crossRegionReplicationBuckets: {
            'eu-west-1': targetBucket
        },
        reuseCrossRegionSupportStacks: true,

        // 提前创建好IAM角色
        // 角色需拥有访问目标存储桶的权限
        role: {PIPELINE_ROLE}
        ...

        // 流水线阶段
        stages: [
            {
               stageName: 'Source',
               actions: {省略配置}
            },
            {
               stageName: `Cross_Acct_Stage`,           
               actions: [crossAcctCrossRegionAction]
            }
        ]
   }

执行命令

npx aws-cdk deploy --all --app="npx ts-node --prefer-ts-exts {path_to_stack}.ts" --require-approval never

内容的提问来源于stack exchange,提问作者user1653042

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 23:52:02