I started using Terraform in late 2014. You know, back when it felt like a promising prototype more than a polished tool. You learned the hard way then by lots of copy/paste and a few too many files and folders when you had to work on multiple environments. When Terragrunt showed up in 2016 it was a blessing. It added so many life-savers: module loops, clean remote state management, and zero annoying general repetition hell. Terragrunt saved hours, reduced mistakes, and let me keep moving instead of rewriting the same module
blocks for every environment.
Fast forward to today. HashiCorp just shipped Terraform 0.13 with a brand-new for_each
feature on modules plus an slowly-improving workspace functionality. But, that single feature (module loops) is the line in the sand for me.
Here there is s small example from the HashiCorp blog that shows how simple it is to use for_each
on modules:
# From hashicorp.com/en/blog/announcing-hashicorp-terraform-0-13
locals {
resources = {
eks-prod = "prod-eks"
eks-qa = "qa-eks"
eks-dev = "dev-eks"
}
}
module "my-cluster" {
source = "terraform-aws-modules/eks/aws"
for_each = local.resources
cluster_name = each.value
cluster_version = "1.17"
...
worker_groups = [
{
name = each.key
instance_type = var.instance_type
asg_max_size = 5
}
]
}
Let me be blunt here: everything Terragrunt gave me back in 2016 was a workaround for missing Terraform features. It was a pragmatic, useful workaround. But a workaround is still a workaround. For someone who’s been wrestling with Terraform since 2014, I’ve seen how Terragrunt became useful, peaked, and then became a nuisance.
Why I’m dropping Terragrunt
- No new capability, just convenience: Terragrunt never did anything Terraform couldn’t do. It automated patterns that Terraform lacked. Now Terraform itself does those patterns natively.
- Less stuff to debug: One less binary, one less config to reason about. Easier onboarding. And fewer surprises when something breaks.
- Cleaner repos: With
for_each
on modules and disciplined module design, I can keep environments DRY (Don’t Repeat Yourself) just like with Terragrunt.
If you’re using Terragrunt solely because Terraform couldn’t loop modules or because managing backend configs felt error-prone, it’s time to re-evaluate. Try moving a couple of small modules to native Terraform for_each
, use backends and workspaces properly, and you’ll see how Terragrunt is not needed anymore.
Terraform 0.13 is not just good for new, greenfield setups. It’s also good for cleaning up existing Terraform/Terragrunt projects. And, yes, not every project (especially very complex ones) will be worth the effort, but most setups that are just “hours away” from being a clean Terraform project will benefit massively: fewer layers, fewer surprises, more maintainable code.
Tools are temporary. Terragrunt was the right move in 2016 and it let me build cleaner systems faster. But today, I’m closing that chapter. I’m grateful for Terragrunt tho, it did vital work when Terraform was young. But now I’m going back again to plain Terraform.