Ведро AWS CDK.Ключ шифрования?.arn` не возвращает значение, несмотря на то, что с ним связан ключ шифрования

#amazon-s3 #aws-cdk #amazon-kms

Вопрос:

У меня есть корзина, которая определена/управляется в другом стеке. Корзина зашифрована ключом, управляемым в KMS. В моем собственном стеке я пытаюсь создать роль и предоставить разрешения на чтение и расшифровку для этой роли в корзине и ключе соответственно.

Я ссылаюсь на ведро и ключ следующим образом:

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

Я использую ключ arn для создания программных заявлений для своей роли, и он всегда возвращается как «. Я создал еще одно ведро в своем стеке, и когда я пытаюсь получить доступ к ключу шифрования для этого ведра, я получаю правильный ключ arn для этого ведра.

Есть ли ошибка в fromBucketName методе, которая вызывает это? В настоящее время мне приходится хранить строку arn для ключа в виде жестко закодированного значения в файле констант, есть ли лучший способ сделать это?

Комментарии:

1. Вы используете главный ключ KMS S3?

2. Нет, это ключ, который мы генерируем для ведра

Ответ №1:

Метод 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",
});
 

Тогда импорт-это то, что нам нужно, используя значение импорта

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

Второй метод, мы можем использовать пользовательский ресурс, который создает лямбда-код и вызывает Api AWS, чтобы получить ключ Arn за кулисами.

Комментарии:

1. Мои стеки разделены (как в корзине s3, которая была создана и управляется другой командой), и в отдельном репозитории будет ли работать первый метод? Очень хотелось бы избежать Лямбды для этого. На данный момент я просто в основном использовал жестко закодированный arn для ключа, но хотел бы это изменить.

2. @KeshavPotluri Для первого метода нам нужно изменить шаблон/cdk, в котором создается корзина s3, если она поддерживается другой командой, мы мало что можем сделать. Им, по крайней мере, нужно установить псевдоним для ключа Kms, тогда вы можете использовать имя псевдонима, а не напрямую жестко кодировать ключ kms.