AWSアカウントのクリーンアップに役立つaws-nukeの紹介と注意点

2022.04.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

「AWSアカウント内のいらないリソースを一括削除したい」

AWSアカウント内のリソースのクリーンアップしたい際に、aws-nukeが便利です。

今回は、aws-nukeの基本的な使い方を紹介します。

便利なツールですが、設定や操作ミスで意図せずリソースを削除する可能性もあります。

安全に使うための注意点についても書いてみました。

aws-nukeとは

AWSアカウント内のリソースを削除することができるツールです。

全リソース削除以外にも、フィルター機能などを使用した特定リソースの削除や除外も可能です。

rebuy-de/aws-nuke

試してみる

事前準備

実行対象のAWSアカウントにアカウントエイリアスを設定する必要があります。 (実行時に、アカウントエイリアスの入力が求められます)

マネジメントコンソール>IAM>ダッシュボード>アカウントエイリアス>編集で設定できます。

IAMアカウントエイリアス

AWS アカウント ID とそのエイリアス

aws-nukeのインストール方法は色々ありますが、今回はDockerを使用します。 コマンドが長くなるため、ラッパースクリプトを用意すると便利です。

aws-nuke.sh

#!/bin/bash
docker run --rm -it -v $(pwd)/nuke-config.yml:/home/aws-nuke/config.yml \
    -v ~/.aws:/home/aws-nuke/.aws \
    rebuy/aws-nuke \
    --config /home/aws-nuke/config.yml $@

aws-nuke用のconfig用意

aws-nuke.shと同じ階層にaws-nuke用のconfigを用意します。 (検証用の環境はAWS SSOを使用しており、IAMロール消してしまうとログインできなくなるためexcludesで除外しています。詳細は後述)

nuke-config.yml

---
regions:
- ap-northeast-1
- global
account-blocklist:
- 000000000 # 削除対象外アカウントのアカウントID(指定しないとエラーになる)
resource-types:
  # don't nuke IAM users
  excludes:
  - IAMRole
  - IAMRolePolicyAttachment
  - IAMSAMLProvider
  - IAMRolePolicy
accounts:
  1234567890: {} #削除対象アカウントのアカウントID 要書き換え

Dry Run

以下コマンドでDry Runが実行できます。

$./aws-nuke.sh --profile <プロファイル>
# アカウントエイリアスを聞かれるため、事前準備で設定した値を入力してエンター
Do you really want to nuke the account with the ID 1234567890 and the alias <AWSアカウントエイリアス>?
Do you want to continue? Enter account alias to continue.
> <AWSアカウントエイリアス>

削除されるリソースは以下のように表示されます。

nuke-delete

削除不可なリソースは以下の表示になります。(KMS AWSのマネージドキー・RDSなどのデフォルトパラメータグループなど)

nuke_cannot_delete

config修正とDry Runで結果を確認して、実行します。

実行

実際に消す場合は、オプションに--no-dry-runを指定します。 Dry Run時と同様に、削除実施前にアカウントエイリアスの確認があります。

$./aws-nuke.sh --profile <プロファイル> --no-dry-run

CodeBuild上で実行するなど、アカウントエイリアスの確認をスキップしたい場合はオプションに--forceを指定します。

$./aws-nuke.sh --profile <プロファイル> --no-dry-run --force

特定のサービスを除外・削除

特定サービスの除外は、excludesで指定できます。

nuke-config.yml

---
regions:
- ap-northeast-1
- global
account-blocklist:
- 000000000
resource-types:
  excludes:
  - SQSQueue # SQSQueue以外削除される
accounts:
  1234567890: {}

削除は、targetsで指定できます。

nuke-config.yml

---
regions:
- ap-northeast-1
- global
account-blocklist:
- 000000000
resource-types:
  targets:
  - SQSQueue # SQSQueueのみ削除される
accounts:
  1234567890: {}

特定のリソースを除外・削除

「SQSQueueは一部残して、全て消したい」ような場合はフィルターが使えます。 フィルターで指定したリソースを削除から除外することができます。

例えば、3つのSQSQueueがあるとします。


$ aws sqs list-queues                         
{
    "QueueUrls": [
        "https://sqs.ap-northeast-1.amazonaws.com/1234567890/test-1",
        "https://sqs.ap-northeast-1.amazonaws.com/1234567890/test-2",
        "https://sqs.ap-northeast-1.amazonaws.com/1234567890/test-3"
    ]
}

以下のようにconfigを書くことで、test-1test-2を除外してリソース削除が可能です。 フィルターは色々な方法で指定できます。 詳細はこちらを参照ください。

nuke-config.yml

---
regions:
- ap-northeast-1
- global
account-blocklist:
- 000000000
resource-types:
  excludes:
  - SQSQueue # SQSQueue以外削除される
accounts:
  1234567890:
    filters:
      SQSQueue:
        - "https://sqs.ap-northeast-1.amazonaws.com/1234567890/test-1" # リソース名を直接指定
        - type: contains 
          value: "test-2" # test-2が含まれるもの

実行結果

ap-northeast-1 - SQSQueue - https://sqs.ap-northeast-1.amazonaws.com/1234567890/test-1 - filtered by config
ap-northeast-1 - SQSQueue - https://sqs.ap-northeast-1.amazonaws.com/1234567890/test-2 - filtered by config
ap-northeast-1 - SQSQueue - https://sqs.ap-northeast-1.amazonaws.com/1234567890/test-3 - would remove
Scan complete: 3 total, 1 nukeable, 2 filtered.

デフォルトではフィルターに一致するものは除外されますが、反転してフィルターに一致するものを削除することもできます。

nuke-config.yml

SQSQueue:
  - type: contains 
       value: "test-2"
       invert: true # 反転

注意点

aws-nukeは環境のクリーンアップ時に、とても便利なツールです。

一方、全てのリソースを削除することも可能なため、検証や導入には注意が必要です。

以下の対応を行うことで、使用時の安全性が増すと思います。

  • Dry Runの結果を必ず確認する(特にwould remove)
  • 本番環境のAWSアカウントIDをaccount-blocklistに登録しておく
  • 本番環境のAWSアカウント アカウントエイリアスにprodを含めておく
    • prodが含まれていると、aws-nuke実行時にエラーが出て実行されない
  • targetsexcludesの活用
    • まずは、targets指定で使ってみる
    • IAM系を間違って消すと、AWSアカウントに入れくなる可能性がある
    • 自動でAWSアカウントセットアップしている環境など要注意(ConfigとかLambdaとか消してはいけないリソースが無いか要確認)

おわりに

aws-nukeは、AWSアカウントのリソースを一気に全て消す物騒なツールという印象を持っていました。

実際に触ってみて、リソース指定や除外・豊富なフィルター機能・Dry Runなど安全にリソース削除するための仕組みがあることがわかりました。

アカウント閉鎖前や定期的にリソースをクリーンアップしたい場合などに、便利かと思うのでぜひ検討してみてください。

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