10. lock ファイルと依存管理
.terraform.lock.hcl はチーム全員が同じ provider バージョンで動くための「鍵」。必ずコミットするファイルです。
.terraform.lock.hcl とは
terraform init を初めて実行すると、ディレクトリ直下に .terraform.lock.hcl が自動生成されます。中身は 「現在使っている provider の正確なバージョン」と「そのバイナリのチェックサム」。
provider "registry.terraform.io/hashicorp/aws" {
version = "5.83.1"
constraints = "~> 5.80"
hashes = [
"h1:abc123...",
"h1:def456...",
# ...
]
}
これを Git で共有すれば、誰が terraform init しても 全員が同じ provider バージョン・同じバイナリ でコードを評価できます。
なぜコミットが必須か
- 再現性: A さんは 5.80.0 で apply、B さんは 5.83.1 で apply、と差が出ると「私のところは plan が違う」事故になる
- セキュリティ: hashes が 公式バイナリのチェックサム。これが違えば「provider が改ざんされた/差し替えられた」と検知できる(サプライチェーン攻撃対策)
- CI の安定: GitHub Actions と手元で同じバージョンで動く
.gitignore に入れない
terraform.tfstate や .terraform/ はコミットしないが、.terraform.lock.hcl は 絶対にコミットする。混同しがちなので注意。
terraform init での挙動
| 状況 | 挙動 |
|---|---|
| lock ファイルなし | required_providers の制約内で最新を取得 → lock を新規作成 |
| lock ファイルあり | lock に書いてある version を そのまま 使う(制約と矛盾しなければ) |
| 制約と lock が矛盾 | エラー。-upgrade で更新するか、制約を直す |
バージョンを上げる
# 制約 (~> 5.80) の範囲で最新を取り直し、lock を更新
terraform init -upgrade
# 結果を確認
git diff .terraform.lock.hcl
# 問題なければコミット
git add .terraform.lock.hcl
git commit -m "chore: bump aws provider to 5.84.0"
provider のメジャーバージョン(5 → 6 等)を上げる時は、まず required_providers の version 制約を緩めてから -upgrade します。アップグレード後に terraform plan を必ず確認し、リソースの再作成が起きないかチェック。
マルチプラットフォーム
lock ファイルは OS/アーキテクチャごとにチェックサムが必要。手元(Windows)で init して lock を作って commit しても、CI(Linux)で init すると「linux_amd64 のチェックサムが lock にない」というエラーが出ます。
# 必要なプラットフォームのチェックサムを追加
terraform providers lock \
-platform=windows_amd64 \
-platform=linux_amd64 \
-platform=darwin_amd64 \
-platform=darwin_arm64
# lock ファイルが更新される。コミットして共有
git add .terraform.lock.hcl
git commit -m "chore: add multi-platform hashes to provider lock"
CI の標準対策
上のコマンドで OS 4 種を網羅しておく。あるいは「
terraform init を最初に走らせるのは CI(Linux)」と決めて、CI が作った lock をプルリクエストで取り込むフローにする。
推奨運用フロー
- 新規プロジェクト:
terraform init→.terraform.lock.hclが生まれる → コミット - 新しい provider を追加:
terraform { required_providers { ... } }追記 →terraform init→ lock 更新 → コミット - 定期更新(月次など):
terraform init -upgrade→ diff 確認 → plan 確認 → コミット - マルチプラットフォーム:
terraform providers lock -platform=...をたまに走らせる - CI:
terraform init -input=false(lock のバージョンに固定)→ plan / apply
自動更新
lock ファイル更新は Dependabot / Renovate で PR 自動化できます。週次で「provider 5.83.1 → 5.84.0」の PR が飛んでくる運用に。