★★ 中級

04. pre-commit フック

commit する瞬間に terraform fmtvalidate・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_fmtterraform fmt で整形(インデント・空白の統一)2 スペースインデントになっていない
terraform_validateterraform validate で構文・型チェックtype エラー、未定義変数
terraform_tflint未使用変数、非推奨書き方、provider 固有のミス検出使っていない var、無効な instance_type
terraform_trivyセキュリティスキャン(旧 tfsec の後継)S3 バケットが public、SG が 0.0.0.0/0 全開
terraform_checkov同上、別実装。trivy と併用も可CIS ベンチ違反、暗号化未設定
terraform_docsmodule の 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 で止める)。