hashicorp/terraform · warning
can't delete default state
Error message
can't delete default state
What it means
Thrown by DeleteWorkspace when the requested workspace name is the default workspace (or empty). Terraform backends protect the default state from deletion because it is the bootstrap state; deleting it would orphan all resources tracked only in default.
Solutions
- Exclude 'default' from any scripted workspace deletion loop.
- To remove default state, manually delete the underlying OSS state object after confirming no resources are tracked.
- Pass a non-default, non-empty workspace name to DeleteWorkspace.
Example fix
// before terraform workspace delete default // after # default is protected; delete a named workspace instead terraform workspace delete my-feature-env
Defensive patterns
Strategy: validation
Validate before calling
// Never call DeleteWorkspace with the default name.
const defaultWS = "default"
if name == defaultWS || name == "" {
return fmt.Errorf("refusing to delete protected workspace %q", name)
} Type guard
func isProtectedWorkspace(name string) bool {
return name == "" || name == "default"
} Prevention
- In workspace-cleanup scripts, always filter out 'default'.
- Document that default state is intentionally protected.
- Use a named workspace per branch/environment instead of repurposing default.
When it happens
Trigger: Calling 'terraform workspace delete default' (or any name resolving to backend.DefaultStateName / "") against the OSS backend. The backend refuses before attempting any remote operation.
Common situations: User误-runs 'terraform workspace delete default' or scripts that loop over workspaces deleting each without excluding default. Also scripts passing an empty string workspace name.
Related errors
- can't delete default state
- can't delete default state
- error deleting state
- error getting bucket
- can't delete default state
AI-assisted analysis of hashicorp/terraform@d32a084675 (2026-08-11).
Data as JSON: /api/errors/381ab1fa23ec3251.
Report an issue: GitHub.
Appendix: source
Thrown at internal/backend/remote-state/oss/backend_state.go:109
options = append(options, oss.Marker(lastObj))
}
resp, err = bucket.ListObjects(options...)
if err != nil {
return nil, diags.Append(err)
}
} else {
break
}
}
sort.Strings(result[1:])
return result, diags
}
func (b *Backend) DeleteWorkspace(name string, _ bool) tfdiags.Diagnostics {
var diags tfdiags.Diagnostics
if name == backend.DefaultStateName || name == "" {
return diags.Append(fmt.Errorf("can't delete default state"))
}
client, err := b.remoteClient(name)
if err != nil {
return diags.Append(err)
}
return diags.Append(client.Delete())
}
func (b *Backend) StateMgr(name string) (statemgr.Full, tfdiags.Diagnostics) {
var diags tfdiags.Diagnostics
client, err := b.remoteClient(name)
if err != nil {
return nil, diags.Append(err)
}
stateMgr := &remote.State{Client: client}
View on GitHub (pinned to d32a084675)