はじめに
いざTerraformでインフラを管理しようとなった際に、どうすれば安全なパイプラインを構築できるものか、迷うことかと思います。
この記事ではTerraformのCI/CDをGitHub Actionsで構築する方法を紹介します。
前提
この記事は、以下の記事の続きとなっております。
もしも前提となるコンテキストが必要となる場合、こちらの記事もご覧ください。

また、本パイプラインは以下を前提としています。
- AWSのリソースを管理する
- 環境はstgとprdの2環境を想定する
- planは自動で、applyはGitHub Actionsから手動でキックする
概要
結論として、以下のリポジトリにコードを置いています。
https://github.com/gonkunkun/terraform-template/tree/main/.github/workflows
Planについて
Planの実行は以下の仕様となっています。
- PRの作成/PRの更新時にPlanが実行される
- stgとprdの2環境に対するPlanが同時に実行される
- コードの変更がない場合にはPlanをスキップする(クレジットの節約のため)
- Planの実行結果はPRのコメントに貼り付けられる
Applyについて
CDにおいては、GitHubの無料枠の制約を受けています。
具体的には、有料枠のみで提供されている以下の機能が使えない制約がありました。
- ブランチの保護ルールを設定する
- GitHub ActionsのApply前のStepに承認プロセス(Approve)を設ける
そこで、いくつか妥協を重ねつつ、Applyの実行を以下の仕様としました。
- mainブランチの状態に対してApplyを実行する(これは仕様というか運用ルールです)
- ここは運用対処で凌いでいる
- mainブランチとApply対象の環境を指定して、apply用のCDをキックする
- CDキック後は、Plan -> 数秒間のwait(Planの確認用) -> Applyの順でパイプラインが動作する
- 承認プロセスを挟めないので、手動でキックしている
(複数人が同時にmainにマージすると、PRのPlan結果と異なるApplyが適用されるリスクがあります) - 擬似的に承認プロセスを挟めるようなモジュールもあったものの、承認待ちの間もクレジットを消費してしまうので、節約の観点で諦めました
- 承認プロセスを挟めないので、手動でキックしている
詳細
重複したコードが多いので、もっと綺麗に整理することもできると思います。
事前準備
- Terraformユーザ用のクレデンシャルはGitHubリポジトリ側に設定する
都度都度クレデンシャルを持ってくる方がいいのかもしれないですが、今回は楽なやり方を選んでます。
Plan
ref: https://github.com/gonkunkun/terraform-template/blob/main/.github/workflows/terraform-plan.yml
アウトプットのイメージとしては以下の感じです。

planの結果のポストは、以下の記事で解説しています。

Apply
ref: https://github.com/gonkunkun/terraform-template/blob/main/.github/workflows/terraform-apply.yml
GitHub Actionsから手動でワークフローを実行します。
おわりに
ここまで読んでいただきありがとうございました。
良いTerraformライフを!