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

  1. Exclude 'default' from any scripted workspace deletion loop.
  2. To remove default state, manually delete the underlying OSS state object after confirming no resources are tracked.
  3. 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

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


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)