查找 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 实例的所有附加卷的主要内容,如果未能解决你的问题,请参考以下文章
在将带有 AWS 市场代码的 CentOS 根卷附加到其他 CentOS EC2 实例时,另一个实例使用附加的根卷启动