【问题标题】:How can I use advanced regex in a boto3 ec2 instance filter?如何在 boto3 ec2 实例过滤器中使用高级正则表达式?
【发布时间】:2017-11-07 20:35:56
【问题描述】:

我正在尝试匹配不以连字符 (-) 开头的 EC2 实例名称,因此我可以从关闭过程中跳过以 - 开头的实例名称。如果我使用 ^ 或 *,这些基本的 regex 运算符可以正常工作,但如果我尝试使用更高级的模式匹配,则无法正确匹配。模式 [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()

【问题讨论】:

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


    【解决方案1】:

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

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

    但是,在同一文档的后面,在“使用 CLI 和 API 列出和过滤”中,它说:

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

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

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

    【讨论】:

      【解决方案2】:

      我尝试过这样的事情:

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

      它会返回我需要的值。

      【讨论】:

        【解决方案3】:

        我刚试过?和 * 过滤器值中的字符,它就像一个魅力..!

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

        【讨论】:

        • [] 中的内容必须是字符串。我无法编辑它,因为编辑必须是 6 个字符或更多(这很愚蠢)
        猜你喜欢
        • 1970-01-01
        • 2019-04-04
        • 2020-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-27
        相关资源
        最近更新 更多