公共のTerraform Registryを使わず、組織内だけでモジュールを安全に配布したい。そんな要件に対して最も安定した解は、Terraform Cloud/EnterpriseのPrivate Module Registry(PMR)です。
本稿ではPMRの全体像、命名とSemVer運用、発行と消費のフロー、権限・可視性、テスト戦略、移行・トラブルの勘所をまとめます。Terraformの出題傾向(レジストリ参照 vs Git参照、version制約の扱い)も要点化しています。
Private Module Registryは、VCSリポジトリのタグをセマンティックバージョンとして取り込み、組織内ユーザーに名前解決と配布を提供します。Terraform CLIはレジストリから解決されるソースアドレスを優先的に扱い、version引数での制約も解釈できます。
Gitの生URL参照(git::)でも配布は可能ですが、検索性・バージョン選択・アクセス制御・監査の観点でPMRが有利です。自社ホストのRegistry API実装は高度ですが、まずはTerraform Cloud/Enterpriseを使うのが現実的です。
| 選択肢 | 主な利点 | 注意点/制約 | 参照記法 |
|---|---|---|---|
| Terraform Cloud/Enterprise Private Module Registry | 組織内配布・検索・可視化・version解決・監査ログ | VCS連携と命名/タグ規約が前提。発行はタグ駆動 | app.terraform.io/<org>/<name>/<provider> |
| Gitソース参照(git::https...) | シンプル・どのGitでも可・レジストリなしで利用可 | version引数は使えない。ref=で固定する。発見性が低い | git::https://.../repo.git?ref=v1.2.3 |
| 自前Registry API実装(社内ホスト) | 社内ネットワーク完結・統合制御 | プロトコル実装/保守コスト高。まずはTFE/TFC推奨 | <host>/<org>/<name>/<provider> |
PMRベースの配布フロー(概念図)
レジストリ参照の最小例(version制約つき)
module "vpc" {
source = "app.terraform.io/acme/vpc/aws"
version = "~> 1.2"
name = "core"
cidr = "10.0.0.0/16"
}
terraform {
required_version = ">= 1.4"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}PMRは、リポジトリ命名とタグを手がかりにモジュールを認識します。命名は terraform-<provider>-<name>(例: terraform-aws-vpc)が基本です。タグはセマンティックバージョンと整合している必要があります。
タグの表記は v1.2.3 を推奨します(環境によって 1.2.3 も受理されますが、組織内で統一してください)。破壊的変更はメジャー、後方互換の拡張はマイナー、バグ修正はパッチで表現します。
タグとCHANGELOGの例(規約サンプル)
リポジトリ名: terraform-aws-vpc
タグ: v1.2.0
CHANGELOG.md 抜粋:
- feat: Add flow logs support (#123)
- fix: Correct IGW dependency (#125)
- docs: Update examples for multi-AZ (#126)
次の破壊的変更を予定:
- v2.0.0 で variable "enable_classiclink" を削除(EOLに伴う)発行側は、VCSにタグを打つだけです。Terraform Cloud/EnterpriseのPMRがタグを検出し、新しいバージョンとして登録します。消費側はレジストリ形式のsourceを指定し、version制約を与えます。
CLIは app.terraform.io への認証が必要です。terraform login でクレデンシャルを作成(~/.terraform.d/credentials.tfrc.json)し、init時に自動で取得します。
Git参照とレジストリ参照の対比(正/誤)
# 正: レジストリ参照は version が使える
module "vpc" {
source = "app.terraform.io/acme/vpc/aws"
version = ">= 1.2, < 2.0"
}
# 正: Git参照は ref= で固定(version は書かない)
module "vpc_git" {
source = "git::https://git.example.com/terraform-aws-vpc.git?ref=v1.2.3"
}
# 誤: Git参照に version を併記(エラーになる)
module "vpc_bad" {
source = "git::https://git.example.com/terraform-aws-vpc.git?ref=v1.2.3"
version = "~> 1.2" # ← サポートされない
}PMRの利用可否は組織メンバーシップとチーム権限設計に依存します。発行(Publish)やモジュール管理(Admin)は限定し、消費(Read/Use)は広めに付与するのが基本です。実運用では「発行はモジュールメンテナーチームのみ」「消費は全開発者」といった分担が多いです。
監査については、誰がどのバージョンをいつ参照したかはTerraform Cloud/Enterpriseの実行ログ、VCSのタグ履歴、レビュー履歴を突き合わせるのが定石です。取り下げは原則禁止として、新しいパッチ版での修正提供を徹底します。
モジュールは examples/ で最小構成と代表ユースケースを実行可能にし、CIで terraform fmt -check, validate, tflint, 可能ならTerratest/Kitchen-Terraformを走らせます。PR時にexamplesがplan/applyできることを確認できるのが理想です。
互換性は versions.tf で required_version と required_providers を明示し、出力・入力スキーマの変更は段階的に。0→1の破壊的変更は避け、メジャーでのみ行います。
versions.tf(互換性を明示)
terraform {
required_version = ">= 1.4, < 2.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.31"
}
}
}
# モジュールREADMEには以下を明示:
# - 対応Terraform/Providerバージョン
# - 入出力の互換性ポリシー
# - 破壊的変更の予告と移行手順Git参照からPMR参照への移行は、まず既存タグをSemVerに整え、PMRで認識させてから module.source を置換します。既存ワークスペースでは terraform init -upgrade を実行して解決情報を更新します。
典型的なエラーは、命名規約不一致(terraform-<provider>-<name>でない)、タグ未作成、versionとgit::の併用、認証漏れ(credentials.tfrc.json未設定)です。
移行の置換例(Git → PMR)
# 変更前(Git参照)
module "vpc" {
source = "git::https://git.example.com/terraform-aws-vpc.git?ref=v1.2.0"
}
# 変更後(PMR参照)
module "vpc" {
source = "app.terraform.io/acme/vpc/aws"
version = "~> 1.2"
}Pro
問題 1
Gitのリポジトリを直接参照するモジュールで、module ブロックに version = "~> 1.2" を併記した場合のTerraformの挙動として正しいものはどれか。
正解: A
module の version 引数はレジストリ(例: app.terraform.io/org/name/provider)参照にのみ有効です。git:: 参照に併記すると不正な引数としてエラーになります。Git参照での固定は ref= パラメータを使います。
既存のGit参照からPrivate Module Registryへ安全に移行するには?
まず既存リポジトリのタグをSemVerに整備(v1.2.3など)し、PMRが認識することを確認。次に消費プロジェクトで source を app.terraform.io/<org>/<name>/<provider> に変更し、version に保守的な制約(~> 1.2)を設定。terraform login の上、terraform init -upgrade で取得情報を更新します。段階的移行では一部ワークスペースのみ先行置換し、影響を観察します。
誤ったバージョンを公開してしまった。削除すべき?
原則、削除は避けます。利用側の再現性と監査のため、修正版パッチ(例: v1.2.1)を速やかに出し、CHANGELOGとREADMEで問題と対処を明記します。緊急時の非公開化可否は運用ポリシーと組織のTerraform Cloud/Enterprise設定に依存するため、事前に合意しておきましょう。
プリリリース(-rc, -beta)タグは選択される?
PMRはSemVer互換のタグをインデックスします。Terraformのバージョン解決はSemVer順序に従い、制約に合致すればプリリリースも候補になります。ただし安定版が存在すれば通常は安定版の方が高いと評価されます。組織ポリシーとして本番では安定版のみを使用するルールを推奨します。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。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を用いた既存リソース参照の基本、選択基準、評価順序、...