0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[AWS][boto3][delete_stack] CloudFormationスタックをシリアルに削除するサンプルスクリプト

Last updated at Posted at 2021-07-07

概要

  • 以前作ったスクリプト(*1)の反対でCloudFormationスタックを順次削除するboto3スクリプト
  • スクリプト概要
    • 削除中のスタックが完了するまで次のスタックは削除しない
    • 削除するスタックは、スタック名の前方一致でフィルタ
    • 複数のスタックを削除する場合、作成日が新しいスタックから順に削除する
    • Dry-run 機能あり
    • Dry-runとは別に誤削除の防止機能(ブロックリスト)を搭載
  • ※注意※ AWSリソースを削除するスクリプトなので、利用する際は自己責任でお願いします

環境

Windows 10 の以下バージョンの環境にて動作を確認

PS C:\> python3 --version
Python 3.8.10
PS C:\> aws --version
aws-cli/2.2.3 Python/3.8.8 Windows/10 exe/AMD64 prompt/off
PS C:\> python3
Python 3.8.10 (tags/v3.8.10:3d8993a, May  3 2021, 11:48:03) [MSC v.1928 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import boto3
>>> import botocore
>>> print(f'boto3 version: {boto3.__version__}')
boto3 version: 1.14.43
>>> print(f'botocore version: {botocore.__version__}')
botocore version: 1.17.43
>>>
PS C:\> aws configure
AWS Access Key ID [****************XXXX]:
AWS Secret Access Key [****************XXXX]:
Default region name [ap-northeast-1]:
Default output format [json]:

AWS Cloud9でも動作することを確認

user01:~/environment $ python --version
Python 3.9.4
user01:~/environment $ aws --version
aws-cli/1.19.102 Python/2.7.18 Linux/4.14.232-177.418.amzn2.x86_64 botocore/1.20.102
user01:~/environment $ python
Python 3.9.4 (default, Jul  5 2021, 12:39:18) 
[GCC 7.3.1 20180712 (Red Hat 7.3.1-13)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import boto3
>>> import botocore
>>> print(f'boto3 version: {boto3.__version__}')
boto3 version: 1.17.105
>>> print(f'botocore version: {botocore.__version__}')
botocore version: 1.20.105

スクリプト

スクリプトはgithubに格納しました。

ファイル構成

ファイルは2つあります。

ファイル名 概要
deleteCfnStacks.py スクリプト本体
deleteCfnStacks_BlockList.json ブロックリスト
削除しないスタックの条件を設定

スクリプトの実行方法

スクリプトの実行方法はこちらです。

PS C:\Users\user01\test> python deleteCFnStacks.py -f {削除するスタックのName(前方一致)} -d False|True

-f, -d オプションの2つあります。

オプション 概要
-f スタックの絞り込みオプション。削除するスタックのNameの値を指定(前方一致)
-d Falseを指定するとDry-runが無効になりスタック削除処理が実行される。
指定しない場合は、Dry-runが有効になる

スクリプト実行例)Nameが test から始まるスタックを削除します

PS C:\Users\user01\test> python deleteCfnStacks.py -f test -d False

スクリプト実行例)Nameが test から始まるスタックを確認します(スタック削除しない)

PS C:\Users\user01\test> python deleteCfnStacks.py -f test

ブロックリストの設定方法

deleteCfnStacks_BlockList.jsonに、削除しないスタックを設定します。
deleteCfnStacks_BlockList.jsonは、StackName,Dateの2通りの設定方法があります。
StackNameNameタグの文字列に対し、前方一致するスタックが削除不可になります。
Dateは、スタックの作成時刻が Start,Endの日時の期間内にあるスタックが削除不可になります。

以下はdeleteCfnStacks_BlockList.jsonの記載例

deleteCfnStacks_BlockList.json
{
    "StackName" : 
        [
            "hoge",
            "fuga"
        ],
    "Date" : 
        [
            {"Start":"2021-07-05 09:35:00","End":"2021-07-05 09:35:59","note":"メモ1"},
            {"Start":"2020-07-04 00:00:00","End":"2020-08-04 23:59:59","note":"メモ2"}
        ]
}

上記の場合、以下条件のスタックが削除不可になります。

  • スタック名がhogeから始まるスタック
  • スタック名がfugaから始まるスタック
  • 【2021-07-05 09:35:00 ~ 2021-07-05 09:35:59】 の期間内に作成したスタック
  • 【2020-07-04 00:00:00 ~ 2020-08-04 23:59:59】 の期間内に作成したスタック

実行時に表示されるメッセージ例

例1)

PS C:\Users\user01\test> python deleteCfnStacks.py -f test
Python Version Check [OK] : sys.version_info(major=3, minor=9, micro=5, releaselevel='final', serial=0)
[BLOCK(Date)] test001-subnet1 は、ブロックリストによりブロックされました
[BLOCK(StackName)] test001-vpc は、ブロックリストによりブロックされました
[Dry-run:ON] スタック削除は実行しません
■-- 選定されたスタック --■
2021-07-04 09:36:27 test001-sg
■----------------------■
PS C:\Users\user01\test>
  • 説明
    • testから始まるスタック名が対象になる
    • -d Falseオプションが無いためスタック削除しない(Dry-run有効)
    • ブロックリスト(Date)により、test001-subnet1スタックは削除しない
    • ブロックリスト(StackName)により、test001-vpcスタックは削除しない
    • スタック名 test001-sgが削除対象として選定された(Dry-run有効のため削除しない)

例2)

PS C:\Users\user01\test> python deleteCfnStacks.py -f test -d False
Python Version Check [OK] : sys.version_info(major=3, minor=9, micro=5, releaselevel='final', serial=0)
[BLOCK(Date)] test001-subnet1 は、ブロックリストによりブロックされました
[BLOCK(StackName)] test001-vpc は、ブロックリストによりブロックされました
[Dry-run:OFF] スタック削除を実行します
2021-07-04 09:36:27 test001-sg
{'ResponseMetadata': {'RequestId': 'aaaaaaaa-7777-7777-7777-777777777777', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amzn-requestid': 'aaaaaaaa-7777-7777-7777-777777777777', 'content-type': 'text/xml', 'content-length': '212', 'date': 'Sun, 04 Jul 2021 12:08:34 GMT'}, 'RetryAttempts': 0}}
[LOG] CFn Delete Stack [test001-sg] start.
[LOG] CFn Delete Stack [test001-sg] end.
PS C:\Users\user01\test>
  • 説明
    • 例1に-d Falseオプションを追記して実行
    • -d Falseオプションが有るためスタック削除する(Dry-run無効)
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?