アジアクエスト クラウドインテグレーション部の田中雄也です。
この記事では、リソース整理ツールであるaws-nukeを導入した時の記録を記載しています。
この記事が皆様のAWS環境の整理の一助になれば幸いです。
アジアクエストでは、技術検証のためにAWS環境が会社から提供されています。
運用ルールを敷いてAWS環境を利用していましたが、時々リソースの消し忘れが発生してしまうことがありました。そのため、運用担当者が手作業でこれらのリソースを削除する必要がありました。
そうした問題を解決する手段として、リソース整理ツールである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ログインを使用しているため、その場合の手順を記載します。
②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
account-blocklist
補足
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の運用にあたって、稼働後の設定変更は主に以下から変更可能です。
ご利用の環境に合わせて適した設定を見つけてみてください。
任意のnukeリソース
任意のnukeリソース
任意のnukeリソース
aws-nukeはデフォルトでは、IAMポリシーNukeAccountCleanser
に権限を依存しており、ここで許可対象とされていないリソースに関しては削除ができません。
そのため、ログなどを確認して権限が足りないことでリソースの削除が行えない場合には、対象のIAMポリシーを緩和して権限を与えてあげる必要があります。
詳細は割愛しますが、aws-nuke導入にあたって個人的には以下の2点の追加設定を行って便利になったと感じました。
nukeのビルドプロジェクト
> [編集] > ログから設定可能ですよければお試しください!
というわけで、この記事ではaws-nukeの導入手順をご紹介させていただきました。
aws-nukeを利用することでアカウント内のリソース整理を簡単化できるイメージを持っていただけましたでしょうか?
ちなみに、アジアクエストの環境ではタグでのリソース選別やStepfunctionを使ったaws-nukeの定期実行についても設定をしていますので、機会があればその辺りもご紹介できればと思っています。
この記事をきっかけにAWS環境のリソース整理に関心を持っていただけると幸いです。
最後まで読んでいただき、ありがとうございました。