aws-nukeとGithubActionsを使ったら試験用AWSアカウントのクリーンアップが楽になった話

2022.07.29

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

「AWSアカウントのクリーンアップにaws-nuke + GithubActionsいいぞ」

aws-nukeとGithubActions組み合わせたAWSアカウントのクリーンアップの仕組みを作って、運用してみた話です。

会社や個人の検証用アカウントのクリーンアップに悩んでいる方の参考になると嬉しいです。

背景

クラスメソッドでは、選考プロセスに実技試験があるポジションもあります。

私の所属しているAWS事業本部 コンサルティング部では、実技試験でAWSアカウントを使用します。

AWSアカウントにリソースを色々立ててもらうのですが、放置するとコストが発生するため試験終了後はリソースは削除する必要があります。

今までは、実技試験後に削除スクリプト + 一部手動でクリーンアップを行なっていました。

削除スクリプトで対応していないリソースやCLIでしか消せないリソースがあるなど、クリーンアップ作業に辛みがありました。

実現したかったこと

  • できるだけ全てのリソースを削除したい
    • 残したいリソースもあるから、いい感じに除外したい
  • 簡単に実行できるようにしたい
    • AWSアカウントのアクセスキーとか発行とか、ユーザーが使用するための事前準備を無くしたい
  • 運用の手間も減らしたい
    • コードを極力書かずに実現したい

上記を実現しつつ、できるだけシンプルな仕組みにしたかったため aws-nuke + GithubActionsにしました。

構成

GithubActions上で、aws-nukeを実行しています。

手動トリガー(workflow-dispatch)でワークフローが実行されるようにしています。

aws-nuke

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

rebuy-de/aws-nuke: Nuke a whole AWS account and delete all its resources.

yamlで設定ファイルを書いて、コマンド一発でリソース削除できます。

nuke(核)と名前が物騒ですが、除外も簡単にできますしDryRunも見やすいです。

Configに実施したくないアカウントIDを書けたり、AWSアカウントエイリアスにprodと名前が入っていると実行されないなど安全装置がしっかりしてます。

GithubActions

お馴染みのGithubActionsです。

クラスメソッドではGithubを使用しており、社内でもGithubActionsの採用実績がありました。

クリーンアップ時にAWSアカウントへのログイン不要に

AWSの認証情報はOIDCでIAMロールを引き受けています。

そのため、実行するユーザーはAWSへログインすることなくリソースのクリーンアップが行えます。 IAMユーザーの作成やアクセスキーの発行が不要になりました。

RunとDryRunのワークフローを用意していて、それぞれGithub上でボタンを押すだけで実行されます。

実際のワークフローファイルは、以下の記事を見てもらうとイメージできるかと思います。

Github上で権限管理

Github上で権限管理ができるのも嬉しい点です。

いくら検証環境や試験環境でも誰でもリソース削除できる状態は避けたいものです。

手動トリガーを実行するには、Write以上の権限が必要です。

作業をする人をリポジトリのWrite以上の権限でコラボレーターにしておけば、特定の人だけが削除ワークフローを実行できます。

QA

なぜ定期実行ではなく手動トリガーなのか?

コスト発生を最小限にするためには、試験の終了後すぐにリソースの削除を実施する必要があります。

また、実技試験の開始時間は応募者と参加者の都合によって決まるため、毎回同じ時間というわけでわありません。

そのため、定期実行する時間を決めるのが難しいというのがあ理ました。

なぜaws-nukeの実行環境にCodeBuildやLambdaを選ばなかったのか?

シンプルな構成にしたかったのと、実行までのステップを減らしたかったからです。

CodeBuildやLambdaを直接実行する場合は、マネジメントコンソールかAWS CLIを使用する必要があるかと思います。

どちらの方法もユーザーごとにIAMユーザーやIAMロールの作成が必要です。

上記作業を発生させたくなかったため、GithubActionsのようなAWS外のCIサービス上でaws-nukeを実行するようにしました。

Slack Bot + API Gateway + Lambda(CodeBuild)といった構成も考えられるかと思います。

ChatOpsでできたらカッコ良かったですが、GithubActions案より関連コンポーネントが増えるというデメリットはあるかと思います。

とりあえずは、シンプルに作って必要に応じて改良していきたいなと思います。

おわりに

運用開始したばかりで問題発生するかもしれませんが、その際はブログでシェアしていきます。

皆さんが、AWSアカウントのクリーンアップをどうやって運用してるとか教えてもらえると嬉しいです。

トイル撲滅は好きなので、今後もどんどんやっていきたいです。

最後に、枡川さん この活動を一緒に進めて下さってありがとうございました。

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