2023/05/27
Terraform の適切なディレクトリ構造について考える
はじめに
Terraform は、クラウドリソースのプロビジョニングと管理を助けるオープンソースのインフラストラクチャーコードツールです。AWS や Google Cloud を始めとする多様なクラウドプロバイダに対応しています。Terraform の紹介や導入の仕方については、前回のブログ記事に書いてあります。https://launchcart.jp/blog/terraform-入門
Terraform を使用してインフラストラクチャを管理する際、適切なディレクトリ構造を持つことは、プロジェクトの可読性、再利用性、に大きく影響します。この記事では、Google Cloud を中心に Terraform ディレクトリ構造について紹介します。
Terraform のディレクトリ構造
適切なディレクトリ構造がプロジェクトの成功にとって重要であるということです。プロジェクトのリソースと依存関係が増えると、Terraform の設定は複雑になります。これは、プロジェクトがスケールアップするにつれて、適切な組織と管理が必要であることを意味します。
以下に、一般的な Terraform ディレクトリ構造の例を示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | . ├── main.tf ├── variables.tf ├── outputs.tf ├── modules/ │ ├── compute/ │ │ ├── main.tf │ │ ├── variables.tf │ │ └── outputs.tf │ └── networking/ │ ├── main.tf │ ├── variables.tf │ └── outputs.tf └── environments/ ├── prod/ │ ├── main.tf │ ├── variables.tf │ └── terraform.tfvars └── dev/ ├── main.tf ├── variables.tf └── terraform.tfvars |
ルートディレクトリの概念
ルートディレクトリはプロジェクトの出発点であり、一般的には 3 つの主要なファイルで構成されます。
main.tf
: リソースやモジュール、データソース、プロバイダー設定など、Terraform の主要な構成要素が定義されています。variables.tf
: ここでは、プロジェクトで使用される各種変数が定義されます。これには、デフォルト値や型、説明などが含まれます。outputs.tf
: リソースやモジュールの属性を出力するために使用されます。これは、他の Terraform 設定やシェルスクリプトから参照できます。
これらのファイルは、ルートディレクトリに配置され、プロジェクト全体の基盤となります。
モジュールディレクトリ
モジュールディレクトリは、再利用可能なコードの断片を保持する場所です。一般的には、特定の目的を果たすリソースの集まりがここに格納されます。例えば、Compute Engine のインスタンスや Cloud Storage のバケットなどが考えられます。
各モジュールディレクトリは、そのモジュールのmain.tf
、variables.tf
、outputs.tf
の 3 つのファイルを持つことが一般的です。
以下に、Google Compute Engine のインスタンスを作成するモジュールの例を示します。
1 2 3 4 5 6 | modules/ └── compute/ ├── main.tf ├── variables.tf └── outputs.tf |
main.tf
では、Compute Engine のインスタンスを定義します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | resource "google_compute_instance" "instance" { name = var.instance_name machine_type = var.instance_type zone = var.instance_zone boot_disk { initialize_params { image = var.instance_image } } network_interface { network = var.network_name } } |
variables.tf
では、必要な変数を定義します。
1 2 3 4 5 6 | variable "instance_name" {} variable "instance_type" {} variable "instance_zone" {} variable "instance_image" {} variable "network_name" {} |
outputs.tf
では、作成されたインスタンスの情報を出力します。
1 2 3 4 5 6 7 8 | output "instance_id" { value = google_compute_instance.instance.id } output "instance_public_ip" { value = google_compute_instance.instance.network_interface[0].access_config[0].nat_ip } |
このように、モジュールは特定の機能をカプセル化し、再利用可能なコードを提供します。
環境ディレクトリ
環境ディレクトリは、特定の環境(例えば、開発環境や本番環境)で使用されるリソースの設定を格納します。これらのディレクトリでは、特定の環境に対するリソースの割り当てや構成を定義します。
各環境ディレクトリには、その環境用の main.tf、variables.tf、そして環境固有の値を定義した terraform.tfvars が含まれます。
以下に、開発環境と本番環境で使用する設定の例を示します。
1 2 3 4 5 6 7 8 9 10 11 | environments/ ├── dev/ │ ├── main.tf │ ├── variables.tf │ └── terraform.tfvars └── prod/ ├── main.tf ├── variables.tf └── terraform.tfvars main.tfは、使用するモジュールを呼び出し、各種リソースを構成します。 |
1 2 3 4 5 6 7 8 9 10 | module "compute" { source = "../../modules/compute" instance_name = var.instance_name instance_type = var.instance_type instance_zone = var.instance_zone instance_image = var.instance_image network_name = var.network_name } |
variables.tf
では、必要な変数を定義します。
1 2 3 4 5 6 | variable "instance_name" {} variable "instance_type" {} variable "instance_zone" {} variable "instance_image" {} variable "network_name" {} |
terraform.tfvars
では、環境固有の値を設定します。
1 2 3 4 5 6 | instance_name = "dev-instance" instance_type = "n1-standard-1" instance_zone = "us-central1-a" instance_image = "debian-cloud/debian-9" network_name = "default" |
以上が一般的な Terraform のディレクトリ構造のベストプラクティスです。この構造を使用することで、Terraform コードの組織化、再利用、スケーラビリティを向上させ、プロジェクトの変化に対応することが可能になります。これらの原則は Google Cloud に限定されず、他のクラウドプロバイダでも同様に適用することができます。
参考文献:
Author Profile
スターフィールド編集部
SHARE