Bilal Ahmad

~Engineers solve problems, I solve engineer's problems 🤘

Terraform Module Design

Practical guidance for inputs/outputs hygiene, versioning, composition, testing, and multi-env/tenant patterns.

Principles

Inputs/Outputs hygiene

// variables.tf
variable "service_name" {
  type        = string
  description = "Logical name for the service"
}

variable "replicas" {
  type        = number
  description = "Desired replica count"
  default     = 2
  validation {
    condition     = var.replicas >= 1 && var.replicas <= 20
    error_message = "replicas must be between 1 and 20."
  }
}

variable "db_password" {
  type        = string
  description = "Database password"
  sensitive   = true
}

// outputs.tf
output "service_url" {
  description = "Public URL for the service"
  value       = module.ingress.url
}

Versioning & constraints

// versions.tf
terraform {
  required_version = ">= 1.5, < 2.0"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

Composition & reuse

// stacks/prod/main.tf
module "network" {
  source = "../../modules/network"
  cidr_block = var.vpc_cidr
}

module "app" {
  source       = "../../modules/app"
  service_name = var.service_name
  subnet_ids   = module.network.private_subnet_ids
}

Testing & quality gates

Multi‑env / multi‑tenant strategies

infra/
  modules/
    network/
      main.tf
      variables.tf
      outputs.tf
      versions.tf
      README.md
      examples/
        simple/main.tf
    app/
      main.tf
      variables.tf
      outputs.tf
      versions.tf
      README.md
  stacks/
    prod/us-east-1/
      main.tf       # composes modules
      providers.tf
      backend.tf
      prod.tfvars
    staging/us-east-1/
      main.tf
      providers.tf
      backend.tf
      staging.tfvars
  tenants/
    acme/
      prod.tfvars
      staging.tfvars
    globex/
      prod.tfvars

Single‑module repository layout (publishable)

terraform-aws-myservice/
  modules/
    core/
      main.tf
      variables.tf
      outputs.tf
      versions.tf
      README.md
      examples/
        minimal/main.tf
        with_db/main.tf
  .tflint.hcl
  .github/workflows/ci.yml
  CHANGELOG.md

CI hints

back