如何从IBucket接口获取一级CDK资源CfnBucket以配置S3复制规则
从IBucket接口配置S3桶L1 CloudFormation资源的实现方法
完全可以从IBucket出发完成你需要的配置,不需要将入参强转为s3.Bucket类型,具体实现步骤如下:
1. 提取IBucket对应的底层CloudFormation一级资源
通过CDK逃逸舱机制可以直接从IBucket实例获取底层CfnBucket资源,代码如下:
import * as s3 from 'aws-cdk-lib/aws-s3'; // 你已获取的IBucket实例 const sourceBucket = props.glueTable.bucket; // 提取底层CfnBucket const cfnBucket = sourceBucket.node.defaultChild as s3.CfnBucket; // 增加合法性判断,避免操作外部导入的桶 if (!cfnBucket) { throw new Error('当前IBucket为外部导入资源,无法在本栈修改其CloudFormation配置'); }
注意:只有当前CDK应用管理生命周期的桶(即当前栈或同应用内其他栈创建的桶)才会有
defaultChild属性,如果是通过Bucket.fromBucketArn等方法导入的外部存量桶,无法在当前栈通过这种方式修改配置,需要到桶所属的CDK栈中执行操作。
2. 从IBucket直接获取源账号信息
cdk.Stack.of()方法接收任意实现IConstruct接口的实例作为入参,IBucket本身就实现了该接口,不需要强转为s3.Bucket类型即可直接调用:
import * as cdk from 'aws-cdk-lib'; const sourceAccount = cdk.Stack.of(sourceBucket).account;
3. 配置桶复制规则
拿到CfnBucket实例后即可直接配置replicationConfiguration参数,示例如下:
cfnBucket.replicationConfiguration = { role: 'arn:aws-cn:iam::123456789012:role/s3-replication-role', // 替换为你的复制角色ARN rules: [ { status: 'Enabled', destination: { bucket: 'arn:aws-cn:s3:::target-bucket-name', // 替换为目标桶ARN account: '987654321098', // 替换为目标桶所属账号ID storageClass: 'STANDARD' }, prefix: '' // 配置需要复制的前缀,为空则复制全桶 } ] };
内容的提问来源于stack exchange,提问作者Marco Sinigaglia
相关产品推荐
相关产品推荐

