Как я могу использовать расширенное регулярное выражение в фильтре экземпляра boto3 ec2?

Я пытаюсь сопоставить имена экземпляров EC2, не начинающиеся с дефиса (-), поэтому я могу пропустить имена экземпляров, начинающиеся с - из процесса завершения работы. Если я использую ^ или *, эти базовые операторы регулярных выражений работают нормально, но если я пытаюсь использовать более сложное сопоставление с шаблоном, оно не соответствует должным образом. Шаблон [a-zA-Z0-9] игнорируется и не возвращает никаких экземпляров.

import boto3

# Enter the region your instances are in, e.g. 'us-east-1'
region = 'us-east-1'

#def lambda_handler(event, context):
def lambda_handler():

    ec2 = boto3.resource('ec2', region_name=region)

    filters= [{
        'Name':'tag:Name',
        #'Values':['-*']
        'Values':['^[a-zA-Z0-9]*']
        },
        {
        'Name': 'instance-state-name',
        'Values': ['running']
        }]

    instances = ec2.instances.filter(Filters=filters)

    for instance in instances:
        for tags in instance.tags:
            if tags["Key"] == 'Name':
                name = tags["Value"]

        print 'Stopping instance: ' + name + ' (' + instance.id + ')'
        instance.stop(DryRun=True)

lambda_handler()

2 ответа

Решение

При использовании CLI и различных API фильтрация экземпляров EC2 не выполняется с помощью "регулярных выражений". Вместо этого фильтры просты * а также ? подстановочные знаки.

Согласно этому документу, перечислению и фильтрации ваших ресурсов, в нем упоминается фильтрация регулярных выражений. Однако в этом разделе неясно, поддерживается ли он в API или только в Консоли управления AWS.

Однако позже в том же документе, в "Списке и фильтрации с использованием CLI и API", говорится:

Вы также можете использовать подстановочные знаки со значениями фильтра. Звездочка (*) соответствует нулю или более символов, а вопросительный знак (?) Соответствует ровно одному символу. Например, вы можете использовать базу данных в качестве значения фильтра, чтобы получить все снимки EBS, которые включают базу данных в описании.

В этом разделе нет упоминания о поддержке регулярных выражений.

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

Я пробовал что-то вроде этого:

snap_response = ec2_client.describe_snapshots(
    Filters=[
        {
            'Name': 'tag:'+tag_key,
            'Values': [tag_value+'*']
        },
    ],
)

и он возвращает значение, которое мне нужно.

Я только что пробовал? и * в значениях фильтра, и это сработало как шарм..!

ec2_result = ec2_client.describe_instances(
    Filters=[
        {
            'Name': 'tag:Application',
            'Values': ['?yApp*']
        }
    ]
)
Другие вопросы по тегам