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 в отображении блочных устройств при запуске экземпляров.

https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/ec2/model/EbsBlockDevice.html

Это было добавлено в 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).

Другие вопросы по тегам