Reusable Module Architecture
What are Modules?
A Terraform module is a set of Terraform configuration files in a single directory. Modules are the primary way to package and reuse resource configurations with Terraform. Even a simple setup with a single directory containing .tf files is technically a module (the “root module”).
Creating and Using Modules
You can encapsulate complex, standard infrastructure components into modules, abstracting away the low-level details.
Module Structure
A typical module structure includes:
main.tf: The primary resources.variables.tf: Input parameters.outputs.tf: Return values.
Calling a Module
To use a module, you define a module block in your root configuration and pass the required variables.
module "vpc" {
source = "./modules/vpc"
vpc_cidr = "10.0.0.0/16"
public_subnets_cidr = ["10.0.1.0/24", "10.0.2.0/24"]
private_subnets_cidr = ["10.0.3.0/24", "10.0.4.0/24"]
}Module Sources
Modules can be loaded from various sources:
- Local paths (
./modules/vpc) - Terraform Registry
- GitHub repositories (
git::https://github.com/example/terraform-aws-vpc.git?ref=v1.0.0) - HTTP URLs
Best Practices
- Single Responsibility: A module should do one thing well (e.g., create a VPC, not a VPC + Database + Web Servers).
- Versioning: Always pin module versions, especially when using external registries or Git repositories.
- Documentation: Document required and optional variables for your modules.