この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
AWSで「このとき、どのような動作をするんだろう?」などを確認することが多いため、AWS環境でよく実験します。 手動ポチポチでササッと作ったり、CloudFormationで作ったり、CloudFormationで作ることが目的だったり様々です。 すぐに作って試せるので非常に便利なのです。次のような場面に遭遇する方は多いのではないでしょうか。
- 見慣れないS3バケット・Lambda関数・Kinesis DataStream・etcがあるぞ?
- 実験した際の消し忘れかな。課金対象になる場合もあるし、早く消そう
- あれ? このAWSリソース、手動で作った? CloudFormationで作った?
CloudFormaionで作成したAWSリソースであれば、CloudFormationで削除すると楽ですし、実験で使ったリソース一式が漏れなく消せます。 そのため、CloudFormationで作成したならCloudFormationから削除したいのですが、調べるのって大変ですよね。
というわけで、AWSリソース名を入力すると、どのCloudFormationスタックで作成したのかを調べるスクリプトを作ってみました。 AWS環境のお掃除の一手間が楽になると思います。
おすすめの方
- 任意のAWSリソースについて、CloudFormationで作成したのか否かを調べたい方
- CloudFormationのスタック一覧を取得したい方
- CloudFormationのリソース一覧を取得したい方
環境
項目 | バージョン |
---|---|
Python | 3.7 |
作成したスクリプト
AWSリソース名を入力すると、どのCloudFormationスタックで作成したのかを調べるスクリプトです。
仕様
CloudFormationの物理IDを確認します。
ソースコード
CloudFormationのスタック一覧を取得し、スタック毎にリソース一覧を取得して確認しているだけです。 下記は部分一致OKですが、AWSリソース名を完全一致にしたい場合は、19行目の判定文を修正すればOKです。
また、CloudFormationのスタック取得(list_stacks()
)は、削除されたスタック情報(90日間)も取得できるため、StackStatusFilter
で除外しています。細かい設定は、必要に応じて実施してください。
finder.py
import sys
import boto3
from typing import List, Dict
cfn = boto3.client('cloudformation')
def finder(target_resource_id):
stacks = get_stacks()
found = False
for stack in stacks:
stack_name = stack['StackName']
resources = get_stack_resources(stack_name)
for item in resources:
physical_resource_id = item['PhysicalResourceId']
resource_type = item['ResourceType']
if target_resource_id in physical_resource_id:
print(f'{stack_name}: {resource_type}, {physical_resource_id}')
found = True
if found is False:
print(f'{target_resource_id} is not found in CloudFormation resources.')
def get_stacks(token: str=None) -> List[Dict]:
"""スタック一覧を取得する"""
# https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_ListStacks.html
option = {
'StackStatusFilter': [
'CREATE_COMPLETE',
'UPDATE_COMPLETE',
'ROLLBACK_COMPLETE'
]
}
if token is not None:
option['NextToken'] = token
res = cfn.list_stacks(**option)
stacks = res.get('StackSummaries', [])
if 'NextToken' in res:
stacks += get_stacks(res['NextToken'])
return stacks
def get_stack_resources(stack_name: str, token: str=None) -> List[Dict]:
"""指定したスタックのリソース一覧を取得する"""
option = {
'StackName': stack_name
}
if token is not None:
option['NextToken'] = token
res = cfn.list_stack_resources(**option)
resources = res.get('StackResourceSummaries', [])
if 'NextToken' in res:
resources += get_stack_resources(res['NextToken'])
return resources
if __name__ == "__main__":
args = sys.argv
if len(args) == 2:
finder(args[1])
使い方
下記のように実行するだけです。引数に調べたいAWSリソース名を指定します。
python finder.py aws-resource-name
実際の動作例
CloudFormationで作成したリソースの場合
AWSリソース名として、chouseisan-reminder-function
を調べます。部分一致のため複数Hitしています。
$ python finder.py chouseisan-reminder-function
Chouseisan-Reminder-Stack: AWS::Lambda::Function, chouseisan-reminder-function
Chouseisan-Reminder-Stack: AWS::Logs::LogGroup, /aws/lambda/chouseisan-reminder-function
バッチリですね。
手動で作成したリソースの場合
CloudFormationのリソース内では見つかりませんでした。バッチリですね。
$ python finder.py firehose_test
firehose_test is not found in CloudFormation resources.
さいごに
AWS環境のお掃除などで役に立つと思います。
実験の名残としてfirehose_test
が残り続けていることに気づいたので、ついでに削除しました。