【保存版】Terraform Docsの完全ガイド:自動ドキュメント作成で工数を50%削減する7つの方法

Terraform Docs とは?自動作成ドキュメントの検討的なツール

Terraform Docsは、Terraformコードから自動的にドキュメントを生成するためのツールです。Infrastructure as Code(IaC)の実践において、ドキュメント作成は重要でありながら、多くのチームにとって負担となっている作業です。

インフラドキュメント作成の課題を解決するTerraform Docs

従来のインフラドキュメント作成には、以下のような課題が存在していました:

  1. 手動更新による工数の増大
  • コード変更のたびにドキュメントを更新する必要性
  • 更新忘れによる不整合の発生
  1. フォーマットの統一性維持
  • チームメンバー間でのドキュメント形式の揺れ
  • レビュー時の効率低下
  1. バージョン管理との連携
  • コードとドキュメントの同期維持の難しさ
  • 変更履歴の追跡における手間

Terraform Docsは、これらの課題に対して自動化されたソリューションを提供します。

Terraform Docsが選ばれる3つの理由

  1. 完全な自動化による工数削減
  • Terraformコードから自動的にドキュメントを生成
  • 変更の都度、即座に反映が可能
  • 平均50%以上の工数削減を実現
  1. 一貫性のある文書構造
  • 標準化されたフォーマットの適用
  • モジュール間の統一された説明スタイル
  • チーム全体での可読性向上
  1. 柔軟なカスタマイズ性
  • 独自テンプレートの作成が可能
  • 多様な出力形式(Markdown, HTML等)
  • CIパイプラインとの容易な統合

実際の現場では、これらの特徴を活かして、インフラストラクチャの変更管理やチームコラボレーションの効率化に活用されています。次のセクションでは、具体的な導入手順と基本的な使い方について説明します。

Terraform Docsの基本的な使い方:10分で始める自動ドキュメント生成

Terraform Docsのインストール手順

Terraform Docsのインストールは複数の方法が用意されています。以下に主要な方法を示します:

  1. Homebrewを使用する方法(macOS)
# Homebrewを使用したインストール
brew install terraform-docs
  1. バイナリを直接ダウンロードする方法(Linux/Windows)
# Linuxの場合
curl -Lo terraform-docs.tar.gz https://github.com/terraform-docs/terraform-docs/releases/download/v0.16.0/terraform-docs-v0.16.0-$(uname)-amd64.tar.gz
tar -xzf terraform-docs.tar.gz
chmod +x terraform-docs
sudo mv terraform-docs /usr/local/bin/
  1. Docker経由での利用
docker pull quay.io/terraform-docs/terraform-docs:latest
docker run quay.io/terraform-docs/terraform-docs:latest version

基本的なコマンドと設定ファイルの書き方

Terraform Docsの基本的な使い方は非常にシンプルです。

  1. 基本的なドキュメント生成
# カレントディレクトリのTerraformファイルからドキュメントを生成
terraform-docs markdown .

# 特定のディレクトリを指定してドキュメント生成
terraform-docs markdown ./modules/vpc
  1. 設定ファイル(.terraform-docs.yml)の作成
# .terraform-docs.yml
formatter: "markdown"

version: ">= 0.14.0"

header-from: main.tf
footer-from: ""

sections:
  show:
    - requirements
    - providers
    - modules
    - inputs
    - outputs

output:
  file: "README.md"
  mode: inject
  template: |-
    <!-- BEGIN_TF_DOCS -->
    {{ .Content }}
    <!-- END_TF_DOCS -->
  1. 出力フォーマットの指定
# markdownテーブル形式で出力
terraform-docs markdown table .

# JSON形式で出力
terraform-docs json .

# YAML形式で出力
terraform-docs yaml .

初めてのドキュメント生成:サンプルコード付き解説

実際のプロジェクトでの使用例を見てみましょう。以下は典型的なTerraformモジュールの構成です:

# main.tf
variable "vpc_name" {
  description = "Name of the VPC"
  type        = string
}

