- リソース群(モジュール)ごとにディレクトリを分割する。
- ファイルは
main.tf,variables.tf,outputs.tf,provider.tfなどに分割する。- リソースが多い場合、
main.tfをさらに分割する(例:vpc.tf,ec2.tf)。 - 参考: File names
- リソースが多い場合、
- Terraformリソース名、変数名、出力名は一貫性を持たせ、スネークケース(例:
vpc_id)を使用する。 - ファイル名・ディレクトリ名もスネークケースで統一する。
- AWSリソース名などは、環境名や用途を含めて命名する(例:
dev-app-vpc)。 - tfstateの名前はモジュール名(ディレクトリ名)と同じにする(例:
network.tfstate)。
- 変数には型・説明・デフォルト値を必ず設定する。
- センシティブな値(パスワード等)は
sensitive = trueを設定し、環境変数や外部シークレット管理サービスを利用する。 - 出力値(outputs)は必要最小限とし、用途を明記する。
- インデントはスペース2つで統一する。
- 公式の
terraform fmtで自動整形する。 - Terraformリソース内は以下の順番で記述する。
- ループのメタ引数(例:
for_each,count) - 非ブロックパラメーター
- ブロックパラメーター
tagsブロックlifecycleブロックdepends_onブロック
- ループのメタ引数(例:
- ブロック間は空行を入れ、可読性を高める。
- 非ブロックパラメーターは、空行を入れずに続けて記述する。
- ハードコーディングを避け、機密情報は外部で管理する。
- 不要なポート開放や権限付与を避ける。
terraform planで差分を必ず確認し、意図しない変更がないかレビューする。
terraform.lock.hclを必ずコミットし、プロバイダーのバージョンを固定する。stateファイルはリモートバックエンド(S3等)で管理し、ローカルには置かない。- stateのキー名はモジュール名と同じにする(例:
network.tfstate)。
- stateのキー名はモジュール名と同じにする(例:
- Terraform本体のバージョン(
terraformブロックのrequired_version)および各プロバイダーのバージョン(required_providers)を必ず明示的に指定する。これらは通常、provider.tfやversions.tfなどのファイルに記述する。 .gitignoreに.terraformや*.tfstateを追加し、不要なディレクトリ・ファイルをGitで管理しないようにする。
- YAML形式で記述する(JSON不可)
- インデントは スペース2つ
- 拡張子は
.yamlを使用する(.ymlではなく)
- リソース種別ごとにファイルを分ける(例:
deployment.yaml,service.yaml) - 単一ファイル内に複数リソースを定義する場合は
---区切りを使用 - 名前空間ごとにディレクトリを分けてもよい(例:
namespaces/prod/deployment.yaml)
- リソース名はすべて 小文字・ハイフン区切り
- 例:
web-backend-deployment
- 例:
- 設定の意図や注意点が伝わるよう、重要な項目にはコメントを記載する
#を使い、該当行の直前か右端に記載する
例:
# アプリケーションのHTTPポートを指定
ports:
- containerPort: 8080 # 外部からのアクセス用