前回の続きより、
[AWS][Python]Lambdaでタグを判別して各サービスを削除する(EC2/EIP/EBS/ELB/ALB/RDS/S3/CloudFront)
S3も同様にタグで判別して削除してやろうとPython書いていたのだが、
すべてのバケットのNameを出力させようとしたら
こんなエラーが出た。
An error occurred (NoSuchTagSet) when calling the GetBucketTagging operation:
The TagSet does not exist
S3の場合Tagにアクセスして存在しなかった場合(Tag入ってるものは出力される)、
Exception(例外)になってしまうので、try,except(エラー処理)を使ってみた。
■エラー処理/例外処理(try,except)
Pythonは例外処理の「try catch」のロジックである「try,except」を使用する。
・基本的な使い方
1 2 3 4 |
try: f = open('adachin.txt') except: print 'error adachin.txt' |
tryのブロックの中にある処理を行いからの例外(エラー)が発生したらexceptの処理へと移る。
例外が発生しなかった場合はexceptのブロックはパスからのtry後に進んでいく。
他にも以下のようにあるが、また今度紹介しよう。
・try,except,else
・try,except,finally
というわけでこれらを駆使して例外処理を書いてみた。
■delete-s3.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# coding: utf-8 # RDS delete import boto3 ND = 'nodelete' TR = 'true' def lambda_handler(event, context): #if __name__ == '__main__': client = boto3.client('s3', "ap-northeast-1") resp = client.list_buckets() #print resp all_list = [] del_list = [] for s3 in resp['Buckets']: #print s3 all_list.append(s3['Name']) #print(all_list) #ここで例外処理 try: resp2 = client.get_bucket_tagging( Bucket=s3['Name'] ) except: None print s3['Name'] |
・出力結果
問題なくS3のバケット名がダーーっと出てきた。
■ちなみにタグが空白、特定タグ以外を削除するように書くと
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# coding: utf-8 # RDS delete import boto3 #タグを変数化 ND = 'nodelete' TR = 'true' def lambda_handler(event, context): #if __name__ == '__main__': client = boto3.client('s3', "ap-northeast-1") resp = client.list_buckets() #print resp #差分を変数化 all_list = [] del_list = [] #for文でBucketsを回しまくる for s3 in resp['Buckets']: #print s3 all_list.append(s3['Name']) #print(all_list) #例外処理でNameを表示 try: resp2 = client.get_bucket_tagging( Bucket=s3['Name'] ) except: None #print s3['Name'] #for文でTagSetを見にいき、特定タグを出力 for tag in resp2['TagSet']: #print tag if tag['Key'] == ND and tag['Value'] == TR: del_list.append(s3['Name']) #print(del_list) #上記の出力の差分を出力 diffset = set(all_list) - set(del_list) #print(diffset) targetlist = list(diffset) #print(targetlist) #削除 for target in targetlist: #print target #print type(target) response = client.delete_bucket( Bucket=target ) |
いい感じに処理がうまくいった。
■まとめ
今のところS3だけ例外だった。。
なぜ!?Why!!!
参考:
Pythonスタートブック
Pythonの例外処理
雑にAWSリソースにboto3でタグつけてみたのだが
0件のコメント