如何在boto3 ec2实例过滤器中使用高级正则表达式?

时间:2017-06-06 17:47:22

标签: python amazon-web-services amazon-ec2 boto boto3

我正在尝试匹配不以连字符( - )开头的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()

3 个答案:

答案 0 :(得分:5)

使用CLI和各种API时," regex"不会进行EC2实例过滤。相反,过滤器是简单的*?通配符。

根据此文档Listing and Filtering Your Resources,它确实提到了正则表达式过滤。但是,在该部分中不清楚它是支持API还是仅支持AWS管理控制台。

但是,稍后在同一文档的“使用CLI和API"进行列表和过滤”中,它说:

  

您还可以将通配符与过滤器值一起使用。星号(*)匹配零个或多个字符,问号(?)恰好匹配一个字符。例如,您可以使用 database 作为过滤器值来获取描述中包含数据库的所有EBS快照。

在本节中,没有提到正则表达式支持。

结论,我怀疑只有管理控制台UI支持正则表达式过滤。

答案 1 :(得分:0)

我尝试过这样的事情:

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

并返回我需要的值。

答案 2 :(得分:0)

我刚刚尝试了?和*字符作为“过滤器值”,它就像一个超级按钮一样。

ec2_result = ec2_client.describe_instances(
    Filters=[
        {
            'Name': 'tag:Application',
            'Values': [?yApp*]
        }
    ]
)