如何在boto3中配置多个filter筛选条件查询带指定标签的EC2实例
多标签EC2实例筛选解决方案
核心问题原因
你当前代码的核心问题是将多个过滤规则写在了同一个字典内,Python字典存在重复键时,后定义的键值会覆盖之前的内容,导致你配置的多组筛选条件实际仅有最后一组生效。
boto3的ec2.instances.filter方法中,Filters参数接收的列表内,每个字典对应一条独立的筛选规则,多条规则默认是逻辑与的关系,刚好符合你要同时满足多个标签匹配的需求。
修改后可直接运行的代码
from collections import defaultdict import boto3 # 连接EC2服务 ec2 = boto3.resource('ec2') # 筛选同时满足条件的运行中实例:标签prod=monitor、标签test=monitor running_instances = ec2.instances.filter(Filters=[ {'Name': 'instance-state-name', 'Values': ['running']}, {'Name': 'tag:prod', 'Values': ['monitor']}, {'Name': 'tag:test', 'Values': ['monitor']} ]) ec2info = defaultdict() for instance in running_instances: # 初始化实例名称默认值,避免无Name标签时触发变量未定义错误 name = '未命名' for tag in instance.tags: if 'Name' == tag['Key']: name = tag['Value'] # 将实例信息存入字典 ec2info[instance.id] = { 'Name': name, 'Type': instance.instance_type, 'State': instance.state['Name'], 'Private IP': instance.private_ip_address, 'Public IP': instance.public_ip_address, 'Launch Time': instance.launch_time } attributes = ['Name', 'Type', 'State', 'Private IP', 'Public IP', 'Launch Time'] for instance_id, instance in ec2info.items(): for key in attributes: print("{0}: {1}".format(key, instance[key])) print("------")
补充说明
- 多个筛选规则会同时生效,仅返回同时匹配所有规则的实例
- 新增了实例名称的默认值处理,兼容没有配置Name标签的实例
内容的提问来源于stack exchange,提问作者Joe John
相关产品推荐
相关产品推荐

