04. pre-commit フック
commit する瞬間に terraform fmt・validate・lint を自動で走らせると、壊れたコードや整形ミスを GitHub に push する前に止められます。CI で同じチェックを走らせる前の 第一防衛線 です。
pre-commit とは
pre-commit は Python 製のフック管理フレームワークです。.pre-commit-config.yaml を置いて 1 度セットアップすれば、git commit を実行するたびに登録したチェックが自動で走り、失敗すれば commit が中断されます。
Terraform 用の標準的なフック集が antonbabenko/pre-commit-terraform です。fmt / validate / tflint / trivy / checkov / terraform-docs など、CI でも使う有名どころが揃っています。
インストール
1. pre-commit 本体
# Windows (winget)
winget install pre-commit
# macOS / Linux (Homebrew)
brew install pre-commit
# どこでも (pip)
pip install pre-commit
2. リポジトリで有効化
cd my-infra
pre-commit install
# .git/hooks/pre-commit が作られ、以後 git commit のたびに走る
.pre-commit-config.yaml
リポジトリ直下に置きます。下が Terraform プロジェクトの実用的な最小セットです。
repos:
- repo: https://github.com/antonbabenko/pre-commit-terraform
rev: v1.96.1 # 定期的に最新タグに更新
hooks:
- id: terraform_fmt
- id: terraform_validate
- id: terraform_tflint
args:
- --args=--config=__GIT_WORKING_DIR__/.tflint.hcl
- id: terraform_trivy
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v5.0.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-merge-conflict
主要フックの役割
| フック | 役割 | 失敗の典型 |
|---|---|---|
terraform_fmt | terraform fmt で整形(インデント・空白の統一) | 2 スペースインデントになっていない |
terraform_validate | terraform validate で構文・型チェック | type エラー、未定義変数 |
terraform_tflint | 未使用変数、非推奨書き方、provider 固有のミス検出 | 使っていない var、無効な instance_type |
terraform_trivy | セキュリティスキャン(旧 tfsec の後継) | S3 バケットが public、SG が 0.0.0.0/0 全開 |
terraform_checkov | 同上、別実装。trivy と併用も可 | CIS ベンチ違反、暗号化未設定 |
terraform_docs | module の README に変数・出力表を自動生成 | README 更新忘れ |
tip
まずは
terraform_fmt + terraform_validate の 2 つから入れて、慣れてきたら lint と security を足すのが続けやすいです。
手元で走らせる
# 全ファイルに対して一括で
pre-commit run --all-files
# 直前のステージング分だけ(commit 時と同じ動作)
pre-commit run
# 1 つだけ
pre-commit run terraform_fmt --all-files
# フック自体のバージョン更新
pre-commit autoupdate
失敗例と直し方
$ git commit -m "feat: add s3"
terraform_fmt..........................................................Failed
- hook id: terraform_fmt
- files were modified by this hook
# fmt が自動で書き換えてくれているので、もう一度 add → commit
$ git add . && git commit -m "feat: add s3"
この章の効果
ここまで設定すれば、commit のたびに整形・型チェック・基本セキュリティが自動で走る 状態です。次章の GitHub Actions では、push された後に同じチェックを CI 側でも走らせて二重に守ります(手元を回避してきたコミットを CI で止める)。