AQ Tech Blog

AWS環境のリソース一括削除ができるaws-nukeを導入した話

作成者: yuya.tanaka|2024年04月16日

はじめに

アジアクエスト クラウドインテグレーション部の田中雄也です。

この記事では、リソース整理ツールであるaws-nukeを導入した時の記録を記載しています。
この記事が皆様のAWS環境の整理の一助になれば幸いです。

背景

アジアクエストでは、技術検証のためにAWS環境が会社から提供されています。
運用ルールを敷いてAWS環境を利用していましたが、時々リソースの消し忘れが発生してしまうことがありました。そのため、運用担当者が手作業でこれらのリソースを削除する必要がありました。

そうした問題を解決する手段として、リソース整理ツールであるaws-nukeの検証兼導入が実施されることになりました。

aws-nukeとは

aws-nukeとはAWS環境のリソースを整理するためのツールです。
このツールを利用することで、AWS環境のリソースの一括削除を実現できます。デフォルトの設定だと環境上のリソースの全削除する挙動となります。しかし、設定をカスタムすることで自由度は高くないながらにも定期実行をしながら指定したリソースのみを削除するといった運用方法も可能になります。
そのため、aws-nukeを環境にうまく取り入れることでリソースの使用量削減を実現できます。

ちなみに、aws-nukeはAWSのドキュメントで取り上げられてこそいるものの、AWS公式のツールではないため自己責任かつ注意をして利用してください。
※下手に扱うと環境内のリソースがすべて削除されてしまう恐れがあります。

導入してみる

ここからは、実際に試したaws-nukeの導入手順を記載します。

 

事前準備

aws-nuke利用にあたっては事前準備として

をしておくことが必要です。

ここでは、アカウントエイリアスの設定についてのみ触れます。
アカウントエイリアスの設定をする際には、AWSのコンソール画面からIAMのダッシュボード画面に遷移し、画像赤枠の部分からエイリアスの設定をします。

これら2つの設定が完了すればaws-nuke導入のための事前準備は完了です。
それでは、ここから実際に導入をしてみましょう。

 

導入

コピー

①Linux実行環境で下記コマンドを実行する

git clone https://github.com/aws-samples/aws-nuke-account-cleanser-example.git

②リポジトリをコピーできていることを確認する
※検証時には、aws-nuke-account-cleanser-example\nuke-cfn-stack.yaml内12行目BucketNameを短めに編集しないと、 後々のCFnでのデプロイ時にリソース名超過による命名規則違反でデプロイが失敗するケースがありました。(リージョン名が長いリージョンへのデプロイ時など)

デプロイ

コピーの手順で取得してきた設定ファイルを基にCloudFormationを利用しaws-nukeをデプロイしていきます。
①デプロイ対象アカウントの認証情報を取得してくる
アジアクエストではSSOログインを使用しているため、その場合の手順を記載します。

  1. awsアカウント選択画面に遷移する
  2. CFnStack実行先のアカウントを選択する
  3. [Command line or programmatic access]をクリックする
  4. 開いたメニューの中から[Option 1: Set AWS environment variables (Short-term credentials)]の下に記載されている認証情報をクリックし、コピーする

②Linux実行環境にて、コピーした認証情報をペーストして認証を受ける
※この際、AWS CLIが実行環境にインストールされている必要があります。

aws sts get-caller-identityを実行し、問題なく認証が行われていることを確認する
アカウントID,UserIDなどが表示されればOKです。

④Linux環境で/aws-nuke-account-cleanser-example階層に移動し、下記コマンドを実行する

aws cloudformation create-stack \
--stack-name NukeCleanser \
--template-body file://nuke-cfn-stack.yaml \
--region ap-northeast-1 \
--capabilities CAPABILITY_NAMED_IAM \

この設定の場合だと、Stackの名前がNukeCleanserとして東京リージョンにデプロイされます。

⑤AWSコンソールからCloudFormationを確認する
ここまでの手順に問題がなければaws-nukeのリソースがStackとして展開されているはずです。

削除対象リソースの指定

下記ファイルを編集することで、aws-nuke実行時の削除対象リソースを指定できます。

aws-nuke-account-cleanser-example\config\nuke_generic_config.yaml

対象のファイルを開くと画像のような形式になっています。

主に以下の箇所を編集して、削除対象としたいリソースを記載します。

  • excludes
    • 削除対象外とするリソース群を指定できます
  • targets
    • 削除対象とするリソース群を指定できます
  • filters
    • 削除対象とするリソースの中でも、削除対象外にするリソースを指定できます

    • 例:タグがDoNotNuke値がtrueのリソースは削除対象外となる等

      filters:
      S3Bucket:
      - type: exact
      property: tag:DoNotNuke
      value: "true"

※その他項目は以下のような理由から、とくに触らなくてもOKです

  • regions
    • nuke実行時のターゲットとなるリージョンを記載する項目です。nuke実行時にもリージョン指定が可能なため、いったんこの項目はデフォルトのままでOKです
  • account-blocklist
    • nukeの実行対象外とするアカウントのIDを指定する項目です。ここが空欄だとnukeの実行時にエラーが発生するため任意の数字を入れておく必要があります。そのため、デフォルトのままでOKです

