03. .gitignore と機密管理
Terraform リポジトリで一番やってはいけない事故は state ファイルや認証情報を Git にコミットしてしまうこと です。最初に .gitignore を入れる、これだけは省略しないでください。
なぜ機密ファイルをコミットしてはいけないか
- state ファイル (
terraform.tfstate): AWS の現状(リソース ID、稀に DB のパスワード等の生値)が JSON で書かれている。Git に上げると、リポジトリにアクセスできる人=誰でも閲覧可能。 .tfvars: API キーやパスワードが書かれることがある。1 度コミットすると、削除しても Git の履歴には永久に残る。.terraform/: provider バイナリが格納される。重い(数百 MB)し、PC 環境ごとに変わるのでコミットする意味がない。
公式 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.log | Terraform クラッシュ時のスタックトレース。コミット不要 |
override.tf 系 | ローカルで一時的に上書きする用。チームに共有するものではない |
.terraformrc / terraform.rc | 個人ごとの CLI 設定(プロキシ等) |
.terraform.tfstate.lock.info | apply 中の一時ロックファイル |
チームで使う tfvars サンプルの配り方
# 機密値はダミーにして .example で配る(こちらはコミットする)
terraform.tfvars.example
# 内容例
# region = "ap-northeast-1"
# db_password = "REPLACE_ME"
# 個人ごとに本物を作る
cp terraform.tfvars.example terraform.tfvars
# 中身を埋めて使う(このファイルはコミットされない)
うっかりコミットした時の対処
- もう push 済みなら、その秘密はリーク扱い。即座にローテーション(パスワード変更、アクセスキー削除など)。
- そのうえで、Git 履歴から消す:
git filter-repoまたは BFG Repo-Cleaner を使う(git rmだけでは履歴に残る)。 - Force push でリモートを書き換える前に、関係者に共有して再 clone を促す。
原則
「履歴から削除すれば大丈夫」ではなく「1 度公開ネットに出た秘密は、無効化するしかない」。これがクラウド運用の鉄則です。
そもそも秘密はどこに置くか
- ローカル開発: 環境変数
TF_VAR_...または.envrc+ direnv。.envrcは.gitignoreに必ず追加 - CI(GitHub Actions): GitHub Secrets。さらに望ましいのは次章の OIDC キーレス認証
- アプリが使う秘密: AWS Secrets Manager / SSM Parameter Store。Terraform からは
data.aws_secretsmanager_secret_version等で参照