★★ 中級

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 バージョン・同じバイナリ でコードを評価できます。

なぜコミットが必須か

.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_providersversion 制約を緩めてから -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 をプルリクエストで取り込むフローにする。

推奨運用フロー

  1. 新規プロジェクト: terraform init.terraform.lock.hcl が生まれる → コミット
  2. 新しい provider を追加: terraform { required_providers { ... } } 追記 → terraform init → lock 更新 → コミット
  3. 定期更新(月次など): terraform init -upgrade → diff 確認 → plan 確認 → コミット
  4. マルチプラットフォーム: terraform providers lock -platform=... をたまに走らせる
  5. CI: terraform init -input=false(lock のバージョンに固定)→ plan / apply
自動更新 lock ファイル更新は Dependabot / Renovate で PR 自動化できます。週次で「provider 5.83.1 → 5.84.0」の PR が飛んでくる運用に。