Terraform モジュール

Terraform Mojuru



インフラストラクチャのプロビジョニングと管理の世界では、Terraform は開発者と運用チームの間で人気の選択肢として浮上しています。宣言構文 (HCL – HashiCorp 構成言語) とさまざまなインフラストラクチャ プロバイダーのサポートにより、Terraform はコードとしてのインフラストラクチャ (IaC) の実践を可能にします。

その重要な機能の 1 つは、モジュール式インフラストラクチャ コードの作成と再利用を可能にするモジュールの使用です。この記事では、Terraform モジュールの概念と、Terraform モジュールがインフラストラクチャ コードの整理と簡素化にどのように役立つかについて説明します。







Terraform モジュールの概要

Terraform モジュールは、定義された入力変数と出力変数を持つリソースのセットを表す Terraform 構成の自己完結型パッケージです。これらは、インフラストラクチャ コードをカプセル化して再利用する方法を提供し、複雑なインフラストラクチャ展開の管理と維持を容易にします。



モジュールは、プロジェクト内で作成して使用することも、複数のプロジェクトまたはチーム間で共有することもできます。



モジュールの構成

Terraform モジュールを編成する場合、ルート モジュールと子モジュールで構成される階層構造を持つのが一般的です。この組織がどのように機能するかを見てみましょう。





ルートモジュール



ルート モジュールは、Terraform 構成の最上位モジュールを表します。これは、インフラストラクチャ全体を定義し、さまざまなリソース間の関係を管理するためのエントリ ポイントです。

通常、ルート モジュールには、インフラストラクチャの基盤を形成するリソースと構成を定義する「main.tf」ファイルが含まれています。オプションで、「variables.tf」ファイルと「outputs.tf」ファイルを含めることもできます。また、ルート ディレクトリ内に「modules」ディレクトリを定義して、子モジュールに簡単にアクセスできます。

子モジュール

子モジュールは、特定のリソースまたは構成のセットをカプセル化するモジュール式コンポーネントです。これらは再利用できるように設計されており、インフラストラクチャ機能の自己完結型ユニットを表します。

子モジュールは、ルートまたは他の子モジュール内で使用でき、構成や複雑なインフラストラクチャの構築が可能になります。通常、各子モジュールには、「main.tf」、「variables.tf」、「outputs.tf」などの必要な構成ファイルを含むディレクトリがあります。

次に、Terraform モジュールを作成する方法を見てみましょう。

Terraform モジュールの作成

Terraform モジュールを作成するときは、必要な Terraform 構成ファイルを含むモジュール用の新しいディレクトリを作成する必要があります。通常、そのディレクトリには「modules」という名前が付けられます。プロジェクトのルート ディレクトリ内で定義することがベスト プラクティスです。

Docker を使用してローカル Web サーバーをプロビジョニングする単純なモジュールの簡単な例を見てみましょう。まず、「modules」ディレクトリ内のモジュールを「main.tf」として定義します。

リソース 「ドッカーコンテナ」 「ウェブサーバー」 {
名前 = 変数名
画像 = var.image
ポート {
内部 = var.internal_port
外部 = var.external_port
}
}

ここでは、コンテナー名、Docker イメージ、内部ポート、および外部ポートを入力変数として受け取る「docker_container」というモジュールを作成します。このモジュールは、Docker コンテナー リソースを作成するロジックをカプセル化し、呼び出し元がコンテナーのプロパティをカスタマイズできるようにします。

次の図に示すように、「modules」ディレクトリに「variables.tf」という別のファイルを作成して、モジュールの使用時にカスタマイズできる入力変数を定義します。

変数 '名前' {
説明 = 「Dockerコンテナ名」
タイプ = 文字列
}

変数 '画像' {
説明 = 「ドッカーイメージ」
タイプ = 文字列
}

変数 「内部ポート」 {
説明 = 「Dockerコンテナの内部ポート」
タイプ = 数字
}

変数 「外部ポート」 {
説明 = 「マッピング先の外部ポート」
タイプ = 数字
}

