はじめに
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 を 手動トリガー できます。

通勤中・通学中・休憩時間など「思い出したその瞬間」にすぐリソースを消せるのは大きなメリットです。
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 ファイルが壊れるリスクを減らせる
といったメリットがあります。
人の記憶に頼らず、仕組みで事故を防ぐ一つの選択肢として覚えておくと便利です。