「Terraform モジュールの記事が多すぎて、何から読めばいいかわからない」 — NicheeLab には Terraform モジュール関連の専門記事が複数あります。 本記事は、それらを体系的にナビゲートするハブ記事。「モジュールとは何か」から「組織横断で共有モジュールを運用する」までの全フェーズを一望できます。
Terraform モジュールは、再利用可能なインフラ構成を 1 つのコンポーネントとしてカプセル化する仕組みです。 複数の resource ブロック、変数 (variable)、出力 (output) を 1 つのディレクトリにまとめ、他の Terraform コードから呼び出して使います。
モジュール化の最大の価値は、「変更の影響範囲を 1 箇所に閉じ込められる」こと。 例えば、VPC の構成を変えたいときに、3 環境 (dev / staging / prod) の Terraform コードを 3 箇所修正するのではなく、モジュール 1 箇所を変更してバージョンを上げる、という運用が可能になります。
Terraform モジュールを体系的にマスターするには、以下の順番で関連記事を読むのが最も効率的です。
このリストは、Terraform Associate (003) と Authoring & Operations Professional の両試験のモジュール関連ドメインを完全カバーしています。
Terraform 認定試験におけるモジュール関連の出題比重は以下のとおり。
Associate 試験では、特に source と version 引数の組み合わせが出題頻度が最も高いトピック。 Professional 試験では、モジュールの公開戦略 (Private Registry / Git Tag / Semantic Versioning) と互換性管理が頻出です。
count = var.env == "prod" ? 3 : 1 のように、モジュール内に環境別の if/else を書くと、テストが困難で再利用性が下がります。 環境別の差異は入力変数で吸収し、モジュール自体は環境非依存にするのが原則。
全リソースの ID を出力するのは過剰、必要なものだけに絞る。一方、利用側が必要とする出力が抜けていると、利用側でモジュール内の構造を直接参照することになり、カプセル化が崩れます。
source = "..." だけで version 引数を書かないと、最新バージョンが pull され、後方互換破壊で本番が動かなくなる事故が起きます。 必ず version = "~> 1.2" のように範囲指定 or 固定。
モジュールの使い方が伝わらないと、利用側が「ソースコード読む or 諦める」の二択になります。 必ず README.md + examples/ ディレクトリで使い方を示す。Terraform Registry に公開する場合は必須。
「VPC + EKS + RDS + ALB + Route53 を全部入れる」モジュールは、変更時の影響範囲が広すぎて運用負荷が高い。 単一責務原則に従い、小さなモジュールを組み合わせる方が長期的に保守しやすいです。
例: VPC を作成する、RDS を作成する、S3 バケットを作成する。1 つの責務に絞ったモジュールで、再利用性が最も高い。 多くの組織でこのパターンが基本となります。
例: 「VPC + Subnet + NAT GW + Route Table」のように、関連リソースをまとめる中規模モジュール。 単機能モジュールを内部で呼び出す場合と、すべてフラットに展開する場合がある。
例: 「ネットワーク層」「データ層」「アプリ層」のように、システム全体を層で分けるモジュール。 大規模システムで採用されるパターンで、State 分離戦略とも密接に関連します。
Terraform モジュールとは何ですか?
Terraform モジュールは、再利用可能なインフラ構成を 1 つのコンポーネントとしてカプセル化する仕組みです。複数のリソース定義をまとめ、入力 (variables)・出力 (outputs) を持つ単位として扱うことで、コードの再利用性・保守性・テスト容易性が大幅に向上します。
Terraform モジュールはいつ使うべき?
同じ構成パターンを 2 回以上書く場面では必ずモジュール化すべきです。例: VPC + Subnet + NAT GW を 3 環境 (dev / staging / prod) に展開する、複数プロジェクトで共通のロギング基盤を構築する、組織全体で標準化したい監視構成を配布する。一度モジュール化すれば、コードの一貫性とアップデートの一元化が可能になります。
モジュールの source には何が使えますか?
Terraform Registry / Git (github / gitlab / bitbucket) / Local path / S3 / GCS / HTTP の 6 種類が主な選択肢。組織内利用なら Git + Tag (Semantic Versioning) が王道。社外公開なら Terraform Registry にアップロードして利用者が容易に発見できるようにします。詳細は [Module Sources の使い分け](/articles/terraform/module-sources) を参照。
モジュールのバージョニングはどうやる?
Git Tag + Semantic Versioning (v1.0.0 形式) が最も一般的。Terraform Registry にも対応している唯一の標準形式です。version 引数で specific version (= 1.2.3)、range (~> 1.2)、minimum (>= 1.0) を指定可能。詳細は [Module Versioning 実践](/articles/terraform/module-versioning) を参照。
Associate / Pro 試験ではモジュールはどのくらい出題されますか?
HashiCorp Terraform Associate (003) では「Use Terraform modules」が独立ドメインで全体の 15% を占めます。Authoring & Operations Professional ではさらに比重が増し、モジュール設計の判断問題が多数。実務でもモジュール抜きで Terraform を運用するのは現実的でないため、必修トピックです。
モジュールを書く時のベストプラクティスは?
(1) 単一責務原則 — 1 モジュール 1 目的 (2) 必須入力を最小化 — 多くを optional + デフォルト値 (3) outputs を厳選 — 利用側が必要なものだけ (4) tags / labels を標準化 — 環境名 / cost-center 等 (5) README + examples/ を必ず提供 (6) Semantic Versioning で配布。詳細は [モジュール設計ベストプラクティス](/articles/terraform/module-best-practices) を参照。
NicheeLab HashiCorp編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Terraform HCL 構文の基礎:Block / Attribute / Expression を正しく使い分ける
Terraform Associate で頻出の HCL 構文を、ブロック・属性・式の3視点で整理。実務で迷いがちな書き...
Terraform Authoring & Ops Pro: 上位資格の範囲と対策
上位レベルを想定したTerraformの設計・運用ドメインを整理し、実務で通用する対策を提示。モジュール設計、ステート運...
Terraform Providers の基本: プラグイン型アーキテクチャを正しく使いこなす
Associate レベルで押さえるべき Provider の基礎、インストール、バージョニング、認証、エイリアス運用を...
Terraform Resourceブロック徹底ガイド: 最小単位のリソース定義
Associateレベルで押さえるべきResourceブロックの構造、依存関係、メタ引数、ライフサイクル制御を実務目線で...
Terraform Data Source徹底理解:既存リソースの参照で壊さず足す
Terraform Associate向けに、Data Sourceを用いた既存リソース参照の基本、選択基準、評価順序、...