Python脚本获取AWS实例信息时触发IndexError: list index out of range
解决AWS实例信息脚本的IndexError问题
错误原因
- 部分EC2实例可能未设置任何标签,此时
printout["Tags"]是空列表,直接取[0]会触发索引越界错误 - 极少数特殊场景下(比如刚创建未挂载卷的实例),
BlockDeviceMappings可能为空,取[0]同样会报错 - 直接取
Tags[0]逻辑不严谨:实例的Name标签不一定是标签列表的第一个元素
修复后的脚本
import boto3 import csv def warn(*args, **kwargs): pass import warnings warnings.warn = warn AWS_REGION = "us-east-1" ec2_client = boto3.client("ec2", region_name=AWS_REGION) response = ec2_client.describe_instances() for reservation in response['Reservations']: for instance in reservation['Instances']: instance_id = instance['InstanceId'] # 安全获取实例名称,兼容无标签/无Name标签的情况 instance_name = "无名称" if 'Tags' in instance and instance['Tags']: for tag in instance['Tags']: if tag['Key'] == 'Name': instance_name = tag['Value'] break # 安全获取卷ID,兼容无块设备映射的情况 volume_id = "无关联卷" if 'BlockDeviceMappings' in instance and instance['BlockDeviceMappings']: # 若实例挂载多个卷,此处取第一个;需全部卷信息可改为遍历输出 volume_id = instance['BlockDeviceMappings'][0]["Ebs"]["VolumeId"] print(instance_id, instance_name, volume_id)
关键优化点
- 增加了对
Tags和BlockDeviceMappings的存在性及非空检查,从根源避免索引越界 - 通过遍历标签精准定位
Name键,不再依赖标签顺序 - 对缺失信息的场景设置默认值,保证脚本能完整遍历所有实例
内容的提问来源于stack exchange,提问作者Subham Sahu
相关产品推荐
相关产品推荐

