2016-04-18 25 views
0

正規表現と一致するAWSクラウドのすべてのアクティブなスタックをリストしたいと思います。このようなスタック名は 'FeatureEnv-commit123asdfqw212da-3241'です。これを達成する最良の方法は何ですか?スクリプトを実行するたびにエラーが発生します。完全なスクリプトhttp://www.technobabelfish.com/2013/08/boto-and-cloudformation.html。私は自分の要件を満たすようにスクリプトを更新しました。if文とのパターン一致

#!/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 

そして文字列が反復可能です。だから、あなたのre式の一致にスタック名が含まれているかどうかを安全に確認できます:

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.string'で冗長部分文字列テストを行うのではなく、 'match is None 'をしたいと思います。 – Blckknght

+0

ええ真です。そうでなければ、マッチしなければクラッシュします。更新された答え、ありがとう! – fips

+0

以下のような機能が更新されました。しかし、それはエラー以下に投げます。 DEF list_stacks(引数):スタックにおけるstackSummため スタック=のget_stacks(引数) : パターン= re.compile( "^ MultiFileUpload-エフェメラル([AZ] [0-9] +)* - ([0- 9] *) ") 一致= pattern.match(stackSumm.stack_name) 印刷match.string stackSumm.stack_status場合における "CREATE_COMPLETE" とmatch.stringで一致とstackSumm.stack_name: print_stack(get_stack(引数、stackSumm .stack_id)) 'NoneType'オブジェクトに 'string'属性がありません – user6136315

関連する問題