variable "cidr_block" {
  description = "CIDR block for the VPC"
  type        = string
  default     = "10.0.0.0/16"
}

resource "aws_vpc" "main" {
  cidr_block = var.cidr_block

  tags = {
    Name = var.vpc_name
    Environment = var.environment
  }
}

output "vpc_id" {
  description = "The ID of the VPC"
  value       = aws_vpc.main.id
}

このコードに対してTerraform Docsを実行すると:

terraform-docs markdown table .

以下のような整形されたドキュメントが生成されます:

## Requirements

| Name | Version |
|------|---------|
| terraform | >= 0.13.0 |
| aws | >= 3.0.0 |

## Inputs

| Name | Description | Type | Default | Required |
|------|-------------|------|---------|:--------:|
| vpc_name | Name of the VPC | `string` | n/a | yes |
| cidr_block | CIDR block for the VPC | `string` | `"10.0.0.0/16"` | no |

## Outputs

| Name | Description |
|------|-------------|
| vpc_id | The ID of the VPC |

この基本的な使い方を習得することで、以降のより高度な活用方法へとステップアップすることができます。次のセクションでは、実践的な活用方法とテクニックについて詳しく解説します。

Terraform Docs の実践的な活用方法:現場で使える 7 つのテクニック

カスタムテンプレートを使用したドキュメントのブランド化

組織独自のドキュメントスタイルを適用するためのカスタムテンプレート活用方法をご紹介します。

  1. カスタムテンプレートの作成例
# custom-template.tmpl
---
{{ .Header }}

## インフラストラクチャ概要
{{ .Inputs }}

## プロバイダー要件
{{ .Requirements }}

## 構成要素
{{ .Modules }}

## 出力値
{{ .Outputs }}

---
最終更新日: {{ datetime "2006-01-02" }}
  1. テンプレート適用コマンド
terraform-docs markdown --config custom-template.tmpl .

モジュールドキュメントの自動生成と管理

大規模プロジェクトでのモジュール管理を効率化する方法です。

  1. モジュール構造の標準化
modules/
  ├── vpc/
  │   ├── main.tf
  │   ├── variables.tf
  │   ├── outputs.tf
  │   └── README.md
  ├── ecs/
  │   ├── main.tf
  │   ├── variables.tf
  │   ├── outputs.tf
  │   └── README.md
  └── rds/
      ├── main.tf
      ├── variables.tf
      ├── outputs.tf
      └── README.md
  1. 一括ドキュメント生成スクリプト
