我使用标签来跟踪我的EC2实例,例如(项目,环境)。我有一个用例,我只需要过滤那些属于特定项目和特定环境的实例。
当我使用带有boto的过滤器并传递这两个值时,我得到的结果是OR而不是过滤器的AND,因此我收到属于不同项目但相同环境的实例列表。
现在我可以使用两个列表然后比较每个列表中的实例并获得所需的实例集,但有没有更好的方法来完成此操作?
这就是我在做的事情:
conn = ec2.EC2Connection('us-east-1',aws_access_key_id='XXX',aws_secret_access_key='YYY')
reservations = conn.get_all_instances(filters={"tag-key":"project","tag-value":<project-name>,"tag-key":"env","tag-value":<env-name>})
instances = [i for r in reservations for i in r.instances]
现在我获取的实例列表给出了指定项目中的所有实例,无论环境和指定环境中的所有实例如何,都与项目无关。
答案 0 :(得分:24)
您可以使用tag:key=value
语法对过滤器进行AND搜索。
import boto.ec2
conn = boto.ec2.connect_to_region('us-east-1',aws_access_key_id='xx', aws_secret_access_key='xx')
reservations = conn.get_all_instances(filters={"tag:Name" : "myName", "tag:Project" : "B"})
instances = [i for r in reservations for i in r.instances]
print instances
有关详细信息,请参阅EC2 API http://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeInstances.html
您使用的语法问题是Python dict具有唯一键,因此第二个tag-key
条目会覆盖第一个: - (
的Seb
答案 1 :(得分:0)
虽然documentation没有具体说明多个过滤器会发生什么,但ORing可能是设计的。在这种情况下,将所需的属性按顺序传递给函数,并将上一次调用的结果传递给下一个(使用instance_ids参数)。这将使用附加过滤器限制每个步骤的结果。然后按顺序应用属性,返回您想要的ANDed结果。