使用Boto3打印SSM托管实例时出现ComputerName的KeyError错误
问题诱因
- AWS SSM的
describe_instance_information接口返回的实例属性并非所有实例完全一致:部分状态异常的托管实例(比如刚注册未完成同步、长期离线、混合部署的本地节点未正确上报元数据)不会返回ComputerName字段,AWS API不会为缺失的字段填充默认值,因此遍历到这类实例时直接取instance['ComputerName']就会触发KeyError。 - 你之前测试查看键列表时没有发现缺失,是因为boto3的
paginator.paginate()返回的是一次性迭代器:第一次遍历打印实例名称时已经把迭代器消费完了,后续遍历查看键的代码实际上没有拿到全量数据,你看到的键列表只是正常实例的属性,没有覆盖到异常实例。
解决方法
两种常用修复方案按需选择:
- 容错取值(推荐)
使用字典的get()方法取值,为缺失字段设置默认占位符,不会中断程序运行,同时可以标记异常实例:
for item in response_iterator: for instance in item['InstanceInformationList']: # 必有的InstanceId字段用来定位异常实例,ComputerName缺省用占位符 computer_name = instance.get('ComputerName', '未上报/无此字段') instance_id = instance['InstanceId'] print(f"实例ID:{instance_id},计算机名:{computer_name}")
- 过滤缺失字段的实例
如果不需要处理缺ComputerName的实例,直接加判断跳过即可:
for item in response_iterator: for instance in item['InstanceInformationList']: if 'ComputerName' in instance: print(instance['ComputerName']) # 可选:打印跳过的异常实例ID方便排查 else: print(f"跳过无ComputerName的实例:{instance['InstanceId']}")
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

