IaC

Terraformモジュール てらふぉーむもじゅーる

TerraformIaCモジュール再利用HashiCorpInfrastructure as Code
Terraformモジュールについて教えて

簡単に言うとこんな感じ!

インフラ構成の「部品テンプレート」だよ!「Webサーバーセット」「データベースセット」みたいな定番構成をひとまとめにしておいて、何度でも使い回せる仕組みなんだ。レゴブロックみたいに「この部品をここに!」って感じで組み合わせてインフラを作れるってこと!


Terraformモジュールとは

Terraformとは、HashiCorp社が開発したインフラをコードで管理するツール(IaC: Infrastructure as Code)だ。AWSやAzure、Google Cloudなどのクラウドリソースを、設定ファイルに書くだけで自動的に作成・変更・削除できる。そのTerraformの中で「モジュール」は、複数のリソース定義をひとまとめにして再利用できる仕組みのことを指す。

たとえば「EC2インスタンス+セキュリティグループ+EIPのセット」を毎回一から書くのは手間がかかるし、書き間違いのリスクもある。モジュールにしておけば、module "web_server" { source = "./modules/web" } のように呼び出すだけで同じ構成が何度でも再現できる。開発環境・ステージング環境・本番環境に同じ構成を展開するときに特に威力を発揮する。

モジュールを活用することで、コードの重複排除・構成の標準化・チーム間での共有が実現できる。大規模なシステム開発では「自社公認モジュール集」を整備して、誰が書いても同じ品質のインフラが作れるようにするのが一般的な運用スタイルになっている。


モジュールの構造と使い方

Terraformモジュールは、.tfファイルをひとつのディレクトリにまとめたものがそのまま「モジュール」になる。

要素役割
sourceモジュールの場所を指定"./modules/vpc" / "terraform-aws-modules/vpc/aws"
variables.tf外から受け取る入力値を定義VPC名、CIDRブロックなど
outputs.tf外に渡す出力値を定義作成されたVPC IDなど
main.tf実際のリソース定義aws_vpcaws_subnet など
versions.tf使用するProviderのバージョン指定required_providers ブロック

モジュールの呼び出し方(基本構文)

# 呼び出し側(ルートモジュール)
module "my_vpc" {
  source     = "./modules/vpc"   # モジュールのパス
  vpc_name   = "production-vpc"  # 入力変数に値を渡す
  cidr_block = "10.0.0.0/16"
}

# 出力値を他のリソースで使う
resource "aws_subnet" "example" {
  vpc_id = module.my_vpc.vpc_id  # モジュールの出力を参照
}

モジュールのソース種別

ソース種別書き方の例用途
ローカルパス"./modules/web"自社プロジェクト内での利用
Terraform Registry"terraform-aws-modules/vpc/aws"公開された汎用モジュール
GitHub"github.com/org/repo//modules/vpc"社内Gitリポジトリ
S3バケット"s3::https://bucket/module.zip"社内配布・バージョン管理

歴史と背景

  • 2014年 — HashiCorpがTerraform v0.1をリリース。この時点ではモジュールの概念は限定的
  • 2015年 — Terraform v0.6でモジュール機能が大幅強化。ローカルモジュールの再利用が実用的に
  • 2017年Terraform Registry(registry.terraform.io)が公開。コミュニティ製モジュールを検索・利用できるエコシステムが整備される
  • 2019年 — Terraform v0.12でHCL2(設定言語)が刷新。モジュールへの変数渡しがより柔軟に
  • 2020年 — Terraform Cloud / Enterprise でのプライベートモジュールレジストリ機能が充実。企業内での標準モジュール管理が本格化
  • 2023年 — HashiCorpがライセンスをBSL(Business Source License)に変更。これを受けてOpenTofuというOSSフォークが誕生するが、モジュールの仕様・構文は互換性を維持

ルートモジュールと子モジュールの関係

Terraformでは「すべてのコードはモジュール」という考え方を取っている。実行ディレクトリのコードをルートモジュール、そこから呼び出されるモジュールを子モジュール(Child Module)と呼ぶ。

Terraformモジュールの階層構造 ルートモジュール (実行ディレクトリの .tf ファイル群) VPCモジュール ./modules/vpc Webサーバーモジュール ./modules/web DBモジュール ./modules/db aws_vpc aws_subnet × 3 aws_instance aws_security_group aws_db_instance aws_db_subnet_group 子モジュール 実リソース variables.tf で入力を受け取り、outputs.tf で結果を返す

公開レジストリ vs 自社モジュール

企業でTerraformを本格活用する際、どのモジュールを使うかの判断基準を整理しておくと発注・選定がスムーズになる。

観点公開レジストリモジュール自社製モジュール
作成コスト低い(すぐ使える)高い(設計・実装が必要)
セキュリティ要件への対応汎用的で融通が利かないことも自社ポリシーに完全準拠可能
メンテナンスコミュニティ依存自社で責任を持つ
推奨用途PoC・小規模・標準的構成本番・大規模・独自要件あり

関連する規格・RFC

※ TerraformはHashiCorpの独自仕様製品のため、IETFやISOの公式規格は存在しない。公式ドキュメントや仕様書についてはTerraform公式ドキュメントを参照。


関連用語