Terraform_state
Chapter 36: Terraform State
Section titled βChapter 36: Terraform StateβThis chapter covers Terraform state management, remote backends, and state best practices.
What is Terraform State?
Section titled βWhat is Terraform State?βTerraform uses state to map your configuration to real-world resources.
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ Terraform State Purpose ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€β ββ βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ β Terraform State β ββ β β ββ β Configuration Real World State β ββ β βββββββββββββ βββββββββββββ βββββββββββββ β ββ β βaws_vpc.mainβ βββββΆ β VPC β βββββΆ β vpc-id β β ββ β β cidr=10.0 β β 10.0.0.0/16β β cidr=10.0 β β ββ β βββββββββββββ βββββββββββββ βββββββββββββ β ββ β β ββ βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ ββ State Functions: ββ β Track resource ownership ββ β Detect changes between config and reality ββ β Improve performance (caches attribute values) ββ β Collaborate across teams ββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββLocal State
Section titled βLocal StateβBy default, Terraform stores state in a local file:
# Default locationterraform.tfstate
# View stateterraform show
# List resources in stateterraform state list
# Show specific resourceterraform state show aws_instance.webββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ Local State Storage ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€β ββ Working Directory ββ βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ β β ββ β main.tf β ββ β variables.tf β ββ β outputs.tf β ββ β terraform.tfstate βββ Local state file β ββ β terraform.tfstate.backup βββ Backup file β ββ β β ββ βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ ββ Pros: Simple, no additional setup ββ Cons: Not shared, risk of data loss, conflicts in teams ββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββState File Format
Section titled βState File Formatβ{ "version": 4, "terraform_version": "1.6.0", "serial": 1, "lineage": "a1b2c3d4-...", "outputs": {}, "resources": [ { "mode": "managed", "type": "aws_vpc", "name": "main", "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]", "instances": [ { "attributes": { "id": "vpc-0abc123", "cidr_block": "10.0.0.0/16", "enable_dns_hostnames": true, "tags": { "Name": "main-vpc" } } } ] } ]}Remote Backends
Section titled βRemote BackendsβRemote backends store state in a shared location, enabling team collaboration.
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ Remote Backend Types ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€β ββ βββββββββββββββ βββββββββββββββ βββββββββββββββ βββββββββββββββ ββ β S3 β β Azure β β GCS β β Terraform β ββ β (AWS) β β (Azure) β β (GCP) β β Cloud β ββ βββββββββββββββ βββββββββββββββ βββββββββββββββ βββββββββββββββ ββ ββ βββββββββββββββ βββββββββββββββ βββββββββββββββ ββ β Consul β β etcd β β PostgreSQL β ββ βββββββββββββββ βββββββββββββββ βββββββββββββββ ββ ββ Key features to consider: ββ β State locking - prevents concurrent modifications ββ β Encryption at rest - security for sensitive data ββ β Versioning - state file history ββ β Accessibility - team access controls ββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββS3 Backend Configuration
Section titled βS3 Backend Configurationβterraform { backend "s3" { bucket = "my-terraform-state" key = "prod/networking/terraform.tfstate" region = "us-east-1" encrypt = true dynamodb_table = "terraform-locks" }}ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ S3 Backend with DynamoDB ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€β ββ βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ β S3 + DynamoDB Backend β ββ β β ββ β βββββββββββββββββ DynamoDB Table β ββ β β β βββββββββββββββββ β ββ β β S3 βββββββββββββββββββββββββ LockID β β ββ β β Bucket β State Files β Digest β β ββ β β (encrypted) β β LockExpires β β ββ β β β βββββββββββββββββ β ββ β βββββββββββββββββ β β ββ β β β β ββ β β State locking β β ββ ββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ β ββ βΌ ββ ββββββββββββββββββββββββ ββ β Terraform CLI β ββ ββββββββββββββββββββββββ ββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββCreating DynamoDB Table for Locking
Section titled βCreating DynamoDB Table for Lockingβ# Create DynamoDB table for state lockingaws dynamodb create-table \ --table-name terraform-locks \ --attribute-definitions AttributeName=LockID,AttributeType=S \ --key-schema AttributeName=LockID,KeyType=HASH \ --billing-mode PAY_PER_REQUEST \ --region us-east-1Azure Backend
Section titled βAzure Backendβterraform { backend "azurerm" { resource_group_name = "terraform-state" storage_account_name = "terraformstate123" container_name = "tfstate" key = "prod.terraform.tfstate" }}GCS Backend (Google Cloud)
Section titled βGCS Backend (Google Cloud)βterraform { backend "gcs" { bucket = "my-terraform-state" prefix = "prod/networking" }}Terraform Cloud Backend
Section titled βTerraform Cloud Backendβterraform { backend "remote" { organization = "my-org"
workspaces { name = "prod-networking" # or prefix = "prod-" } }}State Management Commands
Section titled βState Management Commandsβ# Pull state (download to local)terraform state pull > terraform.tfstate
# Push state (upload local to backend)terraform state push terraform.tfstate
# List resourcesterraform state list
# Show resource detailsterraform state show aws_instance.web
# Rename resourceterraform state mv aws_instance.web aws_instance.app
# Remove resource from state (without destroying)terraform state rm aws_instance.old
# Move state to new resource (when replacing)terraform state mv aws_instance.old aws_instance.new
# Backup state before modificationsterraform state backup backup.tfstateState Locking
Section titled βState LockingβState locking prevents concurrent modifications:
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ State Locking Mechanism ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€β ββ User A: terraform apply ββ βββββββββββββββββββ ββ β Acquire Lock ββββββββββββββββββ ββ βββββββββββββββββββ β ββ βΌ ββ βββββββββββββββ ββ β DynamoDB/ β ββ β Consul/ etcd β ββ β Lock β ββ βββββββββββββββ ββ β ββ User B: terraform apply β ββ βββββββββββββββββββ β ββ β Wait... ββββββββββββββββββ ββ βββββββββββββββββββ β ββ β ββ User A: completes βΌ ββ βββββββββββββββββββ βββββββββββββββ ββ β Release Lock βββββββΆβ Unlock β ββ βββββββββββββββββββ βββββββββββββββ ββ ββ Error without locking: ββ Error: Error acquiring the state lock ββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββState Security
Section titled βState Securityβββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ State Security Best Practices ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€β ββ 1. Encryption at Rest ββ β S3: Enable server-side encryption ββ β Azure: Enable Storage Account encryption ββ β GCS: Enable default encryption ββ ββ 2. Access Control ββ β Use IAM policies to restrict access ββ β Principle of least privilege ββ β Enable versioning for audit trail ββ ββ 3. Sensitive Data ββ β Use -var for sensitive values ββ β Use sensitive variables in outputs ββ β Consider using Vault for secrets ββ ββ 4. State Files Contain: ββ β Resource IDs ββ β Configuration values ββ β Potentially: secrets passed as variables ββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββWorkspace Management
Section titled βWorkspace ManagementβWorkspaces allow you to manage multiple environments from the same configuration:
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ Terraform Workspaces ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€β ββ βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ β Workspace Structure β ββ β β ββ β terraform.workspace β ββ β βββββββββββββββ βββββββββββββββ βββββββββββββββ β ββ β β default β β staging β β prod β β ββ β βββββββββββββββ βββββββββββββββ βββββββββββββββ β ββ β β ββ β Each workspace = separate state file β ββ β ββ s3://bucket/staging/terraform.tfstate β ββ β ββ s3://bucket/prod/terraform.tfstate β ββ β β ββ βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ ββ Use cases: ββ β Multiple environments (dev, staging, prod) ββ β Feature branches ββ β Isolated infrastructure ββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββWorkspace Commands
Section titled βWorkspace Commandsβ# List workspacesterraform workspace list
# Create workspaceterraform workspace new staging
# Select workspaceterraform workspace select staging
# Show current workspaceterraform workspace show
# Delete workspace (must be non-current)terraform workspace delete staging
# Workspace in configurationresource "aws_instance" "web" { ami = "ami-0c55b159cbfafe1f0"
# Use workspace in resource naming tags = { Name = "web-${terraform.workspace}" }
# Conditional based on workspace count = terraform.workspace == "prod" ? 3 : 1}Importing Existing Resources
Section titled βImporting Existing Resourcesβ# Import existing AWS VPC into Terraform stateterraform import aws_vpc.main vpc-0abc123
# Import into specific moduleterraform import module.vpc.aws_vpc.main vpc-0abc123
# Import into workspaceterraform workspace select staging && terraform import aws_vpc.main vpc-0abc123Import Block
Section titled βImport Blockβ# In Terraform 1.5+import { to = aws_vpc.main id = "vpc-0abc123def456"}Summary
Section titled βSummaryβIn this chapter, you learned:
- What is State: How Terraform tracks resources
- Local State: Default file-based storage
- Remote Backends: S3, Azure, GCS, Terraform Cloud
- State Locking: Preventing concurrent modifications
- State Security: Encryption, access control
- Workspaces: Managing multiple environments
- Import: Bringing existing resources under Terraform management