Modules: Building Reusable Infrastructure Components
Table of Contents
Introduction: The Copy-Paste Nightmare
What Are Terraform Modules?
The Simplest Module
Calling a Module
Module Structure
Why Modules Matter
1. DRY (Don't Repeat Yourself)
2. Abstraction
3. Reusability
4. Testing
5. Versioning
Module Basics
Module Components
Module Communication Flow
Creating Your First Module
Project Structure
Step 1: Create Module Directory
Step 2: Define Module Variables
Step 3: Create Module Resources
Step 4: Define Module Outputs
Step 5: Use the Module
Step 6: Apply
Module Inputs (Variables)
Input Best Practices
Module Outputs
Output Patterns
Calling Modules
Module Block Syntax
Accessing Module Outputs
Module Dependencies
Module Sources
1. Local Paths
2. Terraform Registry
3. GitHub
4. Generic Git
5. HTTP URLs
6. S3 Buckets
Module Composition
Simple Composition
Module Communication
Module Composition Diagram
Terraform Registry
Using Registry Modules
Finding Modules
Module Versioning
Module Best Practices
1. Single Responsibility
2. Clear Interfaces
3. Sensible Defaults
4. Avoid Hardcoding
5. Use Locals for Computed Values
6. Document Your Module
Inputs
Name
Type
Default
Description
Outputs
Name
Description
Real-World Example: Multi-Service Blog Platform
Project Structure
Service Module
Monitoring Module
Deployment Module
Root Module
Environment Configuration
Module Dependency Graph
Deploy
Module Versioning
Semantic Versioning for Modules
Creating Versions
Using Versioned Modules
Version Constraints
Testing Modules
Manual Testing
Automated Testing with Terratest
Publishing Your Module
Terraform Registry Requirements
Module Structure
README.md Template
Examples
Requirements
Name
Version
Inputs
Name
Type
Default
Required
Description
Outputs
Name
Description
License
Common Module Patterns
Pattern 1: Conditional Resource Creation
Pattern 2: Default Values with Merge
Pattern 3: Computed Resource Names
Pattern 4: Feature Flags
Pattern 5: Multi-Environment Configuration
What I Learned About Module Design
1. Start Simple, Refactor Later
2. Inputs Are Your API
3. Outputs Are Your Contract
4. Composition Over Complexity
5. Test in Isolation
Next Steps
Practice Exercises
Coming Up Next
PreviousMastering HCL: Terraform's Configuration LanguageNextState Management and Multi-Environment Workspaces
Last updated