2017-06-06 26 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中受支持。