Terraformを消し忘れて重課金されるの防ぎたい。

要約
Terraform のリソース消し忘れによる重課金は誰にでも起こり得ます。Terraform を Git 管理し、GitHub Actions からterraform destroyを実行することで、思い出した瞬間に安全かつ確実にリソースを削除できます。
意見はこのエリアに表示されます

はじめに

Terraformを使ってインフラを構築していると、一番怖いのが リソースの消し忘れによる重課金 です。

朝、急いで家を出てから「あ〜、消し忘れた……」と思い出して家に戻り、慌てて terraform destroy
あるいは、わざわざ戻ったのに 実はもう消してあった、という虚無の時間。

誰しも一度は経験があるのではないでしょうか。

今回は、そんな事故を防ぐために TerraformをGit管理し、GitHub Actionsからdestroyを実行する方法 を紹介します。

手順1:TerraformをGit管理する

まず前提として、Terraform のコードは Git で管理します。

GitHub Actions から terraform apply を自動実行する構成については、
以下の記事で詳しく解説しています。

Github Actions×Terraformでインフラ構築を自動化する方法

必ずしも apply を自動化する必要はありません が、terraform destroy を GitHub Actions から実行するためには、少なくとも GitHub Actions が destroy を実行できる権限 を持っている必要があります。

一般的に、apply が実行できる権限を持っていれば destroy も実行できることが多いため、結果として apply の自動化も行っておくと便利 です。

手順2:destroyを手動トリガーできるGithub Actionsを作る

このコードはGoogle Cloudを使った例です。しかし他のクライドプロバイダーで行うことはできます。

この例ではGoogle Cloud Secret ManagerからCloudflareのtokenを取ってきて、それを環境変数に入れたうえでterraform destroyを呼んでいます。

何が嬉しいのか?

1. スマホから手動トリガーできる

パソコンが手元になくても、 スマホから GitHub アカウントにログインできれば GitHub Actions を 手動トリガー できます。

Githubアプリの画像
Githubアプリの画像

通勤中・通学中・休憩時間など「思い出したその瞬間」にすぐリソースを消せるのは大きなメリットです。


2. state ファイルが壊れるリスクが減る

消し忘れに気づいて、慌ててローカル環境からterraform destroy を実行した経験がある人も多いと思います。

ただ、すべてのリソースを destroy するにはそれなりに時間がかかります。時間がなくなり、

  • 実行途中でパソコンを閉じてしまう
  • 放置してスリープに入ってしまう

といったことが起きると、destroy が 中途半端な状態で止まり、state ファイルと実際のインフラが壊れてしまうリスクがあります。

GitHub Actions を使えば、一度トリガーするだけでGitHub が管理する worker 上で最後まで実行されます。ローカルで実行するよりも、安定して destroy を完了させやすい のがメリットです。


3. terraform destroy 以外の処理もまとめて定義できる

destroy 用のパイプラインはあくまで学習用であり、実運用では不要(むしろリスクになる)なケースもあります。そして学習用であればtokenをlocalに保存しておけば良いです。ここでは「こんなこともできる」という例として見てください。

上の例では、terraform destroy の前にCloudflare の API トークンを Google Cloud Secret Manager から取得 しています。

セキュリティや管理の都合上、トークンをローカルに保存せず Secret Manager に置くケースもありますが、その場合、単純に terraform destroy を実行するだけではCloudflare 側の権限不足で失敗します。

ローカルでも gcloud CLI を使えば対応できますが、毎回コマンドを思い出すのは正直面倒です。GitHub Actions に一度定義しておけば、必要な前処理を含めて ワンクリックで destroy できるようになります。

まとめ

Terraform のリソース消し忘れは、誰にでも起こりがちな事故です。

Terraform を Git 管理し、
GitHub Actions から terraform destroy を実行できるようにしておくことで、

  • 思い出したときにすぐ消せる
  • state ファイルが壊れるリスクを減らせる

といったメリットがあります。

人の記憶に頼らず、仕組みで事故を防ぐ一つの選択肢として覚えておくと便利です。

Explore More
関連記事はありません。