「このAWSリソース、手動で作った? CloudFormationで作った?」を調べて解決する

「あれ? このAWSリソース、手動で作った? CloudFormationで作った?」と不明になることがあります。 そこで、AWSリソース名を入力するとCloudFormationで作成したか否かを調べるスクリプトを作りました。
2020.09.08

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のリソース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で作成したLambdaとCloudWatch Logsのロググループ

Lambda関数の一覧

CloudWatch Logsのロググループ

手動で作成したリソースの場合

CloudFormationのリソース内では見つかりませんでした。バッチリですね。

$ python finder.py firehose_test
firehose_test is not found in CloudFormation resources.

Kinesis Firehoseの一覧

さいごに

AWS環境のお掃除などで役に立つと思います。 実験の名残としてfirehose_testが残り続けていることに気づいたので、ついでに削除しました。