[aws-nuke]特定のタグのついたリソースは削除対象外にする

2022.07.01

「aws-nukeで個別リソースの除外は数が増えると大変だからもっと簡単にしたい。具体的には、特定のタグのついたリソースは削除対象外にしたい」

aws-nukeはAWSリソースの一括削除に便利なツールです。

検証用AWSアカウントに対して使用することが多いと思います。 検証用AWSアカウントであっても削除したくないリソースはあるかと思います。(ログイン用IAM関連のリソースやコスト通知のアラーム等)

特定タグが付いたものを除外できたら便利そうと思い調べてみました。

結論: 全AWSサービスに対して特定タグを一括除外は不可、AWSサービスごとにフィルターでタグを指定する必要がある

特定タグが付いたものをaws-nukeの対象から除外する

aws-nukeにはフィルターを使用して、特定のリソースを対象から除外する機能があります。

例えば、sample-roleという名前のIAMロールが存在するとします。

このIAMロールを削除対象から外したい場合は、aws-nukeのconfigを以下のように設定します。

nuke-config.yml

regions:
  - global

account-blocklist:
  - "000000000000" # dummy

accounts:
  "<アカウントID>":
    filters:
      IAMRole:
        - type: exact
          value: "sample-role"

dry-runの結果、filtered by configになっているので削除対象から除外されています。

$ aws-nuke -c nuke-config.yml --profile <プロファイル> # dry-run実行
global - IAMRole - sample-role - [Name: "sample-role", Path: "/", tag:clean-up: "false"] - filtered by config

ただ、リソース名を一つ一つ指定していくのはconfigファイルが長くなって辛いです。

filterではタグを指定することもできます。 IAMロールsample-roleにはclean-up: falseというタグがついています。

このタグをフィルターに指定してみます。

nuke-config.yml

regions:
  - global

account-blocklist:
  - "000000000000" # dummy

accounts:
  "<アカウントID>":
    filters:
      IAMRole:
        - type: exact
          property: tag:clean-up
          value: "false"

再度dry-runしても、先程と出力が変わらずに除外できていることがわかりました。

全AWSサービスで特定タグの付いたものを一括で除外することはできない

上記の方法でも、特定のタグが付いたリソースは除外できますが、サービスごとにフィルターを作るのが面倒です。

「一括でできたら便利そう」と思って調べてみました。 結果としては、一括で行うことは不可でした。(2022/6時点)

aws-nukeのIssueにはタグ付けに対応していないAWSリソースもあることから、対応は難しいといった記述もありました。

Add an option to exclude any resource with a specific tag #796

さいごに

リソースのタグ付けはaws-nukeでクリーンアップする際も有用です。 フィルタ機能ぜひ活用していきましょう。

TerraformやCDKを使用している場合、リソースのタグ付けには以下の記事が役立つかもしれません。

以上、AWS事業本部の佐藤(@chari7311)でした。