patternModeratepending
Terraform module patterns for reusable infrastructure
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:
Best practices:
# 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
descriptionon all variables - Set sensible
defaultvalues - Add
validationblocks 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.