[小ネタ]CloudFormationの全スタック・全リソースの情報を表示するPythonスクリプト
はじめに
このリソースってどのCloudFormation(CFn)スタックから作られたやつだっけ・・・
AWS環境が大規模になってくるとこんなケースが出てくるかもしれません。
CFnから作られたリソースには aws:cloudformation:stack-name
タグが付くので
そこから分かります。
が、タグ情報は書き換えられる可能性はゼロではないですし、 複数のスタック間の複数のリソースを俯瞰したいケースもあるかと思います。
そこで表題の CFnの全スタック・全リソースの情報を表示するPythonスクリプト を作ってみました。
スクリプト
以下パッケージを使います
- boto3
- pandas( >= 1.0.0)
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: 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": print(df.to_csv(index=False)) 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
利用例
実際の出力例を載せてみます (OS: macOS, Python: 3.7.3)
CSV 出力例
- コマンド:
python ./print_all_cfn_resources.py csv
$ python ./print_all_cfn_resources.py csv StackName,LogicalResourceId,PhysicalResourceId,Type,Status TgwArchAppInstanceStack,CDKMetadata,8732eb10-73fe-11ea-9b91-0ab0f59df27e,AWS::CDK::Metadata,CREATE_COMPLETE TgwArchAppInstanceStack,ec2InstanceProfile,TgwArch-ec2-instance-profile,AWS::IAM::InstanceProfile,CREATE_COMPLETE TgwArchAppInstanceStack,iamRoleForEc2,TgwArch-ec2-role,AWS::IAM::Role,CREATE_COMPLETE TgwArchAppInstanceStack,instance,i-0c76752e28335c0fb,AWS::EC2::Instance,CREATE_COMPLETE ...(略)... TgwArchAppNwStack,CDKMetadata,54ca0fb0-73fd-11ea-833e-068a1e4f7940,AWS::CDK::Metadata,CREATE_COMPLETE TgwArchAppNwStack,ec2Rtb,rtb-01cdbc243363e942a,AWS::EC2::RouteTable,CREATE_COMPLETE TgwArchAppNwStack,ec2RtbAssoc,rtbassoc-01eb9f9f825321aa3,AWS::EC2::SubnetRouteTableAssociation,CREATE_COMPLETE TgwArchAppNwStack,ec2Subnet,subnet-0ce85d3d104a72080,AWS::EC2::Subnet,CREATE_COMPLETE ...(略)... insightwatch,ContentProtectedReadOnlyPolicy,arn:aws:iam::XXXXXXXXXXXX:policy/insightwatch-ContentProtectedReadOnlyPolicy-1X2774TLOYTMT,AWS::IAM::ManagedPolicy,CREATE_COMPLETE insightwatch,ExplicitDenyActionPolicy,arn:aws:iam::XXXXXXXXXXXX:policy/insightwatch-ExplicitDenyActionPolicy-FFM4FYWYMA6O,AWS::IAM::ManagedPolicy,CREATE_COMPLETE insightwatch,IAMRole,insightwatch-IAMRole-1KTG03HC8SRBU,AWS::IAM::Role,CREATE_COMPLETE cm-kawahara-masahiro-iam-role,IAMRoleForCmEngineer,cm-kawahara.masahiro,AWS::IAM::Role,CREATE_COMPLETE
CSVを Excelで開いてみます。以下のような構成です。
Markdown 出力例
- コマンド:
python ./print_all_cfn_resources.py md
$python ./print_all_cfn_resources.py md | StackName | LogicalResourceId | PhysicalResourceId | Type | Status | |:------------------------------|:-------------------------------|:-------------------------------------------------------------------------------------------|:--------------------------------------|:----------------| | TgwArchAppInstanceStack | CDKMetadata | 8732eb10-73fe-11ea-9b91-0ab0f59df27e | AWS::CDK::Metadata | CREATE_COMPLETE | | TgwArchAppInstanceStack | ec2InstanceProfile | TgwArch-ec2-instance-profile | AWS::IAM::InstanceProfile | CREATE_COMPLETE | | TgwArchAppInstanceStack | iamRoleForEc2 | TgwArch-ec2-role | AWS::IAM::Role | CREATE_COMPLETE | | TgwArchAppInstanceStack | instance | i-0c76752e28335c0fb | AWS::EC2::Instance | CREATE_COMPLETE | ...(略)... | TgwArchAppNwStack | CDKMetadata | 54ca0fb0-73fd-11ea-833e-068a1e4f7940 | AWS::CDK::Metadata | CREATE_COMPLETE | | TgwArchAppNwStack | ec2Rtb | rtb-01cdbc243363e942a | AWS::EC2::RouteTable | CREATE_COMPLETE | | TgwArchAppNwStack | ec2RtbAssoc | rtbassoc-01eb9f9f825321aa3 | AWS::EC2::SubnetRouteTableAssociation | CREATE_COMPLETE | | TgwArchAppNwStack | ec2Subnet | subnet-0ce85d3d104a72080 | AWS::EC2::Subnet | CREATE_COMPLETE | ...(略)... | insightwatch | ContentProtectedReadOnlyPolicy | arn:aws:iam::XXXXXXXXXXXX:policy/insightwatch-ContentProtectedReadOnlyPolicy-1X2774TLOYTMT | AWS::IAM::ManagedPolicy | CREATE_COMPLETE | | insightwatch | ExplicitDenyActionPolicy | arn:aws:iam::XXXXXXXXXXXX:policy/insightwatch-ExplicitDenyActionPolicy-FFM4FYWYMA6O | AWS::IAM::ManagedPolicy | CREATE_COMPLETE | | insightwatch | IAMRole | insightwatch-IAMRole-1KTG03HC8SRBU | AWS::IAM::Role | CREATE_COMPLETE | | cm-kawahara-masahiro-iam-role | IAMRoleForCmEngineer | cm-kawahara.masahiro | AWS::IAM::Role | CREATE_COMPLETE |
VSCodeの Markdownプレビューで開いてみました。
おわりに
とりあえず CFnの全スタック・全リソースをざざざざっと見たいときに使えると思います。
この記事が少しでもどなたかのお役に立てば幸いです。