#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.