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 BootstraplessSynthesizerAn 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
相关产品推荐
相关产品推荐

