温馨提示:本文翻译自stackoverflow.com,查看原文请点击:python 3.x - Filter out ASGs that contain string in AutoScalingGroupName using boto3
boto3 jmespath python-3.x

python 3.x - 使用boto3筛选出AutoScalingGroupName中包含字符串的ASG

发布于 2020-08-16 16:08:46

我正在尝试过滤掉AutoScalingGroupName中包含字符串“ base”的自动缩放组。我正在尝试使用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"

查看更多

提问者
Gorgon_Union
被浏览
2
airborne 2020-05-05 14:51

这是正确的语法:

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

如果您更喜欢f字符串而不是“ format-syntax”,那么您当然也可以这样写:

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`)][]")]