3

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 カスタマー マスター キーを指定することはできないようです。

これを回避する方法はありますか?

4

2 に答える 2

2

編集:現在利用可能なはるかに簡単なソリューションについては、以下の私の他の回答( https://stackoverflow.com/a/47602790/7692970 )を参照してください

インスタンスの EBS ボリュームのカスタマー マスター キー (CMK) を指定するには、RunInstancesRequestCreateVolumeRequestおよび と組み合わせる必要がありますAttachVolumeRequest。それ以外の場合は、true暗号化を指定するだけEbsBlockDeviceで、デフォルトの CMK が使用されます。

のブロック デバイス マッピングで EBS ボリュームを指定せずに、最初にインスタンスを作成し、次にボリュームRunInstancesRequestを個別に作成し、それらをアタッチします

CreateVolumeRequestwithKmsKeyId()/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);
}

注: インスタンス メタデータでブロック デバイス マッピングを使用する場合、実行中のインスタンスにボリュームをアタッチしてもマッピングは更新されません。インスタンスを最新の状態にするには、インスタンスを停止/開始します。

于 2017-03-23T23:29:19.593 に答える