Фильтрация 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.