ここでは、属性として「説明」と「タイプ」、およびそれらに関連する値を持つ 4 つの変数を宣言しました。

Terraform モジュールの使用

モジュールを作成したので、ソースを参照してメインの Terraform 構成で使用できるようになりました。メインの設定ファイル「main.tf」をルート ディレクトリに作成しましょう。

モジュール 「ウェブサーバーコンテナ」 {
ソース = 「../modules/docker_container」
名前 = 「私のウェブサーバー」
画像 = 「nginx:最新」
内部ポート = 80
外部ポート = 8080
}

前のコードの「module」ブロックを使用して、Docker コンテナー モジュールをインスタンス化します。コンテナー名、Docker イメージ、ポート構成など、モジュールに必要な入力値を提供します。 「source」パラメータは「module」ディレクトリへの相対パスを指定します。

次に、モジュールで使用する Terraform 出力の使用方法を見てみましょう。

モジュール出力

Terraform のモジュール出力は、モジュール内から特定の値を公開する方法を提供し、それらの値をメイン構成または他のモジュールで使用できるようにします。これらは、モジュールと呼び出し元の間の通信チャネルとして機能し、モジュールがさらなる構成や意思決定に役立つ、または必要となる情報やデータを提供できるようにします。

出力 「コンテナID」 {
説明 = 「作成したDockerコンテナのID」
値 = docker_container.webserver.id
}

ここでは、「modules」ディレクトリ内に「outputs.tf」ファイルを作成しました。この出力変数は、モジュール内の「webserver」という名前の「docker_container」リソースによって作成される Docker コンテナの ID を公開します。

これで、ルート設定ファイル内のコンテナ ID にアクセスできるようになりました。ルート ディレクトリにある「main.tf」ファイルの次の更新されたコードを参照してください。

モジュール 「ウェブサーバーコンテナ」 {
ソース = 「../modules/docker_container」
名前 = 「私のウェブサーバー」
画像 = 「nginx:最新」
内部ポート = 80
外部ポート = 8080
}

リソース 「docker_volume」 'データ' {
# 残りの引数はここにあります
練る = module.webserver_container.container_id
}

「bind」引数の値として「module.webserver_container.container_id」を使用することで、「web_container」モジュールのコンテナ ID で指定された場所に Docker ボリュームをバインドするように Terraform に指示します。これにより、Docker ボリューム リソースと「webserver_container」モジュールによって作成されるコンテナーとの関係が確立され、ボリュームが適切な場所にマウントされることが保証されます。

Terraform モジュールのベスト プラクティス

モジュール化して再利用可能にする

モジュールを設計するときは、再利用性を考慮する必要があります。また、インフラストラクチャの論理コンポーネントまたはパターンを特定し、それらを個別のモジュールにカプセル化する必要があります。これにより、コードの再利用、標準化が促進され、チーム間でのコラボレーションが容易になります。

明確で一貫した命名

モジュール、変数、リソースに明確で一貫した命名規則を使用すると、コードベースの読みやすさと理解が向上し、他の人がモジュールを操作したり保守したりすることが容易になります。

依存関係を分離する

モジュール間の密結合は避けなければなりません。各モジュールは、独自のリソースと依存関係をカプセル化する必要があります。これにより、モジュールを独立して再利用できるようになり、より適切な分離とカプセル化が促進されます。

バージョン管理とモジュールレジストリ

モジュールをバージョン管理されたリポジトリまたはモジュール レジストリに公開できます。これにより、モジュールの共有と検出のための一元的な場所が提供され、簡単なアクセスとバージョン管理が保証されます。

結論

Terraform モジュールについて簡単に説明し、簡単な例を使用してモジュールを作成する方法を学びました。次に、モジュールで変数と出力を使用して、モジュールの柔軟性、再利用性、保守性を強化する方法を検討しました。結論として、Terraform モジュールはインフラストラクチャ コードを整理して簡素化する強力なツールです。これにより、一連のリソースまたは構成を再利用可能なコンポーネントにカプセル化して、コードとしてのインフラストラクチャ プロジェクト内でのモジュール性、再利用性、コラボレーションが促進されます。