hashicorp/terraform · error
can't delete default state
Error message
can't delete default state
What it means
Returned by DeleteWorkspace when the requested name is the default workspace ("default") or empty. The default workspace holds the canonical state and cannot be removed via the workspace-delete API. This is a deliberate invariant, not a transient failure.
Solutions
- Skip the default workspace in any bulk-delete script (filter out "default").
- If you must start fresh, delete the state blob manually via Azure CLI / portal rather than via workspace delete.
- Use a non-default workspace name for ephemeral environments.
Example fix
// before for ws in $(terraform workspace list); do terraform workspace delete $ws; done // after for ws in $(terraform workspace list | grep -v default); do terraform workspace delete $ws; done
Defensive patterns
Strategy: validation
Validate before calling
// Validate workspace name before calling DeleteWorkspace.
func validateWorkspaceDeletable(name string) error {
if name == "" || name == backend.DefaultStateName {
return fmt.Errorf("can't delete default state")
}
return nil
} Prevention
- Filter 'default' out of any bulk workspace-delete script.
- Use ephemeral non-default workspaces for CI environments.
- If the goal is to reset state, delete the state blob via Azure CLI rather than workspace delete.
When it happens
Trigger: User runs `terraform workspace delete default` (or empty name), or a script enumerates and deletes all workspaces including the default.
Common situations: CI cleanup scripts that loop over `terraform workspace list` and call delete on each; user confusion about workspace lifecycle.
Related errors
- Couldn't create initial workspace: no name provided
- Error creating workspace
- Expected a workspace name as an argument, instead got an…
- failed to lock azure state
- Failed to select workspace: input not a valid number
AI-assisted analysis of hashicorp/terraform@d32a084675 (2026-08-11).
Data as JSON: /api/errors/b3d02a3bdf066ace.
Report an issue: GitHub.
Appendix: source
Thrown at internal/backend/remote-state/azure/backend_state.go:70
}
envs[name] = struct{}{}
}
}
result := []string{backend.DefaultStateName}
for name := range envs {
result = append(result, name)
}
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"))
}
ctx := newCtx()
client, err := b.apiClient.getBlobClient(ctx)
if err != nil {
return diags.Append(err)
}
if resp, err := client.Delete(ctx, b.containerName, b.path(name), blobs.DeleteInput{}); err != nil {
if !response.WasNotFound(resp.HttpResponse) {
return diags.Append(err)
}
}
return diags
}
func (b *Backend) StateMgr(name string) (statemgr.Full, tfdiags.Diagnostics) {View on GitHub (pinned to d32a084675)