#!/bin/bash
for module in ./modules/*/; do
    echo "Generating docs for ${module}"
    terraform-docs markdown table "${module}" > "${module}README.md"
done

CIパイプラインへの組み込み方

GitHubActionsを使用した自動ドキュメント生成の例です。

# .github/workflows/terraform-docs.yml
name: Generate terraform docs
on:
  push:
    branches:
      - main
    paths:
      - '**.tf'

jobs:
  docs:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
      with:
        ref: ${{ github.event.pull_request.head.ref }}

    - name: Render terraform docs
      uses: terraform-docs/gh-actions@v1.0.0
      with:
        working-dir: .
        output-file: README.md
        output-method: inject
        config-file: .terraform-docs.yml

    - name: Commit changes
      uses: stefanzweifel/git-auto-commit-action@v4
      with:
        commit_message: "docs: Update terraform docs"
        file_pattern: README.md

実践的なテクニック4-7:

  1. 変数のグループ化と構造化
# variables.tf
# ネットワーク設定グループ
variable "network" {
  description = "ネットワーク関連の設定"
  type = object({
    vpc_cidr = string
    subnets  = map(string)
    enable_nat = bool
  })
}

# タグ設定グループ
variable "tags" {
  description = "リソース共通のタグ設定"
  type = map(string)
}
  1. 条件付きリソース生成のドキュメント化
# conditional.tf
variable "enable_monitoring" {
  description = "監視機能を有効にするかどうか"
  type        = bool
  default     = false
}

# このリソースは条件付きで作成されることをドキュメントに明記
resource "aws_cloudwatch_log_group" "monitoring" {
  count = var.enable_monitoring ? 1 : 0
  name  = "/aws/monitoring"
}
  1. セキュリティ設定の可視化
# security.tf
resource "aws_security_group" "example" {
  # セキュリティグループのルールを分かりやすく記述
  # terraform-docsが自動的にこれらのコメントを拾います
  ingress {
    description = "アプリケーション用ポート"
    from_port   = 8080
    to_port     = 8080
    protocol    = "tcp"
    cidr_blocks = ["10.0.0.0/16"]
  }
}
  1. 依存関係の明確化
# dependencies.tf
# モジュール間の依存関係を明示的に記述
module "vpc" {
  source = "./modules/vpc"
}

module "ecs" {
  source = "./modules/ecs"
  vpc_id = module.vpc.vpc_id  # 依存関係が明確
}

これらのテクニックを組み合わせることで、より管理しやすく、理解しやすいインフラストラクチャドキュメントを作成することができます。次のセクションでは、これらの実践的なテクニックを最大限活用するためのベストプラクティスについて解説します。

Terraform Docsのベストプラクティス:効率を最大化する実装方法

ドキュメント構造の設計パターン

効率的なドキュメント管理のための設計パターンを紹介します。

  1. モジュラー構造の採用
# 推奨されるディレクトリ構造
.
├── environments/
│   ├── dev/
│   │   └── main.tf
│   └── prod/
│       └── main.tf
├── modules/
│   ├── networking/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── variables.tf
│   │   └── outputs.tf
│   └── compute/
│       ├── README.md
│       ├── main.tf
│       ├── variables.tf
│       └── outputs.tf
└── .terraform-docs.yml
  1. 標準化されたドキュメントヘッダー
/**
 * # ネットワークモジュール
 * 
 * このモジュールは基本的なVPCとサブネットを構築します。
 * 
 * ## 特徴
 * - マルチAZ構成
 * - プライベート/パブリックサブネット
 * - NATゲートウェイ(オプション)
 */

locals {
  module_name = "networking"
}

バージョン管理との連携方法

  1. Git Hooksの活用
#!/bin/bash
# .git/hooks/pre-commit

# Terraform Docsの実行とバージョンチェック
if ! command -v terraform-docs &> /dev/null; then
    echo "terraform-docs がインストールされていません"
    exit 1
fi

# 変更されたTerraformファイルを含むディレクトリのドキュメントを更新
git diff --cached --name-only | grep '\.tf$' | while read file; do
    dir=$(dirname "$file")
    terraform-docs markdown table "$dir" > "$dir/README.md"
    git add "$dir/README.md"
done
  1. バージョンタグとの連動
# .terraform-docs.yml
version: ">= 0.16.0"

formatter: "markdown table"

content: |-
  # ${moduleTitle}

  Version: ${moduleVersion}

  ## 概要
  ${modulePurpose}

  ## 変更履歴
  ${changeLog}

sort:
  enabled: true
  by: required

output:
  file: "README.md"
  mode: inject

チーム開発における活用のコツ

  1. レビュープロセスの自動化
# .github/workflows/pr-check.yml
name: Pull Request Checks

on:
  pull_request:
    paths:
      - '**.tf'
      - '**.hcl'

jobs:
  docs-check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - name: Check Documentation
        run: |
          # ドキュメントの生成
          terraform-docs markdown . > docs_new.md

          # 既存のドキュメントと比較
          if ! diff docs_new.md README.md > /dev/null; then
            echo "ドキュメントが最新ではありません"
            echo "terraform-docs markdown . を実行してドキュメントを更新してください"
            exit 1
          fi
  1. ドキュメント品質チェックリスト
# ドキュメント品質チェックリスト

