AWS CDK `Bucket.encryptionKey?.arn` 没有 return 一个值,尽管它有一个与之关联的加密密钥

AWS CDK `Bucket.encryptionKey?.arn` doesn't return a value despite having an encryption key associated with it

我有一个存储桶 defined/managed 在不同的堆栈中。存储桶由 KMS 中管理的密钥加密。在我自己的堆栈中,我正在尝试创建一个角色并分别授予该角色对存储桶和密钥的读取和解密权限。

我按如下方式引用存储桶和密钥:

const otherBucket = Bucket.fromBucketName(this, 'otherBucket', '<BucketName>');
const otherKeyArn = otherBucket.encryptionKey?.keyArn || '';

我使用密钥 arn 为我的角色创建策略声明,它总是返回为“”。我在堆栈中创建了另一个存储桶,当我尝试访问该存储桶的加密密钥时,我得到了该存储桶的正确密钥 arn。

fromBucketName 方法中是否存在导致此问题的错误?我目前必须将密钥的字符串 arn 作为硬编码值存储在我的常量文件中,有更好的方法吗?

fromBucketName 方法没有进行任何 aws 调用来获取 S3 存储桶的属性,它只是创建一个 Javascript 传递属性的对象,在本例中,它只是存储桶名称。

const bucket = s3.Bucket.fromBucketName(
  this,
  "mybucket",
  "my-bucket-name"
);

针对这种情况的两种标准方法是:

第一种方法,将您最初创建存储桶的密钥名称导出为

const myBucket = new s3.Bucket(this, "my-bucket", {
  encryption: s3.BucketEncryption.KMS,
});

new cdk.CfnOutput(this, "my-bucket-arn-out", {
  value: myBucket.encryptionKey?.keyArn!,
  description: "This is my-bucket kms key arn",
  exportName: "my-bucket-kms-key-arn",
});

那么 import 就是我们需要使用 importValue

的地方
const s3KeyArn = cdk.Fn.importValue('my-bucket-kms-key-arn')

第二种方法,我们可以使用 custom resource 创建 Lambda 并调用 AWS Api 在幕后获取 Key Arn。