Day 7 of my Terraform journey focused on one of the most practical Infrastructure as Code questions: how do you separate environments like dev, staging, and production without letting them interfere with each other?
Terraform gives two main answers:
- workspaces
- file layouts
I implemented both, compared both, and came away with a clearer opinion about when each one makes sense.
Why State Isolation Matters
Terraform state is the record of what Terraform manages. If environments share state carelessly, one mistake can affect the wrong infrastructure.
That is why environment isolation matters.
You want:
-
devchanges to stay indev -
productionchanges to stay inproduction - less risk of accidental overlap
Option 1: Terraform Workspaces
Workspaces let you use:
- the same Terraform code
- the same backend
- different state files
That means one folder can manage multiple environments.
In my lab, I used terraform.workspace to change behavior based on the active workspace. For example, the instance name and instance type changed depending on whether I selected dev, staging, or production.
What I liked about workspaces:
- fast to set up
- less folder duplication
- good for similar environments
- easy to switch with
terraform workspace select
What I did not like:
- the code is still shared completely
- it is easy to forget which workspace is active
- you can accidentally apply changes to the wrong environment
- the environment boundary feels less obvious
That last point matters a lot. The state is isolated, but the code entry point is still the same. For a beginner or a busy team, that can be risky.
Option 2: File Layout Isolation
File layout isolation uses separate directories per environment, each with its own backend configuration and state path.
Example:
environments/devenvironments/stagingenvironments/production
Each folder has its own:
main.tfvariables.tfoutputs.tfbackend.tf
What I liked about file layouts:
- each environment is explicit
- it is harder to accidentally deploy to the wrong environment
- the backend key clearly shows which state belongs to which folder
- it feels safer and easier to reason about
What I did not like:
- more directories to manage
- repeated backend configuration
- more setup overhead
- changes may need to be repeated across folders unless you reduce duplication with modules
So file layouts add friction, but they also add clarity.
Where Workspaces Fall Short
After using them, I think workspaces are convenient, but they fall short in a few important ways:
- they isolate state, but not code
- it is easy to apply in the wrong workspace by mistake
- the environment boundary is not obvious from the folder structure
- they feel better for lightweight environment copies than for strong production separation
In other words, workspaces are good at convenience, but weaker at safety.
Where File Layouts Fall Short
File layouts are stronger, but not perfect.
Their main downsides are:
- more folder management
- more boilerplate
- more repeated backend setup
- more structure to maintain
So file layouts are not as quick or lightweight as workspaces.
Using Remote State Across Layouts
I also used terraform_remote_state to let one configuration read outputs from another.
In my lab:
-
devexposed outputs likevpc_idandsubnet_id -
productionread those outputs from thedevstate file
That was useful because it showed how separate configurations can still share selected values safely.
At the same time, it also taught me an operational lesson: once one configuration depends on another, destroy order matters. If the source state disappears first, cleanup gets harder.
My Recommendation
My honest opinion after doing both is this:
- use workspaces for simple labs, experiments, and very similar environments
- use file layouts for production-style environments where clarity and safety matter more
If I were working on real dev, staging, and production infrastructure for a team, I would choose file layouts.
Why?
Because they make the environment boundary more obvious in:
- the folder structure
- the backend configuration
- the state path
- the operatorβs mental model
That extra clarity is worth the extra setup.
Final Thoughts
Day 7 made one thing very clear to me: environment isolation is not just about keeping things tidy. It is about reducing risk.
Workspaces are faster.
File layouts are safer.
That is the tradeoff.
For my own learning and for real-world team use, I would treat workspaces as a convenience tool and file layouts as the stronger default for production-style separation.
Full code and README notes:
π Github LInk
Follow My Journey
This is Day 7 of my 30-Day Terraform Challenge.
See you on Day 8 π
Top comments (0)