Terraformで機密情報を扱う「禁忌」と、Secrets Managerを使い倒すプロの流儀
インフラをコード化する(IaC)際、最もやってはいけないのが「シークレットのハードコード」だ。GitHubにAPIキーをコミットした瞬間にインフラの安全神話は崩壊する。
だが、現場で見かける「Terraformでシークレットを扱う」という議論は、多くが表面的なツール紹介に留まっている。今日は、「開発スピードを犠牲にせず、かつ極限までセキュアなパイプライン」を構築するための、本質的な設計思想を伝授する。
—
1. 「Terraformでシークレットを管理する」という幻想を捨てる
まず、大前提を共有したい。Terraformはシークレットストアではない。
TerraformのStateファイル(`terraform.tfstate`)は、デフォルトでプレーンテキストとして保存される。ここに機密情報を書き込むことは、金庫の中身を道端にぶちまけるのと同じだ。
絶対ルール: シークレットは「参照」のみを行い、TerraformのStateには一切保持させない。
推奨構成:AWS Secrets Manager + Data Source
実行時にのみ値をフェッチし、メモリ上でのみ保持する設計が正解だ。
Secrets Managerから実行時に値を動的に取得
data “aws_secretsmanager_secret_version” “db_password” {
secret_id = “prod/db/password”
}
リソースには local 変数経由で流し込む(ログ出力禁止)
locals {
db_password = jsondecode(data.aws_secretsmanager_secret_version.db_password.secret_string)[“password”]
}
resource “aws_db_instance” “main” {
# … 省略 …
password = local.db_password
# 変更時にパスワードがログに出ないようライフサイクルを制御
lifecycle {
ignore_changes = [password]
}
}
—
2. 開発スピードを底上げする「プロの武装」
Terraformの記述量を減らし、ヒューマンエラーを撲滅するための「現場の必須装備」を紹介する。これを使わないのは、素手でサーバーを構築するのと同じだ。
絶対に入れるべき神プラグイン(VS Code)
1. HashiCorp Terraform: 公式は必須。`terraform validate`を裏で走らせてくれる。
2. TFLint: これがないとコードレビューで弾かれるレベル。AWS固有のルールセットを組み込め。
3. Error Lens: エラー箇所をコードの行末に表示する。デバッグ効率が3倍になる。
隠れたキーボードショートカット(生産性の極致)
- `Ctrl + Shift + P` -> `Terraform: Format`:保存時に自動フォーマットする設定(`editor.formatOnSave`)を有効にしろ。
- `Ctrl + .` (Quick Fix):不足しているproviderの宣言や、未定義変数の自動生成に活用せよ。
—
3. チーム開発の「暗黙知」をルール化する
チームの生産性が落ちる原因の8割は「コードの書き方の不一致」だ。以下のルールを`.tf`に強制適用せよ。
実践的設定構成:`terragrunt` と `tfvars` の分離
環境ごとに変数をベタ書きするのはアンチパターンだ。環境依存値は `JSON/HCL` で外部化し、Terraform本体は「モジュール」として純潔を保て。
ディレクトリ構成例:
infrastructure/
├── modules/ # 汎用ロジック(ここには環境依存値は書かない)
├── environments/
│ ├── dev/
│ │ └── secret.tfvars.json # 秘匿値はここ(Git管理対象外)
│ └── prod/
│ └── secret.tfvars.json # パイプラインが注入する
チーム内共通ルール:
- `.gitignore` の徹底: `.tfstate`, `.tfstate.backup`, `.terraform/`, `.tfvars` は即座に除外。
- 変数命名規則: `var.db_password` のように、機密情報には必ずプレフィックスか命名規則を持たせ、レビュー時に一目でわかるようにする。
—
4. 最後に:インフラエンジニアの矜持
Secrets Managerとの連携は、単なる「設定」ではない。それは「インフラのライフサイクルとセキュリティを密結合させる」という設計の表明だ。
Terraformは「リソースを作る」だけのツールではない。あなたのコードが、AWSの複雑なセキュリティレイヤーをどう攻略し、自動化という名の芸術をどう構築するか。それこそがSREの醍醐味だ。
今日から、Stateファイルの中身を覗く癖をやめ、パイプラインのログにシークレットが流れていないかを確認する習慣をつけろ。それが、伝説的なインフラエンジニアへの第一歩だ。
「コードがすべてを物語る。そのコードが汚れていれば、運用も汚れる。」
さあ、エディタを開け。君の書くコードで、世界をよりセキュアにアップデートしてくれ。