如何使用 Python 获取 EC2 中的 EBS 卷列表
How to get a list of EBS volume in EC2 using Python
我正在尝试使用 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[1], volume[2])
除了根据本网站的服务条款授予的许可外,post 的内容还根据 MIT-0 获得许可。
我正在尝试使用 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[1], volume[2])
除了根据本网站的服务条款授予的许可外,post 的内容还根据 MIT-0 获得许可。