Find all attached volumes for EC2 instance

I am using the below code to get all available volumes under EC2. But I cant find Ec2 api to get already attached volumes with instance. Please let me know how to get all attached volumes using instanceId.

EC2Api ec2Api = computeServiceContext.unwrapApi(EC2Api.class);
List<String> volumeLists = new ArrayList<String>();
if (null != volumeId) {
    volumeLists.add(volumeId);
}
String[] volumeIds = volumeLists.toArray(new String[0]);
LOG.info("the volume IDs got from user is ::"+ Arrays.toString(volumeIds));

Set<Volume> ec2Volumes = ec2Api.getElasticBlockStoreApi().get()
                    .describeVolumesInRegion(region, volumeIds);

Set<Volume> availableVolumes = Sets.newHashSet();
for (Volume volume : ec2Volumes) {
    if (volume.getSnapshotId() == null
            && volume.getStatus() == Volume.Status.AVAILABLE) {
        LOG.debug("available volume with no snapshots ::" + volume.getId());
        availableVolumes.add(volume);
   }
}

      

+3


source to share


3 answers


You can filter the output of the API2 DescribeVolumes API call . There are various filters attachment.*

that you want to filter using the attached instance id. Try the following code:

Multimap<String, String> filter = ArrayListMultimap.create();
filter.put("attachment.instance-id", instanceId);
filter.put("attachment.status", "attached");
Set<Volume> volumes = ec2Api.getElasticBlockStoreApi().get()
                .describeVolumesInRegionWithFilter(region, volumeIds, filter);

      



filter

is Multimap

with the keys and values ​​you want to filter. You can actually specify the same filter multiple times, for example so that all volumes are bound to several different instances.

+2


source


The Java SDK now provides a method to get all block mappings for an instance. You can use this to get a list of all mounted volumes:



// First get the EC2 instance from the id
DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest().withInstanceIds(instanceId);
DescribeInstancesResult describeInstancesResult = ec2.describeInstances(describeInstancesRequest);
Instance instance = describeInstancesResult.getReservations().get(0).getInstances().get(0);

// Then get the mappings
List<InstanceBlockDeviceMapping> mappingList = instance.getBlockDeviceMappings();
for(InstanceBlockDeviceMapping mapping: mappingList) {
    System.out.println(mapping.getEbs().getVolumeId());
}

      

+2


source


You can use volumeAttachmentApi.listAttachmentsOnServer () for this.

 NovaApi novaApi = context.unwrapApi(NovaApi.class);VolumeApi volumeApi = novaApi.getVolumeExtensionForZone(region).get();
        VolumeAttachmentApi volumeAttachmentApi = novaApi.getVolumeAttachmentExtensionForZone(region).get();
volumeAttachmentApi.listAttachmentsOnServer(serverId)

      

-1


source







All Articles