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

  1. Skip the default workspace in any bulk-delete script (filter out "default").
  2. If you must start fresh, delete the state blob manually via Azure CLI / portal rather than via workspace delete.
  3. 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

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


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)