Фильтрация ec2-экземпляров с помощью boto

Я использую теги для отслеживания своих экземпляров EC2, таких как (Project, Environment). Я использую случай, когда мне нужно отфильтровать только те экземпляры, которые относятся к определенному проекту и конкретной среде.

Когда я использую фильтр с 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]

Теперь список экземпляров, который я получаю, дает все экземпляры из указанного проекта независимо от среды и всех экземпляров из указанной среды независимо от проекта.

Ответ 1

Синтаксис 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

Подробнее см. API EC2. http://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeInstances.html

Проблема с используемым вами синтаксисом заключается в том, что у питона Python есть уникальные ключи, поэтому вторая запись tag-key перезаписывает первую: - (

Себ

Ответ 2

В то время как документация не указывает конкретно, что происходит с несколькими фильтрами, ORing может быть по дизайну. В этом случае передайте необходимые атрибуты последовательно функции и передайте результат предыдущего вызова в следующий (используя параметр instance_ids). Это будет ограничивать результаты на каждом шаге дополнительным фильтром. Атрибуты затем применяются последовательно, возвращая желаемый результат ANDed.