Отфильтруйте ASG, которые содержат строку в AutoScalingGroupName, используя boto3 - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь отфильтровать группы автоматического масштабирования, содержащие строку «base» в AutoScalingGroupName. Я пытаюсь использовать язык запросов JMESpath, но не могу найти примеров фильтрации по значению, только по ключу.

import boto3

session = boto3.Session(profile_name='prod')
asg_client = session.client(
    'autoscaling', 
     region_name='us-west-1'
)

paginator = asg_client.get_paginator('describe_auto_scaling_groups')
page_iterator = paginator.paginate(
    PaginationConfig={'PageSize': 100}
)

filtered_asgs = page_iterator.search(
    'AutoScalingGroups[] | AutoScalingGroupName[?!contains(@, `{}`)]'.format('base')
)

for asg in filtered_asgs:
    pprint.pprint(asg)

Возвращает

None
None

Я также пытался

filtered_asgs = page_iterator.search('AutoScalingGroups[] | [?contains(AutoScalingGroupName[].Value, `{}`)]'.format('base'))
jmespath.exceptions.JMESPathTypeError: In function contains(), invalid type for value: None, expected one of: ['array', 'string'], received: "null"

1 Ответ

1 голос
/ 04 мая 2020

Это правильный синтаксис:

substring = 'base'
filtered_args = page_iterator.search(f"AutoScalingGroups[?!contains(AutoScalingGroupName,`{substring}`)][]")

Если вы предпочитаете «синтаксис формата» вместо f-строк, вы, конечно, также можете написать:

filtered_args = page_iterator.search("AutoScalingGroups[?!contains(AutoScalingGroupName,`{}`)][]".format(substring))

И если подстрока 'base' является константой, вы также можете записать ее непосредственно в выражение:

filtered_args = page_iterator.search("AutoScalingGroups[?!contains(AutoScalingGroupName,`base`)][]")

Большую часть времени вас не интересует все содержание синтаксиса ответа. Если вы просто заботитесь о названии группы, вы можете написать:

filtered_args = (page['AutoScalingGroupName'] for page in page_iterator.search("AutoScalingGroups[?!contains(AutoScalingGroupName,`base`)][]"))

Если вы предпочитаете список в качестве результата перед генератором, вы можете просто заменить окружающие скобки квадратными скобками:

filtered_args = [page['AutoScalingGroupName'] for page in page_iterator.search("AutoScalingGroups[?!contains(AutoScalingGroupName,`base`)][]")]
...