2

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

我引用桶和密钥如下:

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

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

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

4

1 回答 1

3

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')

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

于 2021-03-26T21:08:37.477 回答