Amazon s3 AWS CDK`Bucket.encryptionKey?.arn`不';t返回一个值,尽管该值与加密密钥关联

Amazon s3 AWS CDK`Bucket.encryptionKey?.arn`不';t返回一个值,尽管该值与加密密钥关联,amazon-s3,aws-cdk,amazon-kms,Amazon S3,Aws Cdk,Amazon Kms,我有一个在不同堆栈中定义/管理的bucket。bucket由KMS中管理的密钥加密。在我自己的堆栈中,我试图创建一个角色,并分别授予该角色在bucket和密钥上的读取和解密权限 我参考铲斗和钥匙,如下所示: const otherBucket = Bucket.fromBucketName(this, 'otherBucket', '<BucketName>'); const otherKeyArn = otherBucket.encryptionKey?.keyArn || '';

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

我参考铲斗和钥匙,如下所示:

const otherBucket = Bucket.fromBucketName(this, 'otherBucket', '<BucketName>');
const otherKeyArn = otherBucket.encryptionKey?.keyArn || '';
const otherBucket=Bucket.fromBucketName(这个'otherBucket','');
const otherKeyArn=otherBucket.encryptionKey?.keyArn | | |“”;
我使用密钥arn为我的角色创建策略语句,它始终作为“”返回。我在堆栈中创建了另一个bucket,当我尝试访问该bucket的加密密钥时,我得到了该bucket的正确密钥arn


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

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

const bucket = s3.Bucket.fromBucketName(
  this,
  "mybucket",
  "my-bucket-name"
);
这种情况的两种标准方法是:

第一种方法,将原始创建bucket的密钥的名称导出为

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",
});
那么导入就是我们需要使用importValue的地方

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

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

您是否使用S3 master KMS密钥?不,这是我们为bucketMy堆栈生成的密钥。我的堆栈是独立的(正如S3 bucket是由另一个团队创建和管理的),在单独的回购中,第一种方法仍然有效吗?我真的很想避免使用Lambda。现在,我基本上只是使用了一个硬编码的arn作为密钥,但我想对此进行更改。@KeshavPotluri对于第一种方法,我们需要在创建s3 bucket的模板/cdk中进行更改,如果它由其他团队维护,我们将无能为力。他们至少需要为Kms密钥设置别名,然后您可以使用别名,而不是直接硬编码Kms密钥。太好了,谢谢!