AWS Java SDK: указание идентификатора ключа KMS для EBS
В AWS Java SDK 1.10.69 я могу запустить экземпляр и указать сопоставления томов EBS для этого экземпляра:
RunInstancesRequest runInstancesRequest = new RunInstancesRequest();
String userDataString = Base64.encodeBase64String(userData.toString().getBytes());
runInstancesRequest
.withImageId(machineImageId)
.withInstanceType(instanceType.toString())
.withMinCount(minCount)
.withMaxCount(maxCount)
.withKeyName(sshKeyName)
.withSecurityGroupIds(securityGroupIds)
.withSubnetId(subnetId)
.withUserData(userDataString)
.setEbsOptimized(true);
final EbsBlockDevice ebsBlockDevice = new EbsBlockDevice();
ebsBlockDevice.setDeleteOnTermination(true);
ebsBlockDevice.setVolumeType(VolumeType.Gp2);
ebsBlockDevice.setVolumeSize(256);
ebsBlockDevice.setEncrypted(true);
final BlockDeviceMapping mapping = new BlockDeviceMapping();
mapping.setDeviceName("/dev/sdb");
mapping.setEbs(ebsBlockDevice);
Кажется, что в настоящее время я могу только включить / отключить шифрование на томе, но не могу указать, какой основной ключ клиента KMS использовать для тома.
Это можно обойти?
2 ответа
Изменить: см. Мой другой ответ ниже ( /questions/17325139/aws-java-sdk-ukazanie-identifikatora-klyucha-kms-dlya-ebs/17325156#17325156) для гораздо более простого решения, доступного сейчас
Чтобы указать основной ключ клиента (CMK) для тома EBS для экземпляра, необходимо объединить RunInstancesRequest
с CreateVolumeRequest
и AttachVolumeRequest
, В противном случае, если вы просто укажите true
для шифрования на EbsBlockDevice
он будет использовать CMK по умолчанию.
Сначала создайте экземпляр (ы), не указав тома EBS в отображении блочного устройства RunInstancesRequest
, затем отдельно создайте тома, затем присоедините их.
CreateVolumeRequest
имеет withKmsKeyId()
/setKmsKeyId()
опции.
Например, обновление вашего кода может выглядеть так:
RunInstancesRequest runInstancesRequest = new RunInstancesRequest();
String userDataString = Base64.encodeBase64String(userData.toString().getBytes());
runInstancesRequest
.withImageId(machineImageId)
.withInstanceType(instanceType.toString())
.withMinCount(minCount)
.withMaxCount(maxCount)
.withKeyName(sshKeyName)
.withSecurityGroupIds(securityGroupIds)
.withSubnetId(subnetId)
.withUserData(userDataString)
.setEbsOptimized(true);
RunInstancesResult runInstancesResult = ec2Client.runInstances(runInstancesRequest);
for (Instance instance : runInstancesResult.getReservation()) {
CreateVolumeRequest volumeRequest = new CreateVolumeRequest()
.withAvailabilityZone(instance.getPlacement().getAvailabilityZone())
.withKmsKeyId(/* CMK id or alias/yourkeyaliashere */)
.withEncrypted(true)
.withSize(256)
.withVolumeType(VolumeType.Gp2);
CreateVolumeResult volumeResult = ec2Client.createVolume(volumeRequest);
AttachVolumeRequest attachRequest = new AttachVolumeRequest()
.withDevice("/dev/sdb")
.withInstanceId(instance.getInstanceId())
.withVolumeId(volumeResult.getVolume().getVolumeId());
ec2Client.attachVolume(attachRequest);
}
Примечание. Если вы используете отображение блочного устройства в метаданных экземпляра, оно не обновляется при подключении тома к работающему экземпляру. Чтобы обновить его, вы можете остановить / запустить экземпляр.
Хорошие новости! AWS только что добавила возможность указывать идентификаторы ключей CMK в отображении блочных устройств при запуске экземпляров.
Это было добавлено в AWS Java SDK в версии 1.11.237.
Поэтому в исходном коде вы теперь просто добавляете
ebsBlockDevice.setKmsKeyId(keyId);
где keyId может быть псевдонимом CMK (в форме alias/<alias name>
), идентификатор ключа (выглядит как 1234abcd-12ab-34cd-56ef-1234567890ab
) или полный CMK ARN (arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab
).