はじめに
あなたが近所を設計する建築家だと想像してください。レンガを一つずつ積み上げるように、家を毎回ゼロから設計することはないでしょう。代わりに、「標準住宅」の設計図を作成し、その設計図を 50 回コピーします。
Terraform では、このような再利用可能な設計図を モジュール と呼びます。
モジュールは、Terraform を小さなサンプルから実際のインフラストラクチャコードベースへ拡張するための中心的な仕組みです。チームは一度パターンをパッケージ化すれば、それを何度も再利用できます。
同じ設定を何度も繰り返し記述する代わりに、モジュール内に一度だけ記述して再利用します。実際のインフラストラクチャコードベースはすぐに大きくなるため、アプリケーションコードと同じように構造化する必要があります。モジュールはそのために重要です。
この実験では、サーバー設定ファイルを生成する単純なモジュールを作成し、そのモジュールを使って 2 台の異なるサーバーを作成します。
モジュール用ディレクトリを作成する
まず、設計図を保存する場所を用意します。Terraform のモジュールは、Terraform ファイルを含む通常のフォルダーです。
ここで重要なのは、ファイル形式の観点では、モジュールが特別な新しい言語機能ではないという点です。モジュールは、再利用可能なインターフェースの背後に Terraform の設定をまとめたものです。
通常は、整理しやすいように modules という名前のフォルダーを作成します。その中に、今回作成する webserver モジュール用のフォルダーを作成します。
次の構成を作成してください。
cd ~/project
mkdir -p modules/webserver
作成した内容を確認します。
ls -R
modules ディレクトリの中に webserver ディレクトリが表示されます。この webserver フォルダーが、独立した小さなプロジェクトとして機能します。
モジュールを定義する
次に、設計図そのものを記述します。
モジュールはルートプロジェクトと同じように動作します。リソースを定義する main.tf と、入力を受け取る variables.tf を持ちます。
この実験では、local_file という単純なリソースを使用します。このリソースは、ディスク上にテキストファイルを作成します。処理が速く、複雑なクラウド環境を必要としないため、モジュールを学ぶのに適しています。
まず、nano を使ってモジュールの main.tf を作成します。
nano modules/webserver/main.tf
次の内容を追加します。これにより、指定したテキストを含むファイルが Terraform によって作成されます。
resource "local_file" "server_config" {
content = "Server Name: ${var.server_name}\nEnvironment: ${var.env}"
filename = "${path.root}/${var.server_name}-config.txt"
}
nano で保存して終了します(Ctrl+O、Enter、Ctrl+X)。
var.server_name が使われていますが、まだ定義していません。プログラミングの関数と同じように、モジュールでは受け付ける入力を宣言する必要があります。
この関数に似たモデルで考えると理解しやすくなります。モジュールは入力と出力を公開し、内部のリソースの詳細を呼び出し側から隠します。
モジュールの variables.tf を作成します。
nano modules/webserver/variables.tf
次の入力定義を追加します。
variable "server_name" {
description = "The name of the server"
type = string
}
variable "env" {
description = "The environment (e.g., dev, prod)"
type = string
default = "dev"
}
nano で保存して終了します。
これで設計図(モジュール)が完成しました。モジュールは、ファイルを どのように 作成するかと、その処理に必要な情報(名前と環境)を把握しています。
モジュールを呼び出す
ここではサイトマネージャーの役割を担います。サーバーを構築したいものの、細かい実装方法は気にせず、モジュールに作業を任せます。
ルートの main.tf(~/project にあるファイル)に module ブロックを作成して、モジュールを呼び出します。
ルートの main.tf を作成します。
cd ~/project
nano main.tf
モジュールを「呼び出す」ために、次の内容を追加します。
module "my_first_server" {
source = "./modules/webserver"
server_name = "web-01"
env = "production"
}
忘れずに nano で保存して終了してください。
設定の内容を確認します。
module "my_first_server":このモジュールインスタンスの名前です。source:重要な項目です。設計図のフォルダー(./modules/webserver)の場所を Terraform に伝えます。server_nameとenv:モジュールに渡す入力値です。
つまり、モジュールの呼び出しを使うと、ルート設定ではより高いレベルの意図を記述できます。低レベルのリソースをすべて書き直す代わりに、「この入力値で再利用可能なパターンをインスタンス化する」と指定できます。
重要:新しいモジュールを追加した場合は、Terraform にそのモジュールを準備させる必要があります。init を実行してモジュールをインストールします。
terraform init
次に、設計を適用します。
terraform apply -auto-approve
結果を確認します。モジュールによって新しいファイルが作成されているはずです。
cat web-01-config.txt
成功です。モジュールが入力値(web-01 と production)を受け取り、必要な処理を実行しました。
モジュールを再利用する
ここでモジュールの効果を確認できます。2 台目のサーバーを作成します。すべてのリソースコードをコピーする代わりに、設計図をもう一度使います。
nano を使って、ルートの main.tf を再度開きます。
nano main.tf
矢印キーでファイルの末尾に移動し、次のブロックを追加します。
module "my_second_server" {
source = "./modules/webserver"
server_name = "web-02"
## We are not setting 'env' here, so it will use the default value "dev"
}
nano で保存して終了します。
この構成がいかに簡潔か確認してください。「web-02 という名前の別のサーバーが必要」と指定するだけです。local_file が内部でどのように動作するかを知る必要はありません。モジュールのインターフェースを使用するだけです。
変更を適用します。
terraform init
terraform apply -auto-approve
2 つの独立したサーバーファイルが存在することを確認します。
ls -l *-config.txt
2 台目のサーバーでデフォルトの dev 環境が使用されていることも確認します。
cat web-02-config.txt
これで、再利用可能なインフラストラクチャの基本原則を身につけました。
まとめ
おめでとうございます。プロフェッショナルな Terraform コードを書くための大きな一歩を踏み出しました。
この実験では、次の内容を学びました。
- モジュール:コードを再利用可能なフォルダー(「設計図」)にまとめる方法。
- 入力:変数を使ってモジュールを柔軟にする方法。
- モジュールの呼び出し:
moduleブロックを使って設計図のインスタンスを作成する方法。 - 再利用:最小限のコードでインフラストラクチャの複数のコピーを簡単に作成する方法。
ばらばらのレンガの山ではなく、再利用可能なコンポーネントを手に入れました。これにより、より速く、安全で、整理されたインフラストラクチャを構築できます。



