hashicorp/terraform · error

Failed to load state

Error message

Failed to load state: %w

What it means

Thrown by getStateFromBackend() in show.go when stateStore.RefreshState() returns a non-nil error. StateMgr was constructed fine, but pulling the latest snapshot from persistent storage failed. Unlike [740], the backend is configured correctly; the failure is reading the actual state bytes (network I/O, decode, lock).

Solutions

  1. Retry the command once after a short delay (often transient for remote backends).
  2. Confirm no other Terraform run is holding the state lock; release with `terraform force-unlock <LOCK_ID>` only if you are certain.
  3. Inspect the wrapped error for provider-specific clues (NoSuchKey, 412 Precondition Failed, EOF) and address the storage object.
  4. For local state, verify the file is valid JSON: `terraform state list` against a backup, restore from `.terraform/terraform.tfstate` backup if corrupt.

Example fix

// before: locked by a dead run
 terraform show

// after
 terraform force-unlock <LOCK_ID>
 terraform show
Defensive patterns

Strategy: retry

Validate before calling

// Before refresh, confirm the backend object exists for remote backends.
// (Backend-specific; example for S3.)
if _, err := s3.HeadObject(&s3.HeadObjectInput{Bucket: &bucket, Key: &key}); err != nil {
    return fmt.Errorf("state object missing before refresh: %w", err)
}

Try / catch

var stateFile *statefile.File
var refreshErr error
for attempt := 1; attempt <= 3; attempt++ {
    stateFile, refreshErr = getStateFromBackend(b, workspace)
    if refreshErr == nil { break }
    if !isTransient(refreshErr) { break }
    time.Sleep(time.Duration(attempt) * time.Second)
}
if refreshErr != nil {
    return fmt.Errorf("state refresh failed after retries: %w", refreshErr)
}

Prevention

When it happens

Trigger: RefreshState() on the state manager errors: remote HTTP backend returns 5xx, state file on disk is corrupt JSON, S3 GET succeeds but the object is empty/garbled, DynamoDB lock can't be acquired, or state decryption key mismatches.

Common situations: Concurrent `terraform apply` holding the state lock; state file truncated by an interrupted write; client-side EOF reading a streaming backend; transient cloud provider outage mid-request; mismatched TF_ENCRYPTION state key.

Related errors


AI-assisted analysis of hashicorp/terraform@d32a084675 (2026-08-11). Data as JSON: /api/errors/b24a68b24f0b030e. Report an issue: GitHub.

Appendix: source

Thrown at internal/command/show.go:407

	var stateFile *statefile.File
	stateFile, err = statefile.Read(file)
	if err != nil {
		return nil, fmt.Errorf("Error reading %s as a statefile: %w", path, err)
	}
	return stateFile, nil
}

// getStateFromBackend returns the State for the current workspace, if available.
func getStateFromBackend(b backend.Backend, workspace string) (*statefile.File, error) {
	// Get the state store for the given workspace
	stateStore, sDiags := b.StateMgr(workspace)
	if sDiags.HasErrors() {
		return nil, fmt.Errorf("Failed to load state manager: %w", sDiags.Err())
	}

	// Refresh the state store with the latest state snapshot from persistent storage
	if err := stateStore.RefreshState(); err != nil {
		return nil, fmt.Errorf("Failed to load state: %w", err)
	}

	// Get the latest state snapshot and return it
	stateFile := statemgr.Export(stateStore)
	return stateFile, nil
}

View on GitHub (pinned to d32a084675)