Terraform ポリシー
安全性と保守性を最優先し、一貫した規約に従うインフラコードを書く。
原則
| 原則 |
基準 |
| Security by Default |
セキュリティはデフォルトで厳格。緩和は明示的かつ理由付き |
| Fail Fast |
必須値にデフォルトを入れない。不足は即エラー |
| 命名一貫性 |
name_prefix パターンで全リソースを統一命名 |
| 最小権限 |
IAM は必要最小限のアクション・リソースに絞る |
| コスト意識 |
トレードオフはコメントで文書化 |
| DRY |
locals で共通値を計算。重複排除 |
| 1ファイル1関心事 |
リソースカテゴリごとにファイル分割 |
変数宣言
| 基準 |
判定 |
type なし |
REJECT |
description なし |
REJECT |
機密値に sensitive = true なし |
REJECT |
| 環境依存値にデフォルト設定 |
REJECT |
| 定数的な値(ポート番号等)にデフォルト設定 |
OK |
# REJECT - type/description なし
variable "region" {}
# REJECT - 機密値に sensitive なし
variable "db_password" {
type = string
}
# OK - 定数的な値にデフォルト
variable "container_port" {
type = number
description = "Container port for the application"
default = 8080
}
セキュリティ
| 基準 |
判定 |
EC2 で IMDSv2 未強制(http_tokens != "required") |
REJECT |
| EBS/RDS 暗号化なし |
REJECT |
| S3 パブリックアクセスブロックなし |
REJECT |
セキュリティグループで 0.0.0.0/0 への不要な開放 |
REJECT |
IAM ポリシーに * リソース(正当な理由なし) |
REJECT |
| SSH 直接アクセス(SSM 代替可能な場合) |
REJECT |
| 機密情報のハードコーディング |
REJECT |
lifecycle { prevent_destroy = true } が重要データに未設定 |
警告 |
命名規約
| 基準 |
判定 |
name_prefix パターン未使用 |
REJECT |
| リソース名に環境名が含まれない |
REJECT |
| タグ名が PascalCase でない |
警告 |
| AWS 文字数制限を超える名前 |
REJECT |
ファイル構成
| 基準 |
判定 |
main.tf にリソース定義が混在 |
REJECT |
variables.tf にリソースが定義されている |
REJECT |
| 1ファイルに複数カテゴリのリソースが混在 |
警告 |
| 未使用の variable / output / data source |
REJECT |
タグ管理
| 基準 |
判定 |
provider default_tags 未設定 |
REJECT |
default_tags と個別リソースでタグが重複 |
警告 |
ManagedBy = "Terraform" タグなし |
警告 |
コスト管理
| 基準 |
判定 |
| コスト影響のある選択にコメントなし |
警告 |
| 高コストリソース(NAT Gateway 等)に代替案の検討なし |
警告 |