Terraformモジュールとは
Terraformモジュールは、単一のディレクトリ内に組織されたTerraformリソース、変数、および出力のコレクションです。各モジュールは、仮想マシンのプロビジョニング、データベースの作成、またはロードバランサの設定など、特定の機能のカプセル化に使用できます。モジュールを作成することで、インフラストラクチャの再利用可能なビルディングブロックを定義し、異なるプロジェクト、チーム、さらにはTerraformコミュニティ全体で共有できます。
Terraformモジュールの利点と欠点
この章では、Terraformモジュールの利点と欠点について説明し、インフラストラクチャプロジェクトで使用するかどうかを決定する際に役立つ情報を提供します。
Terraformモジュールの利点
-
モジュラリティ
モジュールは、インフラストラクチャコードのモジュラリティを促進し、理解、維持、およびスケーリングを容易にします。 -
再利用性
モジュールは、コードの重複を減らし、一貫性を促進するために、複数のプロジェクトで再利用できます。 -
コラボレーション
モジュールは、標準化されたインフラストラクチャコンポーネントを共有および貢献することにより、チーム間でのコラボレーションを容易にします。 -
抽象化
モジュールは、複雑なインフラストラクチャパターンをカプセル化し、リソースとのユーザーのやり取りを簡素化します。 -
コミュニティ
Terraformコミュニティは、多数のオープンソースモジュールを提供しており、既存のソリューションを活用して開発時間を短縮できます。
Terraformモジュールの欠点
-
複雑さ
モジュールを導入することで、ネストされたモジュールや複雑な依存関係など、インフラストラクチャコードの複雑さが増す可能性があります。 -
バージョニング
モジュールバージョンを管理することは課題であり、特に破壊的な変更や急速に進化するインフラストラクチャコンポーネントに対処する場合は難しい場合があります。 -
デバッグ
モジュール内の問題をデバッグすることは、追加の抽象化レイヤーのためにより困難になる場合があります。 -
カスタマイズ
モジュールは、特定のパターンやプラクティスを強制するように設計されている場合、カスタマイズオプションを制限する可能性があります。 -
学習曲線
高度なモジュールテクニックを使用するには、Terraformに関する追加の知識と経験が必要になる場合があります。
Terraformモジュールの作成と使用
この章では、Terraformモジュールを作成し、インフラストラクチャプロジェクトで使用するプロセスについて説明します。モジュールの構造と規約、入力および出力変数の定義、およびモジュールのバージョニングについて説明します。
モジュールの構造と規約
Terraformモジュールは、一連のTerraform構成ファイル(.tf
)を含む単一のディレクトリ内に組織されます。これらのファイルには、モジュールの機能を説明するために必要なリソース、変数、出力、およびその他の要素が含まれます。典型的なモジュールディレクトリ構造は、次のようになります。
my_module/
├── main.tf
├── variables.tf
├── outputs.tf
├── README.md
└── LICENSE
main.tf
: 主要なモジュールリソースを含み、通常、モジュールのエントリーポイントvariables.tf
: ユーザーがモジュールを消費する際に設定できる入力変数を定義outputs.tf
: モジュールが公開する出力変数を指定し、モジュール内で作成されたリソースに関する情報にアクセスできるようにするREADME.md
: モジュールの目的、使用方法、および構成オプションに関するドキュメントを提供LICENSE
: モジュールのコードのライセンスを指定。他の人と共有する場合に重要。
入力および出力変数の定義
入力変数を定義することで、モジュールのユーザーは、モジュールの動作を自分のニーズに合わせてカスタマイズできます。入力変数を定義するには、variables.tf
ファイルでvariable
ブロックを使用します。
variable "instance_type" {
description = "The instance type for the virtual machine"
type = string
default = "t2.micro"
}
出力変数は、モジュール内で作成されたリソースに関する情報にアクセスするためにユーザーに提供されます。出力変数を定義するには、outputs.tf
ファイルでoutput
ブロックを使用します。
output "instance_public_ip" {
description = "The public IP address of the virtual machine"
value = aws_instance.example.public_ip
}
モジュールのバージョニングと公開
Terraformモジュールでバージョニングを使用することで、安定してテストされたモジュールのバージョンを消費者が信頼できるようにすることができます。セマンティックバージョニング(例:「1.2.3」)は、モジュールバージョンを管理する一般的なアプローチです。モジュールを公開する際には、GitリポジトリまたはTerraformレジストリを配布メカニズムとして使用できます。
モジュールのインポートと消費
Terraform構成でモジュールを使用するには、module
ブロックを宣言し、モジュールのソースを指定します。source
属性は、ローカルパス、Gitリポジトリ、またはTerraformレジストリのURLである場合があります。
module "virtual_machine" {
source = "git::https://example.com/my_module.git?ref=v1.2.3"
instance_type = "t2.small"
}
モジュールをインポートした後、module.<MODULE_NAME>.<OUTPUT_NAME>
の構文を使用して、その出力変数にアクセスできます。
output "vm_public_ip" {
value = module.virtual_machine.instance_public_ip
}
Terraformモジュールを作成して使用することで、インフラストラクチャコードの組織化、再利用性、および保守性を向上させることができます。
AWS VPC Terraformモジュール
この章では、Terraformモジュールを使用してAmazon Web Services(AWS)のVirtual Private Cloud(VPC)を作成する例を紹介します。
AWS VPCモジュールは、公開されたコミュニティ貢献モジュールであり、パブリックおよびプライベートサブネットを持つVPCの作成を簡素化します。このモジュールは、VPC、サブネット、ルートテーブル、およびネットワークアクセス制御リスト(ACL)などのさまざまなリソースを作成します。
AWS VPCモジュールは、Terraformレジストリで見つけることができます。
AWS VPCモジュールをTerraform構成で使用するには、モジュールブロックを宣言し、Terraformレジストリからのモジュールソースを指定します。
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
name = "my-vpc"
cidr = "10.0.0.0/16"
azs = ["us-west-2a", "us-west-2b", "us-west-2c"]
private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
public_subnets = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]
enable_nat_gateway = true
single_nat_gateway = false
enable_dns_hostnames = true
tags = {
Terraform = "true"
Environment = "dev"
}
}
この例では、AWS VPCモジュールを使用して、3つのパブリックおよび3つのプライベートサブネットが3つのアベイラビリティーゾーンに分散されたVPCが作成されます。 VPCはNATゲートウェイとDNSホスト名が有効に設定されています。さらに、モジュールによって作成されたリソースにカスタムタグが適用されます。
AWS VPCモジュールは、作成されたリソースに関する情報をアクセスできるようにするさまざまな出力変数を提供します。この例では、VPC IDとプライベートサブネットIDにアクセスします。
output "vpc_id" {
description = "The ID of the created VPC"
value = module.vpc.vpc_id
}
output "private_subnet_ids" {
description = "The IDs of the created private subnets"
value = module.vpc.private_subnets
}
これらの出力は、Terraform構成の他の部分で使用するか、他のモジュールに入力として渡すことができます。
参考