はじめに
Terraform モジュールは、Infrastructure as Code (IaC) の中核となる概念であり、再利用可能で、設定可能で、整理されたコンポーネントを作成できるようにします。同じコードブロックを複数の場所に記述する代わりに、それをモジュールにカプセル化し、必要なときにいつでも呼び出すことができます。このプラクティスは、プロジェクト全体でのコードの保守性と一貫性を大幅に向上させます。
この実験(Lab)では、Terraform モジュールの実装の基本を学びます。まず、標準的なモジュールのディレクトリ構造を作成することから始めます。次に、ローカルファイルを生成するシンプルなモジュールを定義します。このモジュールを変数を使用して設定可能にし、出力(outputs)を使用してその結果を公開します。最後に、ルート Terraform 構成からこのモジュールを呼び出してリソースをデプロイします。
この実験(Lab)を終えるまでに、独自の Terraform モジュールを構築および使用する方法について実践的な理解が得られるでしょう。
プロジェクトルートに modules ディレクトリを作成する
このステップでは、ローカル Terraform モジュールの標準的なディレクトリ構造を作成します。すべてのローカルモジュールをプロジェクトのルートにあるmodulesディレクトリ内に配置するのが一般的な慣習です。その後、modules内の各サブディレクトリが、単一の自己完結型モジュールを表します。
まず、モジュール用のディレクトリと、localfile_creatorという名前のモジュール用の特定のサブディレクトリを作成します。すべての操作は~/projectディレクトリ内で行われます。
ネストされたディレクトリ構造を作成するには、次のコマンドを実行します。
mkdir -p modules/localfile_creator
-pフラグは、親ディレクトリmodulesがまだ存在しない場合にmkdirがそれを生成するようにします。
次に、treeコマンドを使用して、ディレクトリが正しく作成されたことを確認できます。treeがインストールされていない場合は、ls -Rを使用できます。
tree
新しいディレクトリ構造を確認するために、次の出力が表示されるはずです。
.
└── modules
└── localfile_creator
2 directories, 0 files
この構造により、再利用可能なモジュールコードと、それを使用するルート構成が明確に分離されます。
local_file リソース用のモジュール内に main.tf を作成する
このステップでは、新しいモジュールの主要な構成ファイルを作成します。各モジュールは自己完結型の Terraform プロジェクトであるため、独自の.tfファイルのセットを持ちます。main.tfファイルは通常、モジュールのコアリソースが定義される場所です。
ここでは、hashicorp/localプロバイダの一部であるlocal_fileリソースを定義します。このリソースは、クラウドプロバイダの認証情報を必要とせずにローカルファイルシステム上のファイルを管理するだけでよいため、学習目的に最適です。
まず、nanoエディタを使用して、モジュールのディレクトリ内にmain.tfファイルを作成します。
nano modules/localfile_creator/main.tf
次に、ファイルに次の HCL (HashiCorp Configuration Language) コードを追加します。このコードは、exampleという名前のlocal_fileタイプのリソースを定義します。
resource "local_file" "example" {
content = "This is a file created by a Terraform module."
filename = "${path.module}/module_output.txt"
}
このコードを分析しましょう。
resource "local_file" "example": これはlocal_fileタイプのリソースを宣言し、ローカル名exampleを付けます。content: この引数は、ファイルに書き込まれるコンテンツを設定します。filename: この引数は、作成されるファイルのパスと名前を指定します。ここでは、組み込みのpath.module変数を使用します。これは、式が配置されているモジュールのファイルシステムパスを常に参照します。これにより、ファイルパスがモジュール自体に対して相対的になります。
ファイルを保存し、Ctrl+X、次にY、そしてEnterを押してnanoを終了します。
モジュールの変数と出力を定義する
このステップでは、モジュールを設定可能にし、情報を返すことができるようにします。ファイル名やコンテンツのような値をハードコーディングすると、モジュールの再利用性が制限されます。入力変数を使用してカスタム値を渡し、出力値を使用してモジュールが作成するリソースに関する情報を公開します。
慣例により、変数はvariables.tfファイルに、出力はoutputs.tfファイルに定義されます。
まず、モジュールのvariables.tfファイルを作成します。
nano modules/localfile_creator/variables.tf
次のコードを追加して、2 つの入力変数file_contentとfile_nameを定義します。
variable "file_content" {
description = "The content of the file."
type = string
default = "Default content."
}
variable "file_name" {
description = "The name of the file to create."
type = string
}
次に、モジュールが返す情報を宣言するためにoutputs.tfファイルを作成します。
nano modules/localfile_creator/outputs.tf
作成されたファイルの完全なパスを出力するために、次のコードを追加します。
output "filename" {
description = "The full path to the created file."
value = local_file.example.filename
}
最後に、これらの新しい変数を使用するようにモジュールのmain.tfを更新する必要があります。ハードコーディングされた値の代わりに変数を使用します。ファイルを再度開きます。
nano modules/localfile_creator/main.tf
ファイルを次のように変更します。ハードコーディングされた文字列をvar.file_contentとvar.file_nameに置き換えています。
resource "local_file" "example" {
content = var.file_content
filename = "${path.module}/${var.file_name}"
}
エディタを保存して終了します。これでモジュールは柔軟になり、異なる入力で使用する準備が整いました。
ルートの main.tf ファイルでモジュールを呼び出す
このステップでは、作成したモジュールを呼び出すルート構成ファイルを作成します。ルートのmain.tfは、Terraform 実行のエントリーポイントです。ここで、1 つ以上のモジュールを呼び出すことによってインフラストラクチャを構成します。
これからプロジェクトディレクトリのルートである~/projectで作業します。ここにmain.tfファイルを作成します。
nano main.tf
このファイルに次のコードを追加します。この構成はlocalfile_creatorモジュールを使用します。
terraform {
required_providers {
local = {
source = "hashicorp/local"
version = "2.4.0"
}
}
}
module "file_creator_instance" {
source = "./modules/localfile_creator"
file_content = "Hello from the root module!"
file_name = "my_test_file.txt"
}
output "created_file_path" {
description = "Path of the file created by the module."
value = module.file_creator_instance.filename
}
このルート構成を分析しましょう。
terraform { ... }: このブロックはプロバイダの要件を定義します。モジュールがlocalプロバイダを使用するため、それを呼び出すルートモジュールもそれを宣言する必要があります。module "file_creator_instance" { ... }: これはモジュールブロックです。file_creator_instanceは、この特定のモジュールインスタンスに対するローカル名です。source = "./modules/localfile_creator": これは Terraform にモジュールのソースコードがどこにあるかを伝えます。この場合、ローカルパスです。file_content = "..."およびfile_name = "...": ここで、モジュールのvariables.tfで定義された入力変数に値を渡しています。output "created_file_path" { ... }: このルートレベルの出力ブロックは、モジュールから値を取得します。構文はmodule.<MODULE_INSTANCE_NAME>.<OUTPUT_NAME>です。
ファイルを保存し、nanoを終了します。これでプロジェクトはモジュールを使用するように完全に構成されました。
terraform apply を実行してモジュール経由でデプロイする
最終ステップでは、標準の Terraform コマンドを使用して、構成の初期化、計画、適用を行います。これにより、モジュールのコードが実行され、ローカルファイルが作成されます。
まず、Terraform のワーキングディレクトリを初期化します。このコマンドは、必要なプロバイダプラグイン(この場合はhashicorp/local)をダウンロードします。
terraform init
Terraform が正常に初期化されたことを示す成功メッセージが表示されるはずです。
Initializing the backend...
Initializing provider plugins...
- Finding hashicorp/local versions matching "2.4.0"...
- Installing hashicorp/local v2.4.0...
- Installed hashicorp/local v2.4.0 (signed by HashiCorp)
Terraform has been successfully initialized!
...
次に、terraform planを実行して、Terraform がどのような変更を加えるかを確認します。これは、何も変更せずに実行計画を示すドライランです。
terraform plan
出力には、1 つのリソース(モジュール内のlocal_file)が作成されることが示されます。
...
Plan: 1 to add, 0 to change, 0 to destroy.
Changes to Outputs:
+ created_file_path = (known after apply)
...
それでは、構成を適用してファイルを作成します。対話型の確認プロンプトをスキップするために、-auto-approveフラグを使用します。
terraform apply -auto-approve
Terraform は計画を実行し、ファイルを作成します。出力は作成を確認し、定義した出力値を表示します。
...
module.file_creator_instance.local_file.example: Creating...
module.file_creator_instance.local_file.example: Creation complete after 0s [id=f73598097552a798110a31388c54c1194b539a53]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Outputs:
created_file_path = "./modules/localfile_creator/my_test_file.txt"
最後に、ファイルが正しいコンテンツで作成されたことを確認します。モジュールディレクトリ内のファイルを一覧表示し、次に新しいファイルの内容を表示します。
ls -l modules/localfile_creator/
cat modules/localfile_creator/my_test_file.txt
catコマンドの出力は次のようになるはずです。
Hello from the root module!
おめでとうございます。Terraform モジュールの作成と使用に成功しました!
まとめ
この実験(Lab)では、Terraform モジュールの作成と使用の基本を習得しました。適切なディレクトリ構造の設定から、再利用可能なモジュールを介したリソースのデプロイまで、全プロセスを経験しました。
以下の点を学びました。
- ローカルモジュールのための標準的なディレクトリ構造の作成。
- モジュールの
main.tfファイル内でのリソースの定義。 - モジュールを構成可能かつ再利用可能にするための
variables.tfの使用。 - モジュールから呼び出し元の構成へデータを公開するための
outputs.tfの使用。 - ルートの
main.tfファイルからローカルモジュールを呼び出し、入力変数を渡し、出力値にアクセスする方法。 - モジュールが機能していることを確認するために構成を適用する方法。
モジュールを習得することで、よりクリーンで、より整理され、よりスケーラブルな Infrastructure as Code(IaC)を作成できるようになります。この実験の完了、おめでとうございます!



