Skip to main content

State Locking

Imagine two builders working on the same Lego city at once. One is adding a hospital, while the other is demolishing a park. Without coordination, they might collide and break into pieces or leaving the city half‑built. In Terraform, this collision risk happens when multiple people or systems run terraform apply at the same time.

State locking is the safety mechanism that prevents such conflicts. It ensures only one operation modifies the state at a time, keeping your infrastructure consistent and reliable.


What is State Locking?

  • A mechanism that prevents multiple concurrent operations on the same state file.
  • Ensures only one apply or plan runs at a time.
  • Protects against race conditions and state corruption.

Locking Implementation

  • Local State: No locking means risk of corruption if multiple applies happen.
  • Remote State: Many backends support locking.
    • AWS: DynamoDB table for locks.
    • GCP: GCS supports object versioning (soft locking).
    • Azure: Blob Storage with lease mechanism.

Example Scenario

  • Engineer A runs terraform apply to add a new EC2 instance.
  • Engineer B runs terraform destroy at the same time.
  • Without locking: State file may be corrupted, infra may be inconsistent.
  • With locking: Engineer B’s command waits until Engineer A’s operation finishes.

Hands‑On Lab / Demo

Lab: State Locking with AWS S3 + DynamoDB

  • Test Locking:
    • Run terraform apply in one terminal.
    • Run terraform plan in another.
    • Observe: Second command waits or fails with a lock message.
  • Configure Backend in Terraform:
terraform {
  backend "s3" {
    bucket         = "my-terraform-state-123"
    key            = "prod/app/terraform.tfstate"
    region         = "us-east-1"
    dynamodb_table = "terraform-locks"
    encrypt        = true
  }
}
  • Create DynamoDB Table for Locking:
aws dynamodb create-table \
  --table-name terraform-locks \
  --attribute-definitions AttributeName=LockID,AttributeType=S \
  --key-schema AttributeName=LockID,KeyType=HASH \
  --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \
  --region us-east-1

Pro Tips & Best Practices

  • Always enable locking in team environments.
  • Use DynamoDB (AWS), Blob leases (Azure), or GCS versioning for safe collaboration.
  • Monitor lock tables/logs to detect stuck locks.
  • If a lock persists due to a crash, use terraform force-unlock <LOCK_ID> cautiously.
  • Document backend + locking setup for your team.

Summary & Cheatsheet

  • State Locking = Prevents concurrent writes.
  • Local State: No locking.
  • Remote State: Supports locking via backend mechanisms.
  • Command: terraform force-unlock (last resort).
Quick mnemonic: Lock = Protect, Prevent, Preserve

The Hackers Notebook

State locking is the seatbelt of Terraform operations. It prevents collisions, corruption, and chaos when multiple engineers or pipelines interact with the same state. By enabling locking, you ensure your infrastructure changes are safe, predictable, and team‑friendly.


Tips, Tricks, Roadmaps, Resources, Networking, Motivation, Guidance, and Cool Stuff ♥

Updated on Dec 31, 2025