AWS SSM DescribeInstanceInformation接口ResourceType过滤器单值限制问题问询
问题解答
1. 绕过过滤限制的最优方案
该限制的最优绕过方案就是分两次分别查询ManagedInstance和EC2Instance两类资源,再合并结果集即可。你原有方案的分页不生效不是paginator的问题,是后续处理结果的逻辑错误:你将所有分页响应存入列表后,仅读取了第一页(item[0])的数据,导致只返回单页的10条结果。
修正后的可正常分页、合并查询的代码如下:
import boto3 ssm_client = boto3.client('ssm') online_instances = [] resource_types = ['ManagedInstance', 'EC2Instance'] for rtype in resource_types: paginator = ssm_client.get_paginator('describe_instance_information') # 分页查询对应类型的实例 for page in paginator.paginate( Filters=[ { 'Key': 'ResourceType', 'Values': [rtype] } ] ): # 筛选当前页的在线实例 for instance in page['InstanceInformationList']: if instance.get('PingStatus') == 'Online': online_instances.append({ 'instance_name': instance.get('ComputerName'), 'instance_id': instance.get('InstanceId'), 'resource_type': rtype # 按需补充其他需要的字段 }) # 后续直接使用合并后的在线实例列表即可 for ins in online_instances: print(ins['instance_name'])
如果不需要保留完整实例对象,也可以在遍历分页的时候直接处理业务逻辑,无需额外存储全部结果,进一步降低内存占用。
2. 限制的来源
该限制是AWS SSM服务端原生API的设计限制,和boto3 SDK无关。从报错信息An error occurred (InvalidInstanceInformationFilterValue) when calling the DescribeInstanceInformation operation: ResourceType filter may contain only one value也可以看出,错误是SSM服务端返回的,并非SDK本地校验抛出的问题。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

