★ 初級

03. .gitignore と機密管理

Terraform リポジトリで一番やってはいけない事故は state ファイルや認証情報を Git にコミットしてしまうこと です。最初に .gitignore を入れる、これだけは省略しないでください。

なぜ機密ファイルをコミットしてはいけないか

公式 Terraform 用 .gitignore テンプレート

GitHub が公式に提供している Terraform.gitignore をそのまま使えば OK です。

# Local .terraform directories
**/.terraform/*

# .tfstate files
*.tfstate
*.tfstate.*

# Crash log files
crash.log
crash.*.log

# Exclude all .tfvars files, which are likely to contain sensitive data,
# such as password, private keys, and other secrets.
# These should not be part of version control as they are data points
# which are potentially sensitive and subject to change depending on the
# environment.
*.tfvars
*.tfvars.json

# Ignore override files as they are usually used to override resources
# locally and so are not checked in
override.tf
override.tf.json
*_override.tf
*_override.tf.json

# Include override files you do wish to add to version control using
# negated pattern
# !example_override.tf

# Include tfplan files to ignore the plan output of command:
# terraform plan -out=tfplan
# example: *tfplan*

# Ignore CLI configuration files
.terraformrc
terraform.rc

# Lock info written during apply
.terraform.tfstate.lock.info

各行の意味

パターン無視する理由
**/.terraform/*provider プラグインや module キャッシュ。サブディレクトリ含めて全除外
*.tfstate / *.tfstate.*state 本体・バックアップ。絶対にコミット禁止
*.tfvars / *.tfvars.json機密値が入りがち。サンプルだけ terraform.tfvars.example 等で別名で残す
crash.logTerraform クラッシュ時のスタックトレース。コミット不要
override.tfローカルで一時的に上書きする用。チームに共有するものではない
.terraformrc / terraform.rc個人ごとの CLI 設定(プロキシ等)
.terraform.tfstate.lock.infoapply 中の一時ロックファイル

チームで使う tfvars サンプルの配り方

# 機密値はダミーにして .example で配る(こちらはコミットする)
terraform.tfvars.example

# 内容例
# region = "ap-northeast-1"
# db_password = "REPLACE_ME"

# 個人ごとに本物を作る
cp terraform.tfvars.example terraform.tfvars
# 中身を埋めて使う(このファイルはコミットされない)

うっかりコミットした時の対処

  1. もう push 済みなら、その秘密はリーク扱い。即座にローテーション(パスワード変更、アクセスキー削除など)。
  2. そのうえで、Git 履歴から消す: git filter-repo または BFG Repo-Cleaner を使う(git rm だけでは履歴に残る)。
  3. Force push でリモートを書き換える前に、関係者に共有して再 clone を促す。
原則 「履歴から削除すれば大丈夫」ではなく「1 度公開ネットに出た秘密は、無効化するしかない」。これがクラウド運用の鉄則です。

そもそも秘密はどこに置くか