スタイルガイド — terraform fmt と命名・構造のベストプラクティス

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. 関連記事


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