😗

Terraform Moduleの紹介

に公開

🚀 Terraform Module入門:インフラコードを整理し、再利用性を高める

ここの記事は、これからTerraformを始める方が、コードの効率と品質を格段に向上させる**Module(モジュール)**の基本を学ぶための入門編です。


📦 Moduleとはなにか?(基本とメリット)

一言でいうと、Moduleとは、Terraformのコードをまとめた再利用可能なパッケージのことです。

あなたがインフラをコード化する際、「Webサーバー(EC2)とネットワーク(VPC)をセットで作りたい」という一連の構成を一つの塊として定義したものがModuleです。

1. コードの再利用性(DRY原則の実現)

Moduleの最大のメリットは、コードの再利用性を高め、**DRY(Don't Repeat Yourself:繰り返しを避けよ)**の原則を実現することです。

【例】3つの環境に同じ構成が必要な場合

状況 コード管理 メンテナンス
Moduleを使わない場合 同じコードを3つのファイルにコピー&ペースト 修正が必要なとき3箇所直す必要あり
Moduleを使う場合 一度だけ定義したModuleを3回呼び出す 修正が必要なとき1箇所直すだけで完了

これにより、コード量が大幅に減り、メンテナンスの効率が飛躍的に向上します。

2. コードの構造化と可読性の向上

Moduleは、コードを機能ごと(例:networkdatabaseapp_serverなど)に分割・整理し、ディレクトリ構造で管理できるようにします。これにより、プロジェクトの構成が一目で分かりやすくなり、チーム開発や引き継ぎが圧倒的にスムーズになります。


🔑 Moduleの使い方:インプットとアウトプットの役割

Moduleを再利用可能な部品として使うために重要なのが、インプット(変数)とアウトプット(出力)の考え方です。この仕組みが、Moduleによる抽象化を実現します。

1. インプット(variable)による抽象化

Moduleは、インプットを事前に定義することで、必要最小限のパラメータだけで必要なインフラリソースを構築できるように設計されます。

たとえば、高性能なVPC Moduleの内部には何十行もの設定コードがあるかもしれません。しかし、Moduleの利用者は以下のコードのように、VPCのCIDRブロック環境名など、必要な情報だけをインプットとして渡すだけで済みます。

# Moduleを呼び出す側のコード例 (Root Module)
module "production_vpc" {
  # どこにあるModuleを使うかを source で指定
  source           = "terraform-aws-modules/vpc/aws" 
  
  # Moduleが要求するインプットに値を設定
  vpc_cidr_block   = "10.10.0.0/16"               # インプット
  environment_name = "production"                 # インプット
}

このように、「どう作るか」という複雑な実装の詳細を隠し、「何を設定するか」というシンプルなインターフェースだけを利用者に提供できます。

2. アウトプット(output)による情報連携

Moduleが作成したリソースの情報(例:VPC ID、サブネットIDなど)を、他のリソースやModuleで利用するために外部に公開するのがアウトプットです。

# Root Moduleで、VPC Moduleのアウトプットを利用するコード例
resource "aws_security_group" "web_sg" {
  name   = "web-sg"
  # 呼び出したModule名.出力名 でアクセス
  vpc_id = module.production_vpc.vpc_id 
}

🌍 Moduleの種類:どこからコードを持ってくるの?

Moduleのコードがどこに配置されているかによって、使い方が変わってきます。

1. ローカル Module(Internal Module)

あなたのプロジェクト内のサブディレクトリにコードを置いて、そのプロジェクト内だけで再利用する部品です。

  • 用途: プロジェクト固有の共通設定や、何度も使うが外部には公開しない部品の再利用。
  • sourceの指定例: ./modules/basic-vpc (実行ディレクトリからの相対パス)

2. リモート Module(Remote Module)

プロジェクトの外部(インターネット上やクラウドストレージ)にコードを置いて、広く共有・利用されるModuleです。

代表例: Terraform Registry

  • アドレス: https://registry.terraform.io/modules/terraform-aws-modules/vpc/aws/latest
  • Terraform公式のリポジトリです。AWSやAzureなどの公式Moduleや、コミュニティによって広く使われている高品質なModuleが公開されています。これを使うことで、VPCやEKSクラスターなど、複雑な構成を一瞬で安全に構築できます。

その他の場所

  • GitHub/GitLab: Gitリポジトリとしてホストし、組織内で標準構成を共有する場合などに利用されます。
  • S3など: クラウドストレージにコードを配置して利用することも可能です。

この記事があなたのTerraform学習の一助になれば幸いです。

Discussion