3 votes

AWS Java SDK : Spécification de l'identifiant de la clé KMS pour EBS

Dans le SDK Java AWS 1.10.69, je peux lancer une instance et spécifier des mappages de volumes EBS pour l'instance :

    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);

Il semble qu'actuellement je ne puisse qu'activer/désactiver le cryptage sur le volume, et non pas spécifier la clé maître client KMS à utiliser pour le volume.

Existe-t-il un moyen de contourner ce problème ?

2voto

Dan Walker Points 21

Edit : Voir mon autre réponse ci-dessous ( https://stackoverflow.com/a/47602790/7692970 ) pour la solution beaucoup plus simple qui est maintenant disponible

Pour spécifier une clé principale du client (CMK) pour un volume EBS d'une instance, vous devez combiner les éléments suivants RunInstancesRequest avec un CreateVolumeRequest et un AttachVolumeRequest . Sinon, si vous spécifiez simplement true pour le cryptage sur le EbsBlockDevice il utilisera le CMK par défaut.

Créez d'abord la ou les instances, sans spécifier les volumes EBS dans le mappage des périphériques de bloc de la commande RunInstancesRequest puis séparément créer les volumes entonces les attacher .

CreateVolumeRequest tiene withKmsKeyId() / setKmsKeyId() options.

Par exemple, la mise à jour de votre code pourrait ressembler à ce qui suit :

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);
}

Remarque : si vous utilisez le mappage des périphériques de bloc dans les métadonnées d'instance, il n'est pas mis à jour lorsque vous attachez un volume à une instance en cours d'exécution. Pour la mettre à jour, vous pouvez arrêter/démarrer l'instance.

0voto

Dan Walker Points 21

Bonne nouvelle ! AWS vient d'ajouter la possibilité de spécifier les identifiants des clés CMK dans le mappage des blocs lors du lancement des instances.

https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/ec2/model/EbsBlockDevice.html#setKmsKeyId-java.lang.String-

Cette fonctionnalité a été ajoutée au SDK Java AWS dans la version 1.11.237.

Par conséquent, dans votre code d'origine, il vous suffit d'ajouter

ebsBlockDevice.setKmsKeyId(keyId);

où keyId peut être un alias CMK (sous la forme alias/<alias name> ), l'identifiant de la clé (ressemble à 1234abcd-12ab-34cd-56ef-1234567890ab ) ou l'ARN CMK complet ( arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab ).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X