Остановить все экземпляры ec2, которые не содержат тега со специальным значением в AWS - PullRequest
0 голосов
/ 18 февраля 2019

Мне нужно написать скрипт на python для лямбда-функции AWS, чтобы остановить все экземпляры ec2, у которых нет конкретного тега или определенного значения для этого тега.

Я использую boto3 с python, чтобы получить всеэкземпляры и использование фильтра для фильтрации всех экземпляров с этим конкретным тегом или его значением тега, но не в состоянии получить экземпляры, которые выполняются без этого конкретного тега или его значения.

import boto3
ec2 = boto3.resource('ec2')

def lambda_handler(event, context):
    filters = [{
         'Name': 'tag:state:scheduleName',
         'Values': ['24x7']
       }]

    #get all instances   
    AllInstances=[instance.id for instance in ec2.instances.all()]
    # get instances with that tag and value
    instances = ec2.instances.filter(Filters=filters)

    RunningInstancesWithTag = [instance.id for instance in instances]

    RunningInstancesWithoutTag= [x for x in AllInstances if x not in  RunningInstancesWithTag]

    if len(RunningInstancesWithoutTag) > 0:
            print("found instances with out tag")
            ec2.instances.filter(InstanceIds = RunningInstancesWithoutTag).stop() #for stopping an ec2 instance
            print("instance stopped")
    else:
        print("let it be run as tag value is 24*7")

1 Ответ

0 голосов
/ 20 февраля 2019

Как сказал Джон в комментариях, вы слишком усложняете это, используя фильтр.

Вы хотите что-то вроде этого:

import boto3

ec2 = boto3.resource('ec2')

def lambda_handler(event, context):

    running_with = []
    running_without = []

    for instance in ec2.instances.all():

        if instance.state['Name'] != 'running':
            continue

        has_tag = False
        for tag in instance.tags:
            if tag['Key'] == 'scheduleName' and tag['Value'] == '24x7':
                has_tag = True
                break

        if has_tag:
            running_with.append(instance.id)
        else:
            running_without.append(instance.id)

    print("With: %s" % running_with)
    print("Without: %s" % running_without)

Ключевые моменты:

  • Не используйте фильтр и просто сделайте один вызов ec2.instances.all ().
  • Выполните цикл по экземплярам, ​​а затем по тегам и посчитайте с и без.
...