[小ネタ]CloudFormationの全スタック・全リソースの情報を表示するPythonスクリプト

とりあえずCFnの全スタック・全リソースをざざざざっと見たいときに使えると思います
2020.04.02

はじめに

このリソースってどのCloudFormation(CFn)スタックから作られたやつだっけ・・・

AWS環境が大規模になってくるとこんなケースが出てくるかもしれません。

CFnから作られたリソースには aws:cloudformation:stack-name タグが付くので そこから分かります。

が、タグ情報は書き換えられる可能性はゼロではないですし、 複数のスタック間の複数のリソースを俯瞰したいケースもあるかと思います。

そこで表題の CFnの全スタック・全リソースの情報を表示するPythonスクリプト を作ってみました。

スクリプト

以下パッケージを使います

  • boto3
  • pandas( >= 1.0.0)

./print_all_cfn_resources.py

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の全スタック・全リソースをざざざざっと見たいときに使えると思います。

この記事が少しでもどなたかのお役に立てば幸いです。

参考