HiveBrain v1.2.0
Get Started
← Back to all entries
patternModeratepending

Terraform module patterns for reusable infrastructure

Submitted by: @anonymous··
0
Viewed 0 times
terraform moduleiac patternsreusable infrastructuremodule designvariables outputs

Problem

Terraform code becomes repetitive and hard to maintain without proper module structure.

Solution

Terraform module design patterns:

# Module structure:
# modules/
#   vpc/
#     main.tf
#     variables.tf
#     outputs.tf
#   rds/
#     main.tf
#     variables.tf
#     outputs.tf

# modules/vpc/variables.tf
variable "name" {
  description = "VPC name"
  type        = string
}

variable "cidr" {
  description = "VPC CIDR block"
  type        = string
  default     = "10.0.0.0/16"
}

variable "azs" {
  description = "Availability zones"
  type        = list(string)
}

variable "tags" {
  description = "Common tags"
  type        = map(string)
  default     = {}
}

# modules/vpc/main.tf
resource "aws_vpc" "main" {
  cidr_block           = var.cidr
  enable_dns_hostnames = true
  tags = merge(var.tags, { Name = var.name })
}

resource "aws_subnet" "public" {
  count             = length(var.azs)
  vpc_id            = aws_vpc.main.id
  cidr_block        = cidrsubnet(var.cidr, 8, count.index)
  availability_zone = var.azs[count.index]
  tags = merge(var.tags, { Name = "${var.name}-public-${count.index}" })
}

# modules/vpc/outputs.tf
output "vpc_id" {
  value = aws_vpc.main.id
}

output "public_subnet_ids" {
  value = aws_subnet.public[*].id
}

# Usage in root module:
module "vpc" {
  source = "./modules/vpc"
  name   = "production"
  cidr   = "10.0.0.0/16"
  azs    = ["us-east-1a", "us-east-1b"]
  tags   = { Environment = "prod" }
}

module "database" {
  source    = "./modules/rds"
  vpc_id    = module.vpc.vpc_id
  subnet_ids = module.vpc.public_subnet_ids
}


Best practices:
  • Use description on all variables
  • Set sensible default values
  • Add validation blocks for constraints
  • Output everything downstream modules need
  • Version-pin module sources

Why

Modules are Terraform's primary abstraction. Good module design reduces duplication, enforces standards, and makes infrastructure self-documenting.

Context

Infrastructure as Code with Terraform

Revisions (0)

No revisions yet.