By now, you’ve learned how to build infrastructure with Terraform variables, modules, workspaces, provisioners, and more. But as your projects grow, the quality of your Terraform code becomes just as important as the resources it manages.
Poorly structured Terraform leads to:
- Fragile deployments
- State corruption
- Hard-to-maintain infrastructure
In this blog, we’ll cover best practices to keep your Terraform projects clean, scalable, and safe—along with common mistakes you should avoid.
Best Practices in Terraform
1. Organize Your Project Structure
Keep your files modular and organized:
terraform-project/
main.tf
variables.tf
outputs.tf
dev.tfvars
staging.tfvars
prod.tfvars
modules/
vpc/
s3/
ec2/
- main.tf → core resources
- variables.tf → inputs
- outputs.tf → outputs
- modules/ → reusable building blocks
✅ Makes it easier for teams to understand and collaborate.
2. Use Remote State with Locking
Always use remote backends (S3 + DynamoDB, Azure Storage, or Terraform Cloud).
This prevents:
- Multiple people overwriting state
- Lost state files when laptops die
✅ Ensures collaboration and consistency.
3. Use Variables & Outputs Effectively
- Don’t hardcode values → use
variables.tf
and.tfvars
- Expose important resource info (like DB endpoints) using
outputs.tf
✅ Makes your infrastructure reusable and portable.
4. Write Reusable Modules
- Put repeating logic into modules
- Source modules from the Terraform Registry when possible
- Version your custom modules in Git
✅ Saves time and avoids code duplication.
5. Tag Everything
Always tag your resources:
tags = {
Environment = terraform.workspace
Owner = "DevOps Team"
}
✅ Helps with cost tracking, compliance, and audits.
6. Use CI/CD for Terraform
Integrate Terraform with GitHub Actions, GitLab, or Jenkins:
- Run
terraform fmt
andterraform validate
on pull requests - Automate
plan
→ approval →apply
✅ Infrastructure changes get the same review process as application code.
7. Security First
- Never commit secrets into
.tfvars
or GitHub - Use Vault, AWS Secrets Manager, or Azure Key Vault
- Restrict who can
terraform apply
in production
✅ Protects your organization from accidental leaks.
Common Pitfalls (and How to Avoid Them)
❌ 1. Editing the State File Manually
Tempting, but dangerous.
- One wrong edit = corrupted state
- Instead, use commands like
terraform state mv
orterraform state rm
❌ 2. Mixing Environments in One State File
Don’t put dev, staging, and prod in the same state.
- Use workspaces or separate state backends
❌ 3. Overusing Provisioners
Provisioners are not meant for full configuration.
- Use cloud-init, Ansible, or Packer instead
❌ 4. Ignoring terraform fmt
and Validation
Unreadable code slows teams down.
- Always run:
terraform fmt
terraform validate
❌ 5. Not Pinning Provider Versions
If you don’t lock versions, updates may break things:
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
❌ 6. Ignoring Drift
Infrastructure can change outside Terraform (console clicks, APIs).
- Run
terraform plan
regularly - Use drift detection tools (Terraform Cloud, Atlantis)
Case Study: Large Enterprise Team
A global bank adopted Terraform but initially:
- Mixed prod and dev in one state file
- Used manual state edits
- Had no CI/CD for Terraform
This caused outages and state corruption.
After restructuring:
- Separate backends for each environment
- Introduced GitHub Actions for validation
- Locked provider versions
Result: Stable, auditable, and scalable infrastructure as code.
Key Takeaways
- Organize, modularize, and automate Terraform projects.
- Use remote state, workspaces, and CI/CD for team collaboration.
- Avoid pitfalls like manual state edits, provisioner overuse, and unpinned providers.
Terraform isn’t just about writing code, it’s about writing clean, safe, and maintainable infrastructure code.
What’s Next?
In this Series Blog 10, we’ll close the mastering beginner series with Terraform CI/CD Integration, automating plan
and apply
with GitHub Actions or GitLab CI for production-grade workflows.
Bibliography
- HashiCorp. Terraform Recommended Practices. Available at: https://developer.hashicorp.com/terraform/cloud-docs/recommended-practices
- HashiCorp. Managing State in Terraform. Available at: https://developer.hashicorp.com/terraform/language/state
- AWS. Infrastructure as Code Best Practices. Available at: https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/infrastructure-as-code.html
- Microsoft Azure. Terraform Best Practices on Azure. Available at: https://learn.microsoft.com/en-us/azure/developer/terraform/best-practices
- Google Cloud. Infrastructure Management with Terraform.