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_vpc、aws_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)と呼ぶ。
公開レジストリ vs 自社モジュール
企業でTerraformを本格活用する際、どのモジュールを使うかの判断基準を整理しておくと発注・選定がスムーズになる。
| 観点 | 公開レジストリモジュール | 自社製モジュール |
|---|---|---|
| 作成コスト | 低い(すぐ使える) | 高い(設計・実装が必要) |
| セキュリティ要件への対応 | 汎用的で融通が利かないことも | 自社ポリシーに完全準拠可能 |
| メンテナンス | コミュニティ依存 | 自社で責任を持つ |
| 推奨用途 | PoC・小規模・標準的構成 | 本番・大規模・独自要件あり |
関連する規格・RFC
※ TerraformはHashiCorpの独自仕様製品のため、IETFやISOの公式規格は存在しない。公式ドキュメントや仕様書についてはTerraform公式ドキュメントを参照。
関連用語
- Terraform — HashiCorp製のIaCツール本体。HCLでインフラをコード定義する
- IaC(Infrastructure as Code) — インフラ構成をコードで管理・自動化する考え方
- HCL(HashiCorp Configuration Language) — Terraformの設定ファイルで使う独自言語
- Terraform State — 現在のインフラ状態を記録するtfstateファイルの仕組み
- Terraform Registry — 公開モジュールやProviderを検索・利用できる公式リポジトリ
- CI/CDパイプライン — コードの変更を自動でテスト・デプロイする仕組み
- GitOps — Gitリポジトリを唯一の真実として運用変更を管理する手法
- AWS CloudFormation — AWSネイティブのIaCサービス。Terraformの比較対象としてよく登場する