Terraform State
terraform-learning Hands-on Terraform configs, modules, and practice projects on GitHub.Terraform State
Terraform State is how Terraform keeps track of the infrastructure it manages.
By default, Terraform stores state in:
terraform.tfstate
1. Why Does Terraform Need State?
Suppose we write:
resource "aws_instance" "backend" {
ami = "ami-123456"
instance_type = "t3.micro"
}
Then run:
terraform apply
AWS creates:
EC2 Instance
ID: i-0123456789
Terraform needs to remember:
aws_instance.backend
│
│ maps to
▼
i-0123456789
That mapping is stored in the state file.
Terraform Code
│
▼
Terraform State
│
▼
Actual AWS Resource
aws_instance.backend
│
▼
i-0123456789
2. How Terraform Uses State
Suppose the current configuration is:
instance_type = "t3.micro"
And the state knows the existing EC2 instance.
Now we change:
instance_type = "t3.small"
When we run:
terraform plan
Terraform compares:
Desired Configuration
│
│
▼
Terraform State
│
│
▼
Actual Infrastructure
Then Terraform determines:
Current:
t3.micro
Desired:
t3.small
↓
Update required
This is how Terraform knows what needs to be created, updated, or deleted.
3. Important State Commands
View the current state:
terraform show
List resources tracked by Terraform:
terraform state list
Example:
aws_vpc.main
aws_subnet.public
aws_instance.backend
aws_s3_bucket.uploads
Inspect one resource:
terraform state show aws_instance.backend
4. Don’t Manually Edit terraform.tfstate
Avoid opening the state file and manually changing values.
Use Terraform commands instead.
❌ Manually modify terraform.tfstate
✅ Use Terraform commands
The state contains important mappings between Terraform resources and real infrastructure.
5. State Locking
Two developers should not modify the same state simultaneously.
Without locking:
Developer A ──┐
├──→ Same State
Developer B ──┘
⚠ Conflict
State locking prevents concurrent Terraform operations from corrupting or conflicting with state.
Conceptually:
Developer A
│
▼
Acquire Lock
│
▼
terraform apply
│
▼
Update State
│
▼
Release Lock
Modern Terraform S3 backends can support S3-based locking with:
use_lockfile = true
Example:
terraform {
backend "s3" {
bucket = "taskify-terraform-state"
key = "production/terraform.tfstate"
region = "ap-south-1"
use_lockfile = true
}
}