- [ ] 必須パラメータの説明が明確か
- [ ] 依存関係が明示されているか
- [ ] 使用例が含まれているか
- [ ] セキュリティ上の注意点が記載されているか
- [ ] コストに関する情報が含まれているか
  1. 効率的なナレッジ共有
  • モジュールカタログの作成
# catalog/main.tf
module "catalog" {
  source = "./modules/catalog"

  modules = {
    networking = {
      path        = "../modules/networking"
      description = "基本的なネットワーク構成を提供"
      owner       = "networkteam@example.com"
      usage       = "dev/networking/README.md"
    }
    compute = {
      path        = "../modules/compute"
      description = "EC2インスタンス管理用モジュール"
      owner       = "computeteam@example.com"
      usage       = "dev/compute/README.md"
    }
  }
}

これらのベストプラクティスを適用することで、チーム全体のドキュメント管理効率が大幅に向上し、長期的なメンテナンス性も確保できます。次のセクションでは、実際の運用で発生しがちな問題とその解決方法について説明します。

よくあるトラブルと解決方法:実務で遭遇する5つの課題

生成されたドキュメントの構造が崩れる問題の対処法

  1. UTF-8エンコーディングの問題
# 問題の例
terraform-docs markdown . > README.md
# 日本語が文字化けする

# 解決方法
export LANG=ja_JP.UTF-8
terraform-docs markdown . > README.md
  1. Markdownテーブルの整形崩れ
# .terraform-docs.yml
formatter: "markdown table"

settings:
  anchor: true
  color: true
  default: true
  escape: true
  indent: 2
  required: true
  sensitive: true
  type: true

カスタマイズ時のエラー対応

  1. テンプレート構文エラー
# エラーが発生するテンプレート
{{ .Inputs }}  # 正しい
{{ inputs }}   # 誤り:ドットが必要

# デバッグモードでの実行
terraform-docs markdown --debug .
  1. カスタムテンプレートのデバッグ
# template-debug.tmpl
{{- define "debug" -}}
Available variables:
{{- range $key, $value := . }}
{{ printf "- %s: %v" $key $value }}
{{- end }}
{{- end -}}

{{ template "debug" . }}

大規模プロジェクトでのパフォーマンス最適化

  1. パフォーマンス改善策
# 並列処理による高速化
find . -type f -name "*.tf" -exec dirname {} \; | sort -u | xargs -P 4 -I {} terraform-docs markdown {}

# キャッシュの活用
terraform-docs markdown . --cache-dir=/tmp/tf-docs-cache
  1. メモリ使用量の最適化
# .terraform-docs.yml
settings:
  read-comments: true  # コメント読み込みを制限
  treat-as-code: []    # コード扱いする拡張子を制限

よくある問題とその対処法:

  1. バージョン非互換の問題
# バージョンチェックスクリプト
#!/bin/bash
required_version="0.16.0"
current_version=$(terraform-docs --version | cut -d' ' -f3)

if [[ $(echo -e "$required_version\n$current_version" | sort -V | head -n1) != "$required_version" ]]; then
    echo "terraform-docs のバージョンが古いです($current_version)"
    echo "バージョン $required_version 以上が必要です"
    exit 1
fi
  1. 出力ファイルのパーミッション問題
# パーミッション修正スクリプト
find . -name "README.md" -type f -exec chmod 644 {} \;
  1. CIパイプラインでの自動化の失敗
# トラブルシューティング用のGitHub Actions設定
name: Terraform Docs Debug

on:
  workflow_dispatch:
  pull_request:
    paths:
      - '**.tf'

jobs:
  debug:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - name: Setup Debug Environment
        run: |
          echo "terraform-docs version:"
          terraform-docs --version

          echo "システム情報:"
          uname -a

          echo "ファイル構造:"
          tree .

          echo "設定ファイル確認:"
          cat .terraform-docs.yml || echo "設定ファイルなし"

これらの問題に対する対処法を知っておくことで、Terraform Docsの運用をより安定させることができます。また、チーム内で知見を共有し、ドキュメント生成プロセスを継続的に改善していくことが重要です。