AWS CDK创建多区域KMS密钥时如何指定副本生效区域
解决方案
你不需要额外找特殊构造器,CfnKey和CfnReplicaKey本身就是区域级资源,要让副本在指定区域生效,用CDK标准的多区域多栈部署模式即可:多区域KMS副本的本质是把CfnReplicaKey资源部署到你指定的目标区域,而不是在主密钥的所属区域创建其他区域的副本。
具体实现步骤如下:
步骤1:创建主密钥栈,指定部署到主区域
首先编写用于部署多区域主密钥的独立栈,实例化栈时指定部署的主区域,同时创建主密钥时必须开启multiRegion属性,这是多区域密钥的必要前提。
示例代码(TypeScript):
import * as cdk from 'aws-cdk-lib'; import * as kms from 'aws-cdk-lib/aws-kms'; // 主密钥栈,部署到指定主区域 class PrimaryKmsStack extends cdk.Stack { public readonly primaryKeyArn: string; constructor(scope: cdk.App, id: string, props?: cdk.StackProps) { super(scope, id, props); // 创建多区域主密钥 const primaryKey = new kms.CfnKey(this, 'PrimaryMultiRegionKey', { multiRegion: true, keySpec: 'SYMMETRIC_DEFAULT', keyUsage: 'ENCRYPT_DECRYPT', enabled: true }); this.primaryKeyArn = primaryKey.attrArn; } }
步骤2:创建副本密钥栈,指定部署到目标区域
为每个需要存放副本的区域编写独立的副本栈,实例化栈时指定对应的目标区域,栈内只需要传入主密钥ARN实例化CfnReplicaKey即可。
示例代码(TypeScript):
// 副本密钥栈,部署到指定的副本区域 class ReplicaKmsStack extends cdk.Stack { constructor(scope: cdk.App, id: string, primaryKeyArn: string, props?: cdk.StackProps) { super(scope, id, props); // 创建对应主密钥的区域副本 new kms.CfnReplicaKey(this, 'RegionReplicaKey', { primaryKeyArn: primaryKeyArn, enabled: true }); } }
步骤3:入口文件实例化多区域栈
在CDK入口文件中,分别给主密钥、各个区域副本指定对应的部署账号和区域即可。
示例代码(TypeScript):
const app = new cdk.App(); const awsAccountId = '你的12位AWS账号ID'; // 实例化主密钥栈,指定部署到美东1(us-east-1) const primaryStack = new PrimaryKmsStack(app, 'PrimaryKmsStack-us-east-1', { env: { account: awsAccountId, region: 'us-east-1' } }); // 实例化副本栈,指定部署到新加坡(ap-southeast-1) new ReplicaKmsStack(app, 'ReplicaKmsStack-ap-southeast-1', primaryStack.primaryKeyArn, { env: { account: awsAccountId, region: 'ap-southeast-1' } }); // 需要新增更多区域的副本时,只需要重复实例化副本栈,指定对应region参数即可
注意事项
- CDK会自动识别栈之间的依赖关系,优先部署主密钥栈,所有副本栈会等待主密钥创建完成后再启动部署
- 主密钥和各个区域副本的权限策略可以单独配置,不需要完全保持一致
- 如果你用L2层级的
Key构造器,也可以直接设置multiRegion: true,用同样的多栈模式实现跨区域副本部署,不需要强制使用L1构造器
内容的提问来源于stack exchange,提问作者MasterOfTheHouse
相关产品推荐
相关产品推荐

