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

时间:2021-03-26 20:33:34

标签: amazon-s3 aws-cdk amazon-kms

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

我引用桶和键如下:

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

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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

第一种方法,将原来创建bucket的key的名字导出为

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。

相关问题