2017-06-06 27 views
2

我试图匹配不以连字符( - )开头的EC2实例名称,所以我可以跳过以关闭过程开始的实例名称。如果我使用^或*,这些基本的正则表达式运算符工作正常,但如果我尝试使用更高级的模式匹配,则它不正确匹配。模式[a-zA-Z0-9]被忽略,不返回实例。如何在boto3 ec2实例过滤器中使用高级正则表达式?

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() 

回答

1

当使用CLI和各种API时,EC2实例过滤不是由“regex”完成的。相反,过滤器是简单的*?通配符。

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

不过,后来在同一文件中,在“上市和过滤使用CLI和API”,它说:

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

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

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