Terraform モジュール

LinuxBeginner
オンラインで実践に進む

はじめに

あなたが近所を設計する建築家だと想像してください。レンガを一つずつ積み上げるように、家を毎回ゼロから設計することはないでしょう。代わりに、「標準住宅」の設計図を作成し、その設計図を 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 ブロックを使って設計図のインスタンスを作成する方法。
  • 再利用:最小限のコードでインフラストラクチャの複数のコピーを簡単に作成する方法。

ばらばらのレンガの山ではなく、再利用可能なコンポーネントを手に入れました。これにより、より速く、安全で、整理されたインフラストラクチャを構築できます。