查找 EC2 实例的所有附加卷

Posted

技术标签:

【中文标题】查找 EC2 实例的所有附加卷【英文标题】:Find all the attached volumes for an EC2 instance 【发布时间】:2014-11-05 12:05:39 【问题描述】:

我正在使用下面的代码来获取 EC2 下的所有可用卷。但是我找不到任何 Ec2 api 来获取已经附加的卷与实例。请告诉我如何使用 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);
   

【问题讨论】:

【参考方案1】:

AWS Java SDK 现在提供了一种方法来获取实例的所有块储存设备映射。您可以使用它来获取所有附加卷的列表:

// 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】:

您可以过滤 EC2 DescribeVolumes API 调用的输出。有多种attachment.* 过滤器可用,您想要的一种是按附加的实例 ID 过滤。试试下面的代码:

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 是一个 Multimap,其中包含您要过滤的键和值。实际上,您可以多次指定相同的过滤器,例如将所有卷附加到多个不同的实例。

【讨论】:

【参考方案3】:

您可以使用 volumeAttachmentApi.listAttachmentsOnServer() 来执行此操作。

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

【讨论】:

以上是关于查找 EC2 实例的所有附加卷的主要内容,如果未能解决你的问题,请参考以下文章

将多个 ebs 卷附加到每个 ec2 实例

在将带有 AWS 市场代码的 CentOS 根卷附加到其他 CentOS EC2 实例时,另一个实例使用附加的根卷启动

JClouds:如何将新卷附加到 AWS EC2 实例

AWS 自动将 EBS 卷附加到 Elastic Beanstalk 后面的 EC2 实例

将 EBS 卷附加到 AutoScalingGroup

sh 使用AWS控制台创建EBS卷并将其附加到EC2实例