aws-nuke でリソースを削除して心を軽くする

## はじめに

DX技術本部の yu-yama です。

AWSで `sandbox` アカウントを作り検証を続けていると、知らず知らずのうちにセキュリティグループ、スナップショット、IAMロールなどが増えていて心をざわざわさせられませんか。
いつかは整理したいと思いつつ先延ばしに...
そんなあなたに `aws-nuke` 。リソースを消せるだけ消して心をスッキリ軽くしてみましょう。

![kafun_sukkiri.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/9cdb3a39-36ff-3b1e-6faf-be6337a835b6.png)

## aws-nuke とは


AWSのリソースを削除するツールで、

機能として

  -  リージョンの指定
  -  削除するリソースタイプの指定
  -  削除しないリソースタイプの指定(除外指定)
  -  リソースのフィルタリング
    - 削除するリソースタイプのうち、特定のリソースのみ削除させたくない場合などに使用

があります。

https://github.com/rebuy-de/aws-nuke

早速 `nuke` してみましょう！

## 事前準備

削除されるアカウントのAWSクレデンシャル[^1]

削除されるアカウントにエイリアスを設定

## インストール

GitHubから使いたい環境にあった最新[リリース](https://github.com/rebuy-de/aws-nuke/releases)をダウンロードします。
今回は削除されるアカウントとは別で立てたEC2(Amazon Linux)から`aws-nuke-v2.15.0-linux-amd64.tar.gz`のバイナリを使用して実行します。

https://github.com/rebuy-de/aws-nuke/releases

### バイナリダウンロード

`$ wget https://github.com/rebuy-de/aws-nuke/releases/download/v2.15.0/aws-nuke-v2.15.0-linux-amd64.tar.gz`

### 解凍

`$ tar -zxvf aws-nuke-v2.15.0-linux-amd64.tar.gz`

### 確認

`$ ./aws-nuke-v2.15.0-linux-amd64 -h`
![20210806_screenshot_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/bce17a29-3956-cc07-edb7-f0f57b22f352.png)

## 設定ファイル作成

`aws-nuke` の設定ファイルを作成します。

```yaml:nuke-config例.yml
regions:
- eu-west-1 # 消したいリージョン
- global # グローバルサービスも消したい場合

account-blocklist:
- "999999999999" # 消したくないAWSアカウント。特に指定しなくて良いがこの部分を消すとエラーになるのでこのまま

accounts:
  "000000000000": {} # 消したいAWSアカウント
```

今回はバージニア北部(us-east-1)のリソースを削除してみます。IAMUserはglobalリソースのため、バージニア北部リージョンのみ指定だと消えないですが念のため除外リソースとして指定します。[^2]


```yaml:nuke-config.yml
regions:
- us-east-1 # 消したいリージョン

account-blocklist:
- "999999999999" # 消したくないAWSアカウント。特に指定しなくて良いがこの部分を消すとエラーになるのでこのまま

resource-types:
  # IAMユーザは消したくない
  excludes:
  - IAMUser

accounts:
  "123456789012": {} # 消したいAWSアカウント
```

## dry-run

削除されるリソースを確認します。

`$ ./aws-nuke-v2.15.0-linux-amd64 -c ./nuke-config.yml --access-key-id <access-key> --secret-access-key <secret-key>`

コマンド実行後、削除対象のアカウントが本当に正しいかアカウントエイリアスの入力を求められるので入力します。

## no-dry-run

削除されるリソースを確認し、よければオプション`no-dry-run` を付けて実行します。

`$ ./aws-nuke-v2.15.0-linux-amd64 -c ./nuke-config.yml --access-key-id <access-key> --secret-access-key <secret-key> --no-dry-run`

コマンド実行後、削除対象のアカウントが本当に正しいかアカウントエイリアスの入力を求められるので入力します。**本当に？本当にいいの？**と2回聞かれます。

実行が終わると、削除結果が表示されます。
![20210806_screenshot_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/0014fc57-253d-c8b2-d8de-9e2b6c63dee2.png)

# 感想

まあまあスッキリ。

設定ファイルを以下のようにすると

```yaml:nuke-config.yml
regions:
- global # globalを指定

account-blocklist:
- "999999999999" # 消したくないAWSアカウント。特に指定しなくて良いがこの部分を消すとエラーになるのでこのまま

resource-types:
  targets:
  - IAMRole

accounts:
  "123456789012": {} # 消したいAWSアカウント
```

IAMRoleを削除できるのですが、事前にIAMロールからポリシーをデタッチしておかないと失敗します。この部分は手間なので惜しいところ。

また、**IAMユーザ以外は全て消す**ぞと指定すると

```yaml:nuke-config.yml
regions:
- global # globalを指定

account-blocklist:
- "999999999999" # 消したくないAWSアカウント。特に指定しなくて良いがこの部分を消すとエラーになるのでこのまま

resource-types:
  # IAMユーザは消したくない
  excludes:
  - IAMUser

accounts:
  "123456789012": {} # 消したいAWSアカウント
```

IAMユーザーは残るのですが、中の認証情報やIAMグループの情報も全て消えてしまう[^3]ので注意しましょう。

使い方としてはリージョン指定で定期的に実行すると、いい感じで消してくれてスッキリできると思います。

では。

# 参考リンク

https://github.com/rebuy-de/aws-nuke

[^1]: nukeのREADMEに記載がなかったのでAdministratorAccessポリシーをアタッチしたクレデンシャルで検証しました。
[^2]: nuke公式にもそう定義されている
[^3]: ログインできなくなります！Rootアカウントに助けを求めましょう