Terraform Registryの公開モジュールは実装速度を大幅に短縮できる一方、外部コードを本番インフラに組み込む以上、選定を誤ると取り返しのつかない事態を招きます。
この記事では、Terraform Registryの仕組みからterraform-aws-modulesの選定基準、バージョン固定の正しい書き方、公開モジュールのカスタマイズ戦略、そして導入後のトラブル対処まで、本番採用の判断に必要な情報を体系的に解説します。
この記事のポイント
・terraform registry モジュールはsource + versionでバージョンを固定して使う
・terraform-aws-modulesはAWS公式支援・Star数1万超の実績ある公開モジュール群
・メンテ活性度・Issue対応速度・バージョン更新頻度の3点で本番採用を判断する
・variablesで吸収できないカスタマイズが出た時点で自作モジュールへの移行を検討する
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
Terraform Registryとは何か/公開モジュールの仕組み
Terraform Registry(registry.terraform.io)は、HashiCorp社が運営するモジュール・プロバイダーの公式配布プラットフォームです。GitHubと連携しており、誰でもモジュールを公開でき、誰でも無料で利用できます。Terraform Registryに掲載されるモジュールには4つの信頼レベルがあります。
・Official:HashiCorp社が直接開発・管理するモジュール。最高信頼度
・Partner:HashiCorp認定パートナー(AWS・GCP・Azure等の公式チーム)が開発
・Verified:HashiCorpがコードレビューを通過させた個人・組織のモジュール
・Community:上記以外の一般公開モジュール。信頼度はリポジトリの状態で個別評価が必要
重要なのは「Registryに掲載されている=安全」ではない点です。Communityモジュールはレビューなしで公開できるため、最終更新が数年前でメンテナンスが止まっているものも多数存在します。本番採用の判断基準が必要になるのはこのためです。
モジュールの参照方法は以下の形式です。
# Terraform Registryのモジュールを参照する書き方 # <NAMESPACE>/<MODULE>/<PROVIDER> の形式 module "vpc" { source = "terraform-aws-modules/vpc/aws" version = "~> 5.0" # ... }
terraform-aws-modulesとは/代表的なモジュール一覧
terraform-aws-modules(github.com/terraform-aws-modules)は、Anton Babenko氏が中心となって開発・維持しているAWS向け公開モジュール群です。HashiCorp社がPartnerとして認定しており、AWSの公式ドキュメントでも参照されています。代表的なモジュールを整理します。
・terraform-aws-modules/vpc/aws:VPC・サブネット・ルートテーブル・NATゲートウェイを一括構築。Star数6,000超
・terraform-aws-modules/eks/aws:Amazon EKSクラスターと関連リソースを構築。Star数4,000超
・terraform-aws-modules/rds/aws:RDS(MySQL・PostgreSQL・Aurora)のインスタンスと関連設定
・terraform-aws-modules/ec2-instance/aws:EC2インスタンスの作成とIAMロール紐付け
・terraform-aws-modules/s3-bucket/aws:S3バケットとバケットポリシー・ライフサイクル設定
・terraform-aws-modules/iam/aws:IAMロール・ポリシー・グループの設計を効率化
特にvpcモジュールは「AWSでTerraformを使う現場」のほぼすべてで採用候補になります。AWSが推奨するベストプラクティスのネットワーク設計がそのまま実装されており、自前で書くよりも品質が高いケースが多いです。
公開モジュールを本番採用する前の判断基準
terraform-aws-modulesであっても、採用前には必ず以下の5点を確認する習慣をつけてください。1. GitHubのStarとFork数を確認する
Star数は「何人のエンジニアが使っているか」の間接指標です。terraform-aws-modules/vpcはStar数6,000超・Fork数1,000超であり、「世界中の本番環境で動いている実績」と読み替えられます。逆にStar数が100以下・Fork数が一桁のモジュールは利用実績が乏しいため、本番採用には慎重になるべきです。
2. 最終コミット日時とIssue対応状況を確認する
Terraformはプロバイダーのバージョンアップに伴いAPIの変更が頻繁に発生します。最後のコミットが1年以上前のモジュールは、現行のAWS Providerとの互換性が崩れているリスクがあります。またIssueの「対応速度」も重要な指標です。Openなバグ報告が溜まっており、コメントに誰も反応していない状態のモジュールは、メンテナンスが実質停止していると判断します。
3. CHANGELOGの存在を確認する
CHANGELOGファイルが存在するモジュールは「breaking changeを明示する文化がある」証拠です。バージョンアップ時に何が変わるかを把握できるため、本番採用後のメンテナンスコストが大幅に下がります。terraform-aws-modulesシリーズは全モジュールにCHANGELOGが存在し、breaking changeはメジャーバージョンアップ(例: v4.x → v5.x)でのみ入る設計方針が明示されています。
4. ライセンスと利用条件を確認する
terraform-aws-modulesはApache 2.0ライセンスのため商用利用も問題ありません。ただし組織のポリシーによってはGPLライセンスのモジュールを使えない場合があります。Registryのライセンス表示を必ず確認してください。5. 直接GitHubのソースコードを読む
「信頼できそうだから使う」で終わらず、必ずソースコードを一読してください。variables.tf・main.tf・outputs.tf の3ファイルを読めば、モジュールが何を作り何を出力するかの全容がわかります。ブラックボックスのまま本番に入れるのは最も避けるべき状態です。>> Terraform実践セミナーの詳細はこちら
バージョン固定(sourceとversionの書き方)とロックファイル管理
本番でterraform registry モジュールを使う上で最重要なのが「バージョン固定」です。固定しない場合、terraform initのたびに最新バージョンが取得され、知らない間にbreaking changeが混入します。1. versionブロックの正しい書き方
# 推奨: パッチバージョンの自動更新を許容しメジャー/マイナーは固定 module "vpc" { source = "terraform-aws-modules/vpc/aws" version = "~> 5.1" # 5.1.x のパッチのみ自動更新, 5.2 以上は取得しない name = "production-vpc" cidr = "10.0.0.0/16" azs = ["ap-northeast-1a", "ap-northeast-1c"] private_subnets = ["10.0.1.0/24", "10.0.2.0/24"] public_subnets = ["10.0.101.0/24", "10.0.102.0/24"] enable_nat_gateway = true single_nat_gateway = false }
・
~> 5.1 → 5.1.0 以上 5.2.0 未満・
~> 5.0 → 5.0.0 以上 6.0.0 未満・
= 5.1.2 → 5.1.2 のみ(完全固定。依存関係解決が難しくなるので通常は使わない)本番環境では `~> MAJOR.MINOR` 形式(マイナーまで固定)を基本としてください。
2. .terraform.lock.hcl をGitにコミットする
`terraform init` を実行すると `.terraform.lock.hcl` が生成されます。このファイルにはモジュールとプロバイダーの正確なバージョンとハッシュが記録されます。# .terraform.lock.hcl の例(自動生成されるため手動編集は不要) provider "registry.terraform.io/hashicorp/aws" { version = "5.53.0" constraints = "~> 5.0" hashes = [ "h1:abc123...", "zh:def456...", ] }
逆に `.terraform/` ディレクトリは `.gitignore` に追加してコミットしないでください。このディレクトリにはダウンロードされたバイナリが含まれており、環境依存の問題を引き起こします。
# .gitignore に追加する設定 .terraform/ *.tfstate *.tfstate.backup
公開モジュールのカスタマイズ戦略
公開モジュールはvariablesで多数のカスタマイズポイントが用意されています。ただし「variablesで吸収できる範囲」を超えたカスタマイズが必要な場合は、自作モジュールへの移行を検討します。1. variablesで吸収できる範囲
terraform-aws-modules/vpcモジュールを例にすると、以下の設定はすべてvariablesで対応できます。・VPCのCIDRブロック(
cidr)・サブネットのCIDR(
private_subnets・public_subnets)・NATゲートウェイの構成(
enable_nat_gateway・single_nat_gateway)・VPCフローログの有効化(
enable_flow_log)・タグの一括付与(
tags)実際、多くのケースではvariablesの組み合わせだけで要件を満たせます。まずは公式ドキュメント(Registry上のInputs一覧)を通読し、自分の要件がカバーされているかを確認してください。
2. wrapperモジュールで薄くラップする
複数の環境(dev・stg・prod)で同じモジュールを使う場合、wrapperモジュールを作ると管理が楽になります。# modules/networking/main.tf(wrapperモジュールの例) # 公開モジュールを呼び出しつつ、プロジェクト固有のデフォルト値を設定する module "vpc" { source = "terraform-aws-modules/vpc/aws" version = "~> 5.1" name = var.vpc_name cidr = var.cidr # プロジェクト共通のタグを強制付与 tags = merge(var.tags, { ManagedBy = "terraform" Environment = var.environment Project = "myproject" }) }
3. 自作モジュールへの切り替えタイミング
以下のいずれかに該当したら、自作モジュールへの移行を真剣に検討してください。・公開モジュールのリソースに対して `lifecycle { ignore_changes }` を大量に追加している
・公開モジュールの内部リソースを `terraform state mv` で切り離す必要が生じた
・モジュールのソースを直接forkして修正しなければ要件を満たせない
・upstreamの更新が止まりセキュリティ対応を自分で行う必要が生じた
これらの状況は「公開モジュールの恩恵よりメンテナンスコストが大きくなった」サインです。自前で
modules/ 配下に同等のモジュールを実装し、外部依存を排除する方が長期的に安定します。導入後のトラブル事例とその対処
公開モジュールを本番に入れた後に実際に発生しやすいトラブルと、その対処法を解説します。1. バージョンアップ時のbreaking changeでterraform planが壊れた
最も多いトラブルがこれです。例えばvpcモジュールをv4.xからv5.xにアップグレードした際、いくつかのvariable名が変更されたためplanでエラーが発生するケースがあります。# バージョンアップ時のエラー例 Error: Unsupported argument on main.tf line 8, in module "vpc": 8: enable_s3_endpoint = true An argument named "enable_s3_endpoint" is not expected here. # v5.x でこのvariableが廃止された
・1)モジュールのCHANGELOGを必ず確認し、breaking change一覧を把握する
・2)廃止されたvariableを削除または代替variableに変更する
・3)`terraform plan` でno-changesになることを確認してから `terraform apply` する
・4)バージョンアップは1メジャーずつ行う(v4 → v5 → v6 と飛ばさない)
2. terraform initが失敗する(モジュールのダウンロードエラー)
CIサーバーや制限されたネットワーク環境で `terraform init` が失敗するケースです。# よくあるエラー例 Error: Failed to install module Could not download module "vpc" (main.tf:3) source code from "https://registry.terraform.io/...": error downloading 'https://github.com/terraform-aws-modules/...': ...
・プロキシ環境:環境変数 `HTTPS_PROXY` を設定するか、`~/.terraformrc` にプロキシ設定を追加する
・エアギャップ環境:モジュールをvendoring(サブモジュールとして手動配置)しRegistryへの接続なしで動かす
・企業環境:Terraform CloudやArtifactoryでプライベートモジュールRegistryを立て、外部参照を一元管理する
企業の本番環境では外部Registryへの直接アクセスを禁止しているケースもあるため、インフラチームのネットワークポリシーを事前に確認してください。
3. terraform importと公開モジュールの差分問題
手動で作ったリソースを `terraform import` した後に公開モジュールを導入すると、タグやオプション設定の差分が大量に出ることがあります。この場合、`lifecycle { ignore_changes }` で差分を無視するか、現状に合わせてコードを修正するかのどちらかです。前者は応急処置として有効ですが、長期的には「コードが現実を表していない状態」になるため、計画的に解消する必要があります。
本記事のまとめ
terraform registry モジュールの本番採用判断と運用のポイントを整理しました。| やりたいこと | 手順・判断軸 |
|---|---|
| 信頼できるモジュールを選ぶ | Official/Partner優先・Star数・最終コミット日・CHANGELOG確認 |
| バージョンを固定する | version = "~> MAJOR.MINOR" で固定 |
| チーム全体のバージョンを統一する | .terraform.lock.hcl をGitにコミット |
| 公開モジュールをカスタマイズする | variablesで吸収 → wrapperモジュールで薄くラップ |
| 自作モジュールに切り替えるタイミング | ignore_changesが増加・forkが必要・upstreamが停止 |
| breaking changeに対処する | CHANGELOGを確認・1メジャーずつアップ・planで検証 |
次のステップとして、モジュール設計の深化やproviderバージョン管理も合わせて理解を深めておきましょう。
・Terraformのmoduleとfor_each・countで構成を再利用する設計パターン
・Terraformのprovider設定とバージョン管理|required_providersとterraform.lock.hclでチーム開発を安定させる方法
・Terraformのディレクトリ構成ベストプラクティス|environments分割とmodules共通化のリポジトリ設計
>> Terraform実践セミナーの詳細はこちら
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます