Попытка отфильтровать экземпляры EC2 «Без тегов» И «Пустое значение» при использовании Boto3 в Lambda, а затем выключить их

Я пытаюсь выяснить, что такое поля Без тегов И Пустое значение для экземпляров EC2 при их фильтрации. Приведенная ниже функция работает для экземпляров, помеченных как Владелец со значением test. Однако в тот момент, когда я пробую что-нибудь вместо 'test' (Null, None, Not tagged, Empty value, 0 и т. Д.), функция либо возвращает каждый экземпляр или функция не возвращают ни одного из экземпляров. Я просмотрел бесчисленное количество страниц документации, и я очень благодарен за любую помощь. Если я не могу заставить это работать, моим следующим шагом будет использование Lambda, Tag Editor и Beautiful < strong> Soup, чтобы найти определенные экземпляры без тегов и пустые экземпляры и закрыть их.

import boto3
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)
ec2 = boto3.resource('ec2')

def lambda_handler(event, context):

filters1 = [{'Name': 'instance-state-name', 
    'Values': ['running']}]
base = ec2.instances.filter(Filters=filters1)

filters2 = [{'Name': 'tag:Owner',
    'Values': ['test']}]
instances = base.filter(Filters=filters2)

for instance in instances:
    print(instance.id)
RunningInstances = [instance.id for instance in instances]
ec2.instances.filter(InstanceIds=RunningInstances).stop()

person Steven M    schedule 05.03.2016    source источник
comment
Застрял на том же месте. Я также использую ec2.instances.filter () и хочу использовать фильтр отрицания, в основном получая все экземпляры, которые НЕ имеют определенного тега.   -  person Ayush Sharma    schedule 30.09.2016


Ответы (4)


Лучшее решение могло бы использовать концепцию событий или реактивного программирования вместо того, чтобы время от времени запускать такое сканирование.

В AWS есть несколько вариантов, на которые можно реагировать на соответствующие события. Это может быть использование CloudTrail, отслеживающего ваши вызовы API, или CloudWatch Events, которые рассылает события об изменениях в вашей инфраструктуре. Но для этого варианта использования (отслеживание экземпляров без тегов) можно использовать правила AWS Config: https://aws.amazon.com/blogs/aws/aws-config-rules-dynamic-compliance-check-for-cloud-resources/

В AWS Config есть шаблон, который можно использовать для настройки правила и определения реакции на событие.

person Guy    schedule 05.03.2016
comment
Спасибо за предоставленную ссылку, все отлично! Один быстрый вопрос, у меня всего 3 шаблона (зашифрованные тома, включен облачный трейл, прикреплен eip), как мне получить другие шаблоны по вашей ссылке? Я вижу другую документацию, ссылающуюся на шаблон Required-Tags, но я не вижу, как импортировать или создать этот шаблон. - person Steven M; 07.03.2016
comment
Есть репозиторий GitHub с несколькими примерами. Вот, например, тип экземпляра: github.com / awslabs / aws-config-rules / blob / master / python /. Дополнительные примеры можно найти здесь: aws.amazon.com/about-aws/whats-new/2016/03/ - person Guy; 07.03.2016

Просто используйте describe_instances (), чтобы получить оттуда список всех тегов, состояния выполнения и управления сборкой.

ec2 = boto3.client("ec2")
reservations  = ec2.describe_instances()["Reservations"]
for each_item in reservations  :  
    for instance in each_item["Instances"]:
        print "{}  {} {}".format(instance["InstanceId"],  instance["State"]["Name"], instance["Tags"] ) 

Расходы на использование правил конфигурации: 2 доллара США за активное правило в месяц. Так что используйте его экономно, вы не хотите создавать слишком много повторяющихся правил, которые срабатывают.

person mootmoot    schedule 17.03.2016

Я столкнулся с аналогичной ситуацией. Лучший вариант, который я вижу сейчас, - это.

  • Пометьте все экземпляры пользовательским тегом: tagged-by:boto3
  • Отфильтровать все экземпляры с этим тегом
  • Проведите цикл по экземплярам, ​​чтобы увидеть, является ли это единственным доступным тегом.
  • если да, удалите экземпляр

Я все еще пишу это в коде, обновлю ответ, как только он будет готов.

person Saurav    schedule 15.12.2016

Отметим, что если вы выберете опцию «(без тегов)» на экране консоли «Создать группу ресурсов», то в результирующей группе ресурсов ничего не отобразится. С этой точки зрения это то же самое, что использовать «(без тегов)» в качестве одного из значений в клике AWS.

aws resource-groups create-group --name Non-Project-Linked-Resources --description "All resources NOT tagged with a ProjectNumber" --resource-query '{"Type":"TAG_FILTERS_1_0", "Query":"{\"ResourceTypeFilters\":[\"AWS::AllSupported\"],\"TagFilters\":[{\"Key\":\"ProjectNumber\",\"Values\":[\"\",\"(not tagged)\"]}]}"}'

имеет тот же эффект, что и выбор ProjectNumber в качестве ключа и добавление (пустое значение) и (без тегов) в качестве значений. Все, что я прочитал, сводится к тому, что запросы на стороне сервера не поддерживают поиск отсутствия тега.

person Immo Huneke    schedule 08.11.2019