如何使用boto3分页查询获取全部AWS EBS卷详情并导出为CSV格式
boto3全量获取EBS卷信息并导出CSV实现方案
实现逻辑说明
AWS EC2的describe_volumes接口默认单次最多返回50条EBS卷记录,超过该数量时结果会被截断,需要用返回的NextToken拉取下一页数据。直接使用boto3内置的Paginator分页器可自动处理全量分页逻辑,无需手动维护token,适配任意数量的EBS卷查询。
完整可运行脚本
import boto3 import csv # 初始化EC2客户端,如需指定区域可添加region_name参数,例如region_name='cn-north-1' ec2 = boto3.client('ec2') # 初始化分页器,自动处理所有分页请求 paginator = ec2.get_paginator('describe_volumes') page_iterator = paginator.paginate() # 定义导出CSV的字段,可根据需求自行增删 export_fields = [ 'VolumeId', 'InstanceId', 'VolumeType', 'SizeGB', 'Status', 'CreateTime', 'AvailabilityZone' ] output_path = './ebs_volumes_full.csv' all_volume_data = [] for page in page_iterator: for volume in page['Volumes']: # 处理挂载实例ID,未挂载返回空值,多挂载场景用逗号分隔多个实例ID attached_instances = [attach['InstanceId'] for attach in volume.get('Attachments', [])] instance_id_str = ','.join(attached_instances) if attached_instances else '' # 组装单条卷数据,可按需扩展字段 volume_item = { 'VolumeId': volume['VolumeId'], 'InstanceId': instance_id_str, 'VolumeType': volume['VolumeType'], 'SizeGB': volume['Size'], 'Status': volume['State'], 'CreateTime': volume['CreateTime'].strftime('%Y-%m-%d %H:%M:%S'), 'AvailabilityZone': volume['AvailabilityZone'] } all_volume_data.append(volume_item) # 写入CSV文件 with open(output_path, 'w', newline='', encoding='utf-8') as f: writer = csv.DictWriter(f, fieldnames=export_fields) writer.writeheader() writer.writerows(all_volume_data) print(f"导出完成,共获取{len(all_volume_data)}条EBS卷记录,文件路径:{output_path}")
常用调整说明
- 新增标签导出:可通过
volume.get('Tags', [])获取卷标签,遍历后将需要的标签值加入volume_item即可 - 条件过滤查询:在
paginate()方法中传入Filters参数可实现过滤,例如只查询已挂载的卷:paginator.paginate(Filters=[{'Name': 'status', 'Values': ['in-use']}]) - 跨区域批量查询:可遍历所有需要查询的区域,每个区域初始化一个EC2客户端执行查询逻辑,合并结果后统一导出
内容的提问来源于stack exchange,提问作者Dexter
相关产品推荐
相关产品推荐