補足

nuke_generic_config.yamlでの各リソースの指定名はVPCであればEC2VPCなどCLI用の指定名で指定をする必要があります。
それぞれの指定名を確認したい場合は、Linux環境で下記のコマンドを実行することで確認ができます。

sudo apt install aws-nuke
aws-nuke resource-type

※余談ですが、filtersを設定する際、タグのvalueに正規表現を用いることで、リソースの使用ユーザを特定するタグUserが入っていれば、Valueに入っている文字列はなにが入っていても削除対象外とし、Userタグがないことでリソース使用ユーザの特定が難しいリソースのみ削除をする。という運用を考えていたのですがうまくいきませんでした。
タグ基準でfiltersを設定する場合には、実際のリソースの値とここで指定をする値が完全に一致している必要がありそうです。

設定ファイルの格納

①AWSコンソールからCloudFormation画面に遷移し、aws-nukeのStackがデプロイされていることを確認する

②S3バケットに遷移し、CFnで作成されたバケットを開く
バケット名はcfn設定ファイルで指定した文字列-アカウントID-作成リージョン-ランダム文字列の規則で作成されています。

③S3バケットにaws-nuke-account-cleanser-example\config内にある下記ファイルをアップロードする

  • nuke_config_update.py
  • nuke_generic_config.yaml

④導入完了です!おつかれさまでした!
ここまでの手順がうまくいっていればaws-nukeが利用できるようになっているはずです。次の手順で実際にaws-nukeを実行してみます。

実行してみる

それでは早速導入したaws-nukeを実行してみましょう。
今回はStepfunctionから実行をしていきます。

①AWSコンソールからStepfunctionに遷移し、CFnで作成されたマシンをクリックする

②「実行を開始」ボタンをクリックする

③nukeを実行するための値を求められるので、以下のような形式で入力をする

{
"InputPayLoad": {
"nuke_dry_run": "true",
"nuke_version": "2.21.2",
"region_list": [
"ap-northeast-1",
"us-east-1",
"global"
]
}
}

nuke_dry_runの部分にtrueと入力すると、削除は実行されずに現在の設定でaws-nukeを実行した場合の削除対象のリソース名の出力のみを行ってくれます。そのため、実際に削除を行う前にはtrueを指定し削除対象リソースの確認をすることをおすすめします。falseと入力すると、実際にその場で削除が実行されます。注意して操作してください。
また、region_listから削除対象に加えたいリージョン名を追加できます。

④「実行を開始」ボタンをクリックし、完了まで待つ
画面が遷移し、aws-nukeが実行されるので実行完了まで待ちます。

 

実行結果を確認する

ログから実行結果を確認できます。

①CodeBuildに遷移しCFnで作成されたnukeのリソースをクリックする

②開いた画面をスクロールし、ビルド履歴から各リージョン毎のログが出力されるので、それらを確認する

上記の手順でログを確認することで、削除できたリソース、削除できなかったリソースを明確に判断できます。

運用にあたって

設定変更先

aws-nukeの運用にあたって、稼働後の設定変更は主に以下から変更可能です。
ご利用の環境に合わせて適した設定を見つけてみてください。

  • EventBridge
    • 定期実行の頻度や定期実行の際に渡すパラメーターを変更できます
    • EventBridge > [ルール] > 任意のnukeリソース
  • S3
    • S3バケット内の設定ファイルを置き換えることで、nuke実行時の削除対象リソースの設定を変更できます
  • CodeBuild
    • nuke実行時の各種挙動やログ、通知出力についての設定を変更できます
    • Codebuild > [ビルドプロジェクト] > 任意のnukeリソース
  • SNS
    • nuke実行に関する通知先についての設定などを変更できます
    • SNS > [トピック] > 任意のnukeリソース

 

権限設定

aws-nukeはデフォルトでは、IAMポリシーNukeAccountCleanserに権限を依存しており、ここで許可対象とされていないリソースに関しては削除ができません。
そのため、ログなどを確認して権限が足りないことでリソースの削除が行えない場合には、対象のIAMポリシーを緩和して権限を与えてあげる必要があります。

 

やってよかった設定

詳細は割愛しますが、aws-nuke導入にあたって個人的には以下の2点の追加設定を行って便利になったと感じました。

よければお試しください!

まとめ

というわけで、この記事ではaws-nukeの導入手順をご紹介させていただきました。

aws-nukeを利用することでアカウント内のリソース整理を簡単化できるイメージを持っていただけましたでしょうか?

ちなみに、アジアクエストの環境ではタグでのリソース選別やStepfunctionを使ったaws-nukeの定期実行についても設定をしていますので、機会があればその辺りもご紹介できればと思っています。

この記事をきっかけにAWS環境のリソース整理に関心を持っていただけると幸いです。
最後まで読んでいただき、ありがとうございました。