hashicorp/terraform · warning

can't delete default state

Error message

can't delete default state

What it means

A deliberate guard in Backend.DeleteWorkspace (backend_state.go:69-71). Terraform protects the default workspace (named 'default' or '') from deletion, because the default state blob (keyed directly by b.keyName, not the env: prefix) is the canonical state. Attempting to delete it is refused before any storage call.

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 c9def3e214)

Solutions

  1. Do not delete the default workspace — it is intentionally protected
  2. If you want a clean slate, switch to it and run 'terraform destroy' / 'terraform state rm' instead
  3. In automation, skip the default workspace when deleting workspaces

Example fix

# before: loop deletes every workspace including default
for ws in $(terraform workspace list | sed 's/*//'); do
  terraform workspace delete "$ws"
done

# after: skip the default workspace
for ws in $(terraform workspace list | sed 's/*//'); do
  [ "$ws" = "default" ] && continue
  terraform workspace delete "$ws"
done
Defensive patterns

Strategy: validation

Validate before calling

# Guard workspace-deletion automation against the protected default name
delete_workspace() {
  local ws="$1"
  [ "$ws" = "default" ] || [ -z "$ws" ] && { echo "skip: cannot delete default workspace"; return 0; }
  terraform workspace delete "$ws"
}

Prevention

When it happens

Trigger: Produced at backend_state.go:69-71 when DeleteWorkspace is called with name == backend.DefaultStateName ("default") or an empty string, e.g. 'terraform workspace delete default' or 'terraform workspace delete ""'.

Common situations: Running 'terraform workspace delete default' by mistake; a script that iterates over all workspace names and tries to delete each including 'default'.

Related errors


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