Terraform Advanced — Monorepo vs Polyrepo Modules

less than 1 minute read

Should all modules live in one repo or each get their own?


Polyrepo (One Module per Repo)

github.com/org/terraform-aws-vpc      ← v2.1.0
github.com/org/terraform-aws-eks      ← v1.3.0
github.com/org/terraform-aws-rds      ← v3.0.0
Pros Cons
Independent versioning per module Many repos to manage
Terraform Registry compatible Cross-module changes need multiple PRs
Clear ownership per repo Harder to discover modules

Monorepo (All Modules in One Repo)

github.com/org/terraform-modules/
├── modules/
│   ├── vpc/
│   ├── eks/
│   └── rds/
└── README.md
# Reference a subdirectory
module "vpc" {
  source = "git::https://github.com/org/terraform-modules.git//modules/vpc?ref=v2.1.0"
}
Pros Cons
One repo to manage All modules share one version tag
Cross-module changes in one PR Can’t version modules independently
Easy to discover Not Registry compatible

Recommendation

Team Size Recommendation
1–5 engineers Monorepo — simplicity wins
5–20 engineers Monorepo with module-level tags
20+ engineers Polyrepo — independent teams need independent releases

What’s Next?

Learn the module wrapper pattern.

← Publishing to Registry Module Wrapper Pattern →

Updated: