CloudFormationで作成されたAWSリソースを一括で削除する機会があり、作業を実施する前に削除対象のAWSリソースを一覧に出す必要がありました。
マネジメントコンソールから手作業で一覧まとめるのは大変なので、何かスクリプト書いて解決できないか探したところ以下の記事がめちゃくちゃわかりやすくまとまってました。
Pythonでboto3を使ってCloudFormationの情報を取得し、pandasでCSVに出力されています。
boto3とpandas使えばいろんな場面で応用が効きそうなのでもっと使っていきたいと思いました。
ちょっと変えたところ
記事にあるコードではstatusがROLLBACK_COMPLETE、CREATE_COMPLETE、UPDATE_COMPLETEとなっているものが出力する条件になっていましたが、自分の場合はさらにスタック名でも絞りたかったので以下のように条件を追加しました。
あと、CSVが標準出力になっている部分をCSVファイルで出力するようにしました。
import sys
import boto3
import pandas as pd
def print_all_cfn_resources(format: str = "md"):
"""CloudFormationの全スタックの全リソースの情報を取得、表示する
Args:
format (str, optional): 出力フォーマット("md" or "csv"). Defaults to "md".
"""
STATUSES = ['ROLLBACK_COMPLETE', 'CREATE_COMPLETE', 'UPDATE_COMPLETE']
cfn = boto3.resource('cloudformation')
buffer = []
for s in cfn.stacks.all():
if s.stack_status not in STATUSES or '出力するスタック名' not in s.name: # スタック名を条件に追加
continue
for r in s.resource_summaries.all():
buffer.append(
[
s.stack_name, # スタック名
r.logical_resource_id, # 論理ID
r.physical_resource_id, # 物理ID
r.resource_type, # タイプ
r.resource_status # ステータス
]
)
df = pd.DataFrame(buffer, columns=[
"StackName", "LogicalResourceId", "PhysicalResourceId", "Type", "Status"])
# 出力
if format == "csv":
df.to_csv('output/cfn_resources.csv') # 出力するパスを指定
else:
print(df.to_markdown(showindex=False))
if __name__ == "__main__":
# USAGE(to Markdown): python (PATH_TO_SCRIPT)/get_all_cfn_resources.py md
# USAGE(to CSV): python (PATH_TO_SCRIPT)/get_all_cfn_resources.py csv
print_all_cfn_resources(format=sys.argv[-1])
pass