Module Design: Achieving the Right Level of Abstraction

Discover how to strike the right abstraction balance in Terraform modules—boost reuse, trim complexity, and keep your infrastructure code maintainable.

Module-related questions account for 25% of code organization issues, with the primary challenge being determining appropriate boundaries.

The Problem

# Overly complex monolithic module
module "application" {
  source = "./modules/application"
  
  # Dozens of variables for every possible configuration
  environment         = var.environment
  instance_count      = var.instance_count
  instance_type       = var.instance_type
  database_engine     = var.database_engine
  database_size       = var.database_size
  load_balancer_type  = var.load_balancer_type
  # ... many more variables
}

The Solution

# Composable, focused modules
module "database" {
  source = "./modules/database"
  
  environment     = var.environment
  engine          = var.database_engine
  size            = var.database_size
}

module "compute" {
  source = "./modules/compute"
  
  environment    = var.environment
  instance_count = var.instance_count
  instance_type  = var.instance_type
}

module "load_balancer" {
  source = "./modules/load_balancer"
  
  environment = var.environment
  type        = var.load_balancer_type
  targets     = module.compute.instance_ids
}

Smaller, purpose-specific modules are easier to understand and maintain. Scalr's registry makes it simple to discover, publish, and version these modules across your organization.