1. 概要
- Terraform公式スタイルガイドとは
- インデント・空白のルール
- ブロックの順序とグルーピング
- 命名規則
terraform fmtによる自動整形
Terraform公式スタイルガイドに従うことで、チームのコードが一貫し、レビューしやすくなります。terraform fmtコマンドで大部分は自動整形できます。
2. インデント・空白のルール
terraform {
required_version = ">= 1.9"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = "ap-northeast-1"
}
- インデントはスペース2個(タブは使わない)
=の前後は整列する(terraform fmtが自動整形)- 関連する属性はグループ化し、グループ間に1行の空行を入れる
3. リソースブロックの書き方
variable "environment" {
description = "環境名"
type = string
default = "dev"
}
data "aws_ami" "amazon_linux_2023" {
most_recent = true
owners = ["amazon"]
filter {
name = "name"
values = ["al2023-ami-*-x86_64"]
}
}
resource "aws_instance" "web" {
# 1. count / for_each を最初に書く
# count = 1
# 2. AMI・インスタンスタイプなど主要な属性
ami = data.aws_ami.amazon_linux_2023.id
instance_type = "t3.micro"
# 3. 他リソースへの参照
# vpc_security_group_ids = [aws_security_group.web.id]
# subnet_id = aws_subnet.private.id
# 4. ネストブロック
root_block_device {
volume_size = 20
volume_type = "gp3"
encrypted = true
}
# 5. lifecycle ブロック(必要な場合)
lifecycle {
create_before_destroy = true
}
# 6. tags は最後
tags = {
Name = "${var.environment}-web"
Environment = var.environment
ManagedBy = "terraform"
}
}
4. ファイルの構成順序
公式の推奨順序:
1. terraform ブロック
2. provider ブロック
3. data ブロック(リソースが参照するもの)
4. resource ブロック
5. output ブロック
一般的なファイル分割:
project/
├── main.tf # resource / module
├── variables.tf # variable
├── outputs.tf # output
├── locals.tf # locals(規模が大きい場合)
├── data.tf # data(量が多い場合)
└── versions.tf # terraform / provider ブロック
5. 命名規則
HCLではスネークケース(小文字 + アンダースコア)を使います。キャメルケースやハイフンは使いません。
# ✅ スネークケース
resource "aws_instance" "web_server" { }
variable "instance_type" { }
詳細な命名規則(リソース名・変数名・モジュール名・ファイル名の全パターン)は専用記事を参照してください。
→ Terraform命名規則 — リソース名・変数名の統一 で体系的に解説しています。
6. terraform fmt の使い方
# カレントディレクトリの.tfファイルを自動整形
terraform fmt
# サブディレクトリも含めて整形
terraform fmt -recursive
# 整形が必要なファイルを確認(変更はしない)
terraform fmt -check
# 変更内容を差分で確認
terraform fmt -diff
CI/CDでterraform fmt -checkを実行し、整形されていないコードのマージを防ぐことを推奨します。
7. コメントの書き方
# 単行コメント(シャープ)
// 単行コメント(スラッシュ2つ): 使えるが非推奨
/*
複数行コメント
ブロックコメントはこの形式
*/
resource "aws_instance" "web" {
ami = data.aws_ami.amazon_linux_2023.id
instance_type = "t3.micro"
# なぜこの設定にするかを説明するコメントを書く
# t3.microは開発環境のコスト最適化のため
root_block_device {
volume_size = 20
volume_type = "gp3"
encrypted = true # セキュリティポリシー上必須
}
tags = {
Name = "${var.environment}-web"
Environment = var.environment
ManagedBy = "terraform"
}
}
8. 関連記事
- Terraform命名規則のベストプラクティス — 命名規則の詳細ガイド
- JSON設定ファイル(.tf.json) — JSON形式での設定
- CI/CDパイプラインとTerraform — terraform fmt -check のCI組み込み
- Terraform命名規則 — リソース名・変数名の統一
- terraform fmt / validate — コード整形と構文チェック
- Terraformのディレクトリ構成 ベストプラクティス
9. まとめ
- インデントはスペース2個、
=はterraform fmtで自動整列 - リソースブロック内の順序: count/for_each → 主要属性 → 参照 → ネストブロック → lifecycle → tags
- 命名はすべてスネークケース(小文字 + アンダースコア)
- ファイル分割: main.tf / variables.tf / outputs.tf / versions.tf
terraform fmt -recursiveで一括整形、-checkでCIに組み込む
動作確認バージョン: Terraform >= 1.9 公式ドキュメント: https://developer.hashicorp.com/terraform/language/syntax/style