2016-04-18 3 views
0

Я хотел бы перечислить все активные стеки в образовании облаков AWS, которые соответствуют регулярному выражению. Имя стека выглядит так: «FeatureEnv-commit123asdfqw212da-3241». Каков наилучший способ достичь этого? всякий раз, когда я запускаю сценарий, он выдает ошибку. Полный скрипт http://www.technobabelfish.com/2013/08/boto-and-cloudformation.html. Я обновил этот сценарий для работы по моему требованию.pattern match with in if statement

#!/usr/bin/env python 

import sys 
import boto 
import boto.cloudformation 
import argparse 
import re 

class MyBaseException(Exception): 
    msg ="MyBaseException" 
    def __init__(self, value): 
     self.value = value 
    def __str__(self): 
     return "%s: %s" % (self.msg, self.value) 

class MissingParamException(MyBaseException): 
    msg ="Missing param" 

class InvalidCommandException(MyBaseException): 
    msg ="Invalid command" 

class InvalidStackException(MyBaseException): 
    msg ="Invalid stack" 


def _create_cf_connection(args): 
    # Connect to a cloudformation 
    # Returns a cloudformation connection. 
    # Throws exception if connect fails 
    if not args.access_key: 
     raise MissingParamException("access_key") 

    if not args.secret_key: 
     raise MissingParamException("secret_key") 

    if not args.region: 
     raise MissingParamException("region") 

    conn = boto.cloudformation.connect_to_region(args.region, 
               aws_access_key_id = args.access_key, 
               aws_secret_access_key = args.secret_key) 

    return conn 

def get_stacks(args): 
    conn = _create_cf_connection(args) 
    return conn.list_stacks() 

def get_stack(args, stack): 
    conn = _create_cf_connection(args) 

    stacks = conn.describe_stacks(stack) 
    if not stacks: 
     raise InvalidStackException(stack) 

    return stacks[0] 

def print_stack(stack): 
    print "---" 
    print "Name:   %s" % stack.stack_name 
    print"ID:    %s"% stack.stack_id 
    print "Status:   %s" % stack.stack_status 
    print "Creation Time: %s" % stack.creation_time 
    print"Outputs:   %s"% stack.outputs 
    print "Parameters:  %s" % stack.parameters 
    print"Tags:   %s"% stack.tags 
    print "Capabilities: %s" % stack.capabilities 


def list_stacks(args): 
    stacks = get_stacks(args) 
    for stackSumm in stacks: 
     pattern = re.compile("^FeatureEnv-commit([a-z][0-9]+)*-([0-9]*)") 
     match = pattern.match(stackSumm.stack_name) 
     print match.string 
     if stackSumm.stack_status in "CREATE_COMPLETE" and match and stackSumm.stack_name in match.string: 
      print_stack(get_stack(args, stackSumm.stack_id)) 


def list_regions(args): 
    regions = boto.cloudformation.regions() 

    for r in regions: 
     print r.name 


command_list = { 'list-regions' : list_regions, 
       'list-stacks' : list_stacks, 
       } 


def parseArgs(): 
    parser = argparse.ArgumentParser() 
    parser.add_argument("--region") 
    parser.add_argument("--command") 
    parser.add_argument("--access-key") 
    parser.add_argument("--secret-key") 
    args = parser.parse_args() 

    if not args.command: 
     raise MissingParamException("command") 

    if args.command not in command_list: 
     raise InvalidCommandException(args.command) 

    command_list[args.command](args) 
if __name__=='__main__': 
    try: 
     parseArgs() 
    except Exception, e: 
     print e 

Ошибка:

'NoneType' object has no attribute 'string' 
+0

Какая строка генерирует эту ошибку? Пожалуйста, разместите полный отчет, а также соответствующий раздел кода. – larsks

ответ

1

Ошибка в этом заявлении stackSumm.stack_name in pattern. pattern в этом случае является объектом _sre.SRE_Pattern, а не строкой. Строка, которая содержит результат этого матча:

match = pattern.match(stackSumm.stack_name) 
print match.string 

И строка iserable. Таким образом, вы можете безопасно проверить, содержится ли имя стека в совпадении вашего выражения:

if stackSumm.stack_status in "CREATE_COMPLETE" and match and stackSumm.stack_name in match.string: 
    print_stack(get_stack(args, stackSumm.stack_id)) 
+1

Я думаю, что для 'if' вам нужно, чтобы' match не был None', а не выполнял избыточный тест подстроки на 'match.string'. – Blckknght

+0

Да, правда, в противном случае он потерпит крах, если нет совпадения. Обновленный ответ, спасибо! – fips

+0

Обновленная функция, как показано ниже. Но это бросается ниже ошибки. четкости list_stacks (аргументы): стеки = get_stacks (аргументы) для stackSumm в штабеля: паттерн = re.compile ("^ MultiFileUpload-эфемеровые ([AZ] [0-9] +) * - ([0- 9] *) ") матч = pattern.match (stackSumm.stack_name) печати match.string , если stackSumm.stack_status в "CREATE_COMPLETE" и матч и stackSumm.stack_name в match.string: print_stack (get_stack (арг, stackSumm .stack_id)) Объект 'NoneType' не имеет атрибута 'string' – user6136315