如何使用Python获取EC2中EBS卷的列表

问题描述

我正在尝试使用python获取EC2中的EBS卷的列表。

这是我的代码

import boto3
import objectpath
aws_account = 'company-lab'
region = 'us-east-1'
session = boto3.Session(profile_name=aws_account,region_name=region)
ec2 = session.client("ec2")
instance_list = ec2.describe_instances()
for reservation in instance_list["Reservations"]:
    for instance in reservation.get("Instances",[]):
        tree = objectpath.Tree(instance)
        block_devices = set(tree.execute('$..BlockDeviceMappings[\'Ebs\'][\'VolumeId\']'))
        block_devices = list(block_devices)
        for volume_id in block_devices:
            volume = ec2.Volume(volume_id)

当我尝试返回以下错误时:

Traceback (most recent call last):
  File "<stdin>",line 7,in <module>
  File "C:\Users\tdun0002\AppData\Local\Programs\Python\python38-32\lib\site-packages\botocore\client.py",line 573,in __getattr__
    raise AttributeError(
AttributeError: 'EC2' object has no attribute 'Volume'

我正在尝试使用boto3 EC2 Volume属性。我想获取任何给定EC2实例的EBS卷及其大小的列表。我该怎么办?

解决方法

“我想获取任何给定EC2实例的EBS卷及其大小的列表。”

以下是使用resource方法的代码:

import boto3

ec2_resource = boto3.resource('ec2')

for instance in ec2_resource.instances.all():
    for volume in instance.volumes.all():
        print(instance.id,volume.id,volume.volume_type,volume.size)

并使用client方法:

import boto3

ec2_client = boto3.client('ec2')

response = ec2_client.describe_instances()

for reservation in response['Reservations']:
    for instance in reservation['Instances']:
        volumes = ec2_client.describe_volumes(
            Filters=[{'Name':'attachment.instance-id','Values':[instance['InstanceId']]}]
        )
        for disk in volumes['Volumes']:
            print(instance['InstanceId'],disk['VolumeId'],disk['VolumeType'],disk['Size'])

但是,这将导致多个API调用(每个实例一个DescribeInstances(),然后一个DescribeVolumes())。

此版本仅使用一次对DescribeVolumes()的调用,并按InstanceId进行排序:

import boto3

ec2_resource = boto3.resource('ec2')

volumes = [(v.attachments[0]['InstanceId'],v.id,v.size)
           for v in ec2_resource.volumes.filter(Filters=[{'Name':'attachment.status','Values':['attached']}])]

for volume in sorted(volumes):
    print(volume[0],volume[1],volume[2])

以下是使用client方法的等效代码:

import boto3

ec2_client = boto3.client('ec2')

response = ec2_client.describe_volumes(Filters=[{'Name':'attachment.status','Values':['attached']}])

volumes = [(v['Attachments'][0]['InstanceId'],v['VolumeId'],v['Size']) for v in response['Volumes']]

for volume in sorted(volumes):
    print(volume[0],volume[2])

除了根据本网站的服务条款授予的许可外,该帖子的内容还根据MIT-0进行许可。