CloudShellからaws-nukeを使って特定のリソース以外を削除してみた

2024.03.20

はじめに

今回はCloudShellからaws-nukeを使ってリソースを削除してみました。
今回aws-nukeを初めて使ったので、こちらの記事を参考に進めました。

aws-nukeは対象のAWSアカウントのほぼ全てのリソースを削除するOSSです。
(私はaws-nukeというサービスがあると勘違いしてました)
基本的にはアカウントを削除する場合や、アカウント削除が許容できる開発環境での使用が想定されているようです。
アカウント削除までのコストを抑えたい、開発環境で作成したリソースをクリーンアップしたい!というようなケースですね。
間違っても本番環境では使わないように気をつけましょう!

aws-nukeを試してみたいけど、自分の環境でやるのはちょっと怖いな〜という方、
今回はAWS Organizationsを使ってアカウントを削除しても問題ないように進めていくので、よければ参考にしてみて下さい。

検証環境の準備

検証アカウント作成

AWS Organizationsが有効化されていることを前提とします。
有効化されていない場合は有効化しましょう。

まずはAWS Organizationsでアカウントを作成します。
AWS Organizationsの画面から「AWSアカウントを追加」

適当なアカウント名と、自身のメールアドレスを入力してアカウントを作成します。
IAMロールはデフォルトのままOrganizationAccountAccessRoleを使用します。
IAMロール名は後ほどスイッチロールする際に必要なので控えておきましょう。

AWSアカウントが作成できました。

作成したアカウントを開いてアカウントIDを控えておきます。

それではスイッチロールしましょう!

先ほど控えておいたアカウントIDとOrganizationAccountAccessRoleを入力してスイッチロールします。
表示名は適当にわかりやすい名前を入れましょう。

アカウントエイリアス作成

次にaws-nukeの実行に必要なアカウントエイリアスを設定します。
IAMのダッシュボードより、アカウントエイリアスを作成します。

任意のエイリアスを入力します。
こちらのエイリアスはaws-nuke実行時に必要なので控えておきましょう。

検証リソース作成

今回は特定のIAM Userが削除されていないことも確認したいので、test-userというIAM Userを1つ作成しておきます。

また、リソースが削除されていることを確認できるようにVPCも一つ作成しておきます。

これで準備が整いました。

aws-nukeの設定ファイル

まずはCloudShellを起動します。

それではaws-nukeで使用するconfigファイルを用意します。

$ vim nuke-config.yml

こちらのnuke-config.ymlで削除対象のリソースを定義していきます。
今回は以下の条件でnuke-config.ymlを作成します。

  • 削除対象のリージョンは東京、米国東部 (バージニア) 、グルーバル
  • スイッチロール用のロールは残しておく
  • 特定のIAM User(test-user)を残しておく

~/nuke-config.yml

regions:
- ap-northeast-1
- us-east-1
- global
account-blocklist:
- "999999999999"
resource-types:
  excludes:
  - IAMRole
  - IAMRolePolicyAttachment
  - IAMSAMLProvider
  - IAMRolePolicy
accounts:
  "<account-id>":
    filters:
      IAMUser:
      - "test-user"

\<account-id>にはアカウントIDを記載してください。
今回はresource-typesでnuke対象外のリソースを絞り、filtersで特定のリソースを削除対象から除外しました。
他にも設定方法を変えることで削除対象を制限することができます。
細かい設定についてはこちらを参考にしてください。

aws-nukeのインストールと実行

githubを参考にインストールを行います。
今回は1番簡単なwgetでインストールする方法をやってみます。
CloudShellではドキュメント通りのコマンドを実行するとbinディレクトリがないよと怒られるので、最後の$HOME/binを$HOMEに変更して実行します。

wget -c https://github.com/rebuy-de/aws-nuke/releases/download/v2.25.0/aws-nuke-v2.25.0-linux-amd64.tar.gz -O - | tar -xz -C $HOME

これでホームディレクトリにaws-nuke-v2.25.0-linux-amd64というファイルができたと思います。
現時点のディレクトリ構成はこんな感じです。

~
├── aws-nuke-v2.25.0-linux-amd64
└── nuke-config.yml

では、先ほど作成したconfigファイルを指定して実行します。

$ ./aws-nuke-v2.25.0-linux-amd64 --config nuke-config.yml

aws-nuke version v2.25.0 - Mon Sep  4 07:22:03 UTC 2023 - 2bd22d5e5c0cf6a4011b3c08a5b1c25e2e6c75bd

Do you really want to nuke the account with the ID 851725451639 and the alias 'aws-nuke-test-account-851725451639'?
Do you want to continue? Enter account alias to continue.
> アカウントエリアス入力

アカウントエイリアスを聞かれるので、入力して実行します。
Dry runが実行されて、削除されるリソース、されないリソースが表示されます。

WARN[0013] skipping request: DNS lookup failed for globalaccelerator.ap-northeast-1.amazonaws.com; assuming it does not exist in this region 
INFO[0013] MGNJob: Account not initialized for Application Migration Service. Ignore if you haven't set it up. 
ap-northeast-1 - EC2InternetGateway - igw-09b7eac3872e8ab13 - [DefaultVPC: "true", OwnerID: "851725451639"] - would remove
ap-northeast-1 - MemoryDBACL - open-access - [Name: "open-access"] - open-access ACL can't be deleted
ap-northeast-1 - EC2DHCPOption - dopt-0f91052bf2211c7e3 - [DefaultVPC: "true", OwnerID: "851725451639"] - would remove
ap-northeast-1 - ElasticacheCacheParameterGroup - default.memcached1.4 - [GroupFamily: "memcached1.4", GroupName: "default.memcached1.4"] - Cannot delete default cache parameter group
...
global - IAMUser - test-user - [CreateDate: "2024-03-20T02:33:42Z", Name: "test-user"] - filtered by config
Scan complete: 212 total, 73 nukeable, 139 filtered.

The above resources would be deleted with the supplied configuration. Provide --no-dry-run to actually destroy resources.

末尾にwould removeと書かれたリソースは削除対象のリソースです。
Cannot delete ~と書かれたリソースはaws-nukeでは削除できないソースです。
デフォルトVPCなどAWSが提供するデフォルトリソースなどは削除できないリソースです。
また、nuke-config.ymlでフィルタしたIAM User(test-user)は末尾にfiltered by configと表示され、削除対象外になっていることが確認できます。

Dry runの結果が想定通りであれば、--no-dry-runを付けて削除を実行します。
では実際に削除してみます。

$ ./aws-nuke-v2.25.0-linux-amd64 --config nuke-config.yml --no-dry-run

実行前に2度アカウントエイリアスを聞かれるので入力します。
これでリソースが削除されます。
では確認のためにVPCの一覧を見てみます。

VPCは削除されていますね。
次にIAM Userも確認します。

こちらは削除されずに残っていますね。
これでaws-nukeを使った削除の確認ができました。

最後に今回使用したアカウントは不要なので削除しておきます。

まとめ

今回初めてaws-nukeを使いましたが、削除リソースが制限できたり、dry runもあるのである程度は安全に削除ができるな〜と思いました。
ただし、削除されるリソースを全て把握するのは難しいので、日常的に使用するようなものでもないという印象を受けました。