モジュール構成で管理するTerraformプロジェクトのベストプラクティス
Terraformを使ってインフラをコードで管理する際、大規模になればなるほど構成の整理が重要になります。この記事では、モジュールベースで開発されたTerraformプロジェクトのディレクトリ基本構成について紹介します。
ディレクトリ構成の概要
以下は、実際に使用されているTerraformプロジェクトの構成例です:
terraform-project/
├── dev/
│ ├── .terraform/
│ ├── main.tf
│ ├── outputs.tf
│ ├── provider.tf
│ └── variables.tf
│
├── prod/
│ └── ...(本番環境用)
│
├── models/
│ ├── apigateway/
│ ├── dynamodb/
│ ├── eventbridge/
│ ├── iam/
│ ├── lambda/
│ ├── s3/
│ └── vpc/]
ディレクトリごとの役割
dev/・prod/
環境ごとの構成を分離します。
dev/:開発環境
prod/:本番環境
それぞれのディレクトリで main.tf などを用意し、models/ 配下の各モジュールを呼び出して構築します。これにより、同じインフラ構成を異なる環境で再利用可能になります。
models/
ここには再利用可能なモジュールを配置しています。各リソースはディレクトリ単位で分け、main.tf、variables.tf、outputs.tfで構成されます。
例:models/vpc/
# models/vpc/main.tf
resource "aws_vpc" "main" {
cidr_block = var.cidr_block
...
}
variables.tf
variable "cidr_block" {
description = "VPCのCIDRブロック"
type = string
}
outputs.tf
output "vpc_id" {
value = aws_vpc.main.id
}
このように、モジュールを細かく分けることで以下のメリットがあります:
コンポーネントごとの責務分離
他プロジェクトへの再利用性の向上
チーム開発における変更の影響範囲の限定
models/lambda/ の構成
Lambdaだけは少し特殊で、ソースコード(index.ts)や依存パッケージ(package.json)も含めています。Terraformから .zip をアップロードする形で管理するため、lambda_function.zip が含まれています。
この構成をとることで、インフラコードとLambda関数のコードを一元管理できます。
運用イメージ
terraform init
(各環境ディレクトリで)
terraform plan
(変更の確認)
terraform apply
(適用)
環境ごとに異なる terraform.tfvars や backend.tf を用意することで、ステートの分離や環境別パラメータの管理も可能です。
まとめ
Terraformプロジェクトをモジュールベースで構築することで、
環境ごとの分離
コードの再利用
可読性とメンテナンス性の向上
といった多くの利点があります。小規模なプロジェクトでもモジュール化の設計を取り入れておくことで、将来的なスケールに強い構成になります。