開発・テスト用GCP環境をすっきり整理する方法
Google Cloudで試行錯誤を重ねたり、新しいアイデアを検証したり、PoC用にクラウドアセットを大量に作成していると、環境はあっという間に散らかります。放置すればコストがかさむうえ、プロジェクトを進める際に環境を把握する手間も増えていきます。
では、どうするか。一気に吹き飛ばしましょう!

吹き飛ばせ!
DoiT Internationalをご利用のお客様であれば、Sandbox Projectsが使えます。独立した環境として作成され、まるごと削除することで散らかった状態をリセットできます。
DoiTからひとこと:GCPサービスをDoiT経由で購入しても、料金が割高になることはありません。加えて、私のようなアーキテクトによる無償コンサルティングや、業界トップクラスのコスト管理ツールもご利用いただけます。
まだDoiTのお客様ではない方や、開発プロジェクトに残しておきたいアセットがある一方で不要なものだけを削除したい方は、本記事でご紹介する新しいオープンソースプロジェクトCloud Blasterをぜひチェックしてみてください。ひとことで言えば、Cloud Blasterは不要なアセットを安全に検出して削除するツールです。
Cloud BlasterとSafe Scrubの違い
Safe Scrubは、私がBashで書いたプロジェクトで、基本的には同じ役割を果たします。詳細はこちらのブログ記事をご覧ください。
Safe Scrubのメリット:
- Safe Scrub自体は何も削除しないため安心です。
delete文を並べたシンプルなBashスクリプトを出力するだけなので、内容を確認したうえで好きなタイミングで実行できます。 - Safe Scrubは純粋なBashで書かれているため、コンパイルなしで実行されるコードをそのまま確認でき、安心感があります。
- Safe Scrubは(現時点では)Cloud Blasterよりも多くのアセットタイプに対応しています。
Cloud Blasterにも独自の安全機能が備わっています(詳しくは後述)。一般的なアセットタイプに幅広く対応しており、対応タイプを追加することも可能です。
Safe Scrubと比べると、Cloud BlasterはBashではなくKotlinで書かれているぶん、より複雑な処理を扱えます。新しいアセットタイプや機能を追加しやすく、特殊なケースにも堅牢に対応できます。一方のSafe ScrubはBashで対応できる複雑さの上限にすでに達しており、これ以上の発展は難しいでしょう。
Cloud Blasterのユースケース:Safe Scrubと同じ
想定する用途は、開発用や非公式なテスト用のプロジェクトで、一日の終わりや次のテスト実行の前に環境をまっさらにしたいケースです。
本番環境やステージング環境、さらにはチームでのテストプロジェクトには向きません。これらの環境では、作成したアセットを追跡できるTerraformなどのInfrastructure as Code(IaC)を使うべきで、必要に応じてそこから削除するのが筋です。
安全性を最優先
Cloud Blasterは、安全性とセキュリティを担保するために以下の仕組みを備えています。
- 最初のステップであるListerは、アセットを一切削除しません。確認用のファイルにアセット一覧を出力するだけです。
- Listerはプロジェクトを明示的に指定する必要があります。
gcloudのデフォルトプロジェクトを暗黙的に使うことはありません。 - Listerにはフィルタを適用できます。アセットタイプごとに正規表現を指定して、特定のアセットだけを一覧に含めたり、逆に除外したりできます。
- Listerを実行したら、削除対象のアセット一覧を確認し、ファイル先頭に
# Ready to deleteというコメント行を追加します。これで確認ステップを忘れずに済みます。(リスクを取りたい方は、ListerとDeleterの間にこのコメントを自動追加するスクリプトを書いてもかまいません。) - 最後にDeleterを実行すると、ファイルに記載されたアセットだけが削除されます。
使い方
コードはgit cloneするか、zipファイルとしてダウンロードしてください。
詳細とオプションはREADMEをご覧ください。手順を簡単にまとめると次のとおりです:
- 必要に応じて
list-filter.yamlを編集し、削除対象に含めたいアセット、あるいは除外したいアセットをホワイトリスト/ブラックリストに登録します。 - コマンドラインからListerを実行します。
- 出力ファイル
asset-list.txtを確認し、# Ready to deleteというコメントを追加します。 - Deleterを実行します。
そのほかのオプションは、./lister.sh -hまたは./deleter.sh -hで確認できます。
詳しくは Cloud Blaster README をご覧ください
対応機能
Cloud Blasterは、開発やQAで日常的に作成・破棄される主要なアセットタイプに対応しています。具体的には次のとおりです:
- Google Compute Engineのインスタンス、ディスク、ファイアウォール、アドレス
- Google Cloud PubSubのトピックとサブスクリプション
- Google Kubernetes Engineのリージョナル/ゾーナルクラスタ
- Google Cloud Operationsのログメトリクス
- Google App Engineのサービスとバージョン
- Google Cloud Functions
- Cloud Runサービス
- Cloud SQLインスタンス
- Google Cloud Storageバケット
機能を追加するには
対応アセットタイプの追加や新機能のご要望があれば、GitHubでissueを起票していただくか、ご自身でアセットタイプのサポートを実装してプルリクエストを送ってください。
作業はとても簡単です。
Kotlinの簡潔な構文と基底のdeleterクラスのおかげで、新しいアセットタイプ用のdeleterを手軽に追加できます。たとえばPubSub Topic用deleterの本体はわずか7行です。本記事の初稿を書いた後にCloud SQL用のdeleterを追加してテストしましたが、わずか15分、13行のコードで実装できました。
手順は次のとおりです:
asset-types.propertiesで対象のアセットタイプのコメントアウトを解除し、必要であればここでdeleterクラスを指定します。手順はファイル冒頭に記載されています。list-filter.yamlにアセットタイプを追加します。(設定ファイルを2つに分けているのは、ユーザーが編集するのは片方だけにするためです。このファイルの編集を忘れた場合は、わかりやすいエラーメッセージでお知らせします。)必要に応じて、ファイル内のFirewallの例のようにデフォルトフィルタを追加します。- 既存のdeleterクラスと並べて、
BaseDeleterのサブクラスを実装します。各種Google Cloud APIの呼び出し方の参考になります。
関連プロジェクトと他のアプローチ
- Safe Scrubは、同じ目的を持つ、より古いBash製のプロジェクトです。
- Travis CI GCloud CleanupとBazookaもGCEアセットを削除します。
- Cloud NukeはAWS向けに同様の処理を行います。
- Sandbox ProjectsはDoiT Internationalのお客様に無償でご利用いただけます。
最新情報は DoiT Engineering Blog、DoiT LinkedInチャンネル、DoiT Twitterチャンネルでご確認ください。採用情報は https://careers.doit-intl.com をご覧ください。