AWS CDK `Bucket.encryptionKey?.arn` 不返回值,尽管有与之关联的加密密钥

Kes*_*uri 3 amazon-s3 amazon-kms aws-cdk

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

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

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

我使用密钥 arn 为我的角色创建策略语句,并且它始终返回为 ''。我在堆栈中创建了另一个存储桶,当我尝试访问该存储桶的加密密钥时,我得到了该存储桶的正确密钥 arn。

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

Bal*_*ala 5

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

const bucket = s3.Bucket.fromBucketName(
  this,
  "mybucket",
  "my-bucket-name"
);
Run Code Online (Sandbox Code Playgroud)

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

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

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",
});
Run Code Online (Sandbox Code Playgroud)

然后在我们需要的地方使用 importValue 进行导入

const s3KeyArn = cdk.Fn.importValue('my-bucket-kms-key-arn')
Run Code Online (Sandbox Code Playgroud)

第二种方法,我们可以使用自定义资源来创建 Lambda 并调用 AWS Api 在幕后获取 Key Arn。