GitHub ActionsでTerraformのCI/CDを構築する
はじめに
インフラ構築をチームで進めていると、リソース作成が優先されてコードの質が損なわれたり、CI/CDパイプラインの構築が後回しにされがちだと思います。
特にCI/CD構築は改善と捉えられて後からの導入はとても大変です。CI/CDがないとコードの質を担保するのも大変で、後からリファクタを頑張ろうとしても、Terraformのリファクタはtfstateの変更もしないといけないため中々難しいです。
せっかくCI/CDを構築しても工数の関係で最低限しか実現できないことがあったりしたので、学習を兼ねて自分の満足する機能を有したGitHub ActionsのCI/CDを作ろうと思いました。
今回は特に以下のあたりを意識しました。
- 変更検知したディレクトリのみTerraformを実行
- Cache、Artifactによる処理の高速化
- 静的解析やクレデンシャル検知によってセキュリティを担保
- composit actionによるDRYなコード
サンプルはGitHubにあるのでよければ参考にしてください。
使用ツール
| ツール | 説明 |
|---|---|
|
|
セキュリティ脆弱性スキャンツール。TerraformコードやDockerイメージ、OSS依存関係などを対象に脆弱性の検出を行う。 |
| tflint | Terraformコードの潜在的な問題を検出するためのコードチェッカー。シンタックスとベストプラクティスに対してチェックを行う。 |
| tfcmt | Terraformのplan/apply結果をPRにコメントとして投稿するツール。CIと連携して変更内容をレビューしやすくする。(stickyよりライトに使用できて、ラベルなども付けてくれる) |
| reviewdog | 各種Linterの結果をGitHubのレビューコメントとして反映するツール。CI上での静的解析結果をPRに可視化する。アイコンの犬が可愛い |
| cache | GitHub Actionsのビルドや依存解決を高速化するためのキャッシュ機構。actions/cacheを使用してワークフローのパフォーマンスを改善。 |
| aqua | CLIツールのバージョン管理とインストールを行うツール。ローカルとCI/CD環境でのツール整合性を保つのに利用。 |
| direnv | .envrc ファイルに定義された環境変数をディレクトリ単位で自動読み込みするツール。 |
| upload/download-artifact | GitHub Actions内でファイルをアップロード・ダウンロードするためのアクション。ジョブ間での成果物を受け渡しに利用。 |
| paths-filter | 特定のファイル・ディレクトリの変更を検知してワークフローの実行を制御するアクション。 |
| action-slack-notify | Slackに通知を送信するGitHub Actions用アクション。CI結果やアラートをチャンネルに投稿できる。slack公式のactionsよりライトに利用可能。 |
| workflow-conclusion-action | ワークフローの最終的な結果(成功/失敗)を取得するアクション。 |
| sticky-pull-request-comment | Pull Requestにコメントを投稿し、同じコメントを更新形式で維持できるアクション。 |
| gitleaks-action | GitHub Actions上で gitleaks を実行し、ハードコーディングされたシークレットの検出を行うアクション。 |
CI/CDの概要
mainブランチに対するイベントをトリガーにそれぞれのworkflowが実行されます。
- PR作成
- check
- ルートモジュール、チャイルドモジュールそれぞれに対してtflint/trivy/varidate/fmtを実行
- plan
- ルートモジュールは変更検知した各環境にplanを実行し、チャイルドモジュールが変更された場合は全てのルートモジュールに対してplanを実行
- check
- PRマージ
- apply
- planと同様
- plan、apply共にtfcmtを用いて実行結果をprにコメント
- apply
CI/CDの詳細
デモとして動かした結果を添付します。
check

Trivyの実行結果(sticky-pull-request-commentによってprにコメント)

未使用な変数の検出や、fmt崩れの検出などもしてくれます。

plan


destroyの場合は分かりやすく警告を出してくれます。

apply


最終的なActionsの成功/失敗の通知。(ここはSlackにGitHubのAppをインストールするだけでもよさそうでした。)

まとめ
CI/CDは開発が続く限りレバレッジが効き続けるため、早めに作ってしまえば開発効率の底上げになります。
TerraformのCI/CDで欲しい機能は大体同じになることが多いため、一度作ってしまえば他のpjでも流用できる部分は多いと思います。
次はTerragruntやtfactionなどのツールも組み合わせてCI/CDを作ってみたいと思っています。
これからも最高な開発体験を目指して力を付けていきたいです。
Discussion