Modules and Reusable Infrastructure
Extract a working configuration into a reusable Terraform module with typed variables, validated inputs, and outputs, then compose it across two environments with different input values.
A module is just a directory of .tf files that other configurations can call as a unit, parameterized by input variables and exposing outputs — every Terraform configuration you've written so far has technically been the implicit "root module." The value of factoring reusable pieces into their own named modules is the same as factoring code into functions: you write the S3-bucket-with-sane-defaults pattern once, then call it from a dev environment and a prod environment with different inputs, instead of copy-pasting the resource blocks and quietly letting them drift apart over time.
You'll build a small S3-bucket module with typed variables, validation rules, and useful outputs, then call it twice — once for a dev environment, once for prod — with different configurations, demonstrating the core pattern behind almost every real Terraform codebase's structure.
Step 1 — Structure a module directory
Step 2 — Write the module's resources and outputs
Step 3 — Call the module from two environments
Step 4 — Explore a public registry module
Secret Mission: add a for_each-driven multi-bucket module call
Before You Go
Test what you just learned
Self-testing is one of the best ways to retain new skills. Unlock project quizzes to check your understanding.
Log in to unlock0 / 7 complete
