Quick Answer
# Backend config changed — reinitialize
terraform init -reconfigure
# Backend config changed AND you want to keep existing state
terraform init -migrate-state
The Error
Error: Backend initialization required, please run "terraform init".
Reason: Initial configuration of the requested backend "s3"
The "backend" is the interface that Terraform uses to store state,
perform operations, etc. If this message is shown, no Terraform
operations should be performed until it is resolved.
Or:
Error: Backend configuration changed
A change in the backend configuration has been detected, which may
require migrating existing state.
What Causes This
- Backend config changed — switched from local to S3, or changed S3 bucket/key
- Never initialized — fresh clone, missing
.terraform/directory .terraform/deleted — cleaned cache, CI/CD fresh workspace- Backend partial config changed —
-backend-configflags differ from last init - Terraform version upgrade — new version needs re-initialization
Solution 1: Simple Init (First Time / Fresh Clone)
terraform init
This is enough for fresh clones and CI/CD runners.
Solution 2: Reconfigure (Discard Local State)
Use when you changed the backend and don’t need to migrate state:
terraform init -reconfigure
This resets the backend without migrating. Existing remote state is untouched; only the local .terraform/ config is updated.
Solution 3: Migrate State (Keep State)
Use when moving from one backend to another:
terraform init -migrate-state
Terraform prompts:
Do you want to copy existing state to the new backend?
Pre-existing state was found while migrating the previous "local" backend
to the newly configured "s3" backend.
Enter "yes" to copy and "no" to start with an empty state.
Common Migrations
Local → S3:
# Before: no backend block (uses local)
# After:
terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "prod/terraform.tfstate"
region = "us-east-1"
dynamodb_table = "terraform-locks"
encrypt = true
}
}
terraform init -migrate-state
# Answer "yes" to copy state
S3 → Terraform Cloud:
terraform {
cloud {
organization = "myorg"
workspaces { name = "myapp-prod" }
}
}
terraform init -migrate-state
Solution 4: Partial Backend Configuration
If you use -backend-config flags, they must be consistent:
# These must match every time
terraform init \
-backend-config="bucket=my-state-bucket" \
-backend-config="key=prod/terraform.tfstate" \
-backend-config="region=us-east-1"
Or use a backend config file:
# backend-prod.hcl
bucket = "my-state-bucket"
key = "prod/terraform.tfstate"
region = "us-east-1"
dynamodb_table = "terraform-locks"
terraform init -backend-config=backend-prod.hcl
Solution 5: Corrupted .terraform Directory
# Nuclear option — clean everything and reinitialize
rm -rf .terraform .terraform.lock.hcl
terraform init
CI/CD Pattern
# GitLab CI — always init with backend config
.terraform-init:
before_script:
- terraform init -backend-config=backends/${CI_ENVIRONMENT_NAME}.hcl -reconfigure
deploy-dev:
extends: .terraform-init
environment:
name: dev
script:
- terraform apply -auto-approve
deploy-prod:
extends: .terraform-init
environment:
name: production
script:
- terraform plan -out=plan.tfplan
- terraform apply plan.tfplan
Hands-On Courses
- Terraform for Beginners on CopyPasteLearn
- Terraform By Example — practical code examples
Conclusion
Backend initialization required means terraform init needs to run. Use -reconfigure when the backend changed and you don’t need state migration. Use -migrate-state when moving between backends and you want to keep your state. In CI/CD, always run terraform init with consistent -backend-config flags.