kubernetes/kops · error

deleting cloud instance %s of group %s: %w

Error message

deleting cloud instance %s of group %s: %w

What it means

DeleteInstance first calls instanceAPI.GetServer then DeleteServer via the Scaleway instance API. A 404 is treated as success (already deleted); any other error from the GetServer call is wrapped as "deleting cloud instance %s of group %s: %w". This error means the instance could not even be looked up before deletion.

Source

Thrown at upup/pkg/fi/cloudup/scaleway/cloud.go:243

		err := s.DeleteInstance(cloudInstance)
		if err != nil {
			return fmt.Errorf("error deleting group %q: %w", group.HumanName, err)
		}
	}
	return nil
}

func (s *scwCloudImplementation) DeleteInstance(i *cloudinstances.CloudInstance) error {
	server, err := s.instanceAPI.GetServer(&instance.GetServerRequest{
		Zone:     s.zone,
		ServerID: i.ID,
	})
	if err != nil {
		if is404Error(err) {
			klog.V(4).Infof("error deleting cloud instance %s of group %s : instance was already deleted", i.ID, i.CloudInstanceGroup.HumanName)
			return nil
		}
		return fmt.Errorf("deleting cloud instance %s of group %s: %w", i.ID, i.CloudInstanceGroup.HumanName, err)
	}

	err = s.DeleteServer(server.Server)
	if err != nil {
		return fmt.Errorf("deleting cloud instance %s of group %s: %w", i.ID, i.CloudInstanceGroup.HumanName, err)
	}

	return nil
}

func (s *scwCloudImplementation) DeregisterInstance(i *cloudinstances.CloudInstance) error {
	server, err := s.instanceAPI.GetServer(&instance.GetServerRequest{
		Zone:     s.zone,
		ServerID: i.ID,
	})
	if err != nil {
		return fmt.Errorf("deregistering cloud instance %s of group %q: %w", i.ID, i.CloudInstanceGroup.HumanName, err)
	}

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Check the wrapped Scaleway error type (scw response error status) for 403/404/unknown-zone details.
  2. Confirm the configured zone (cluster tags 'zone' or SCW profile default zone) matches where the server actually lives.
  3. Ensure the credentials/IAM policy allow reading servers (servers:read) in the project.
  4. If the server was already deleted elsewhere, nothing is needed — verify the ID is correct and retry.

Example fix

// before: zone mismatch
zone = scw.Zone("nl-ams-1") // server is in fr-par-1
// after
zone = scw.Zone("fr-par-1")
Defensive patterns

Strategy: try-catch

Try / catch

err := cloud.DeleteInstance(inst)
if err != nil {
  var respErr *scw.ResponseError
  if errors.As(err, &respErr) {
    switch respErr.StatusCode {
    case 403:
      klog.Errorf("permission denied deleting %s — check IAM servers:delete", inst.ID)
    case 404:
      klog.Infof("instance %s already deleted", inst.ID)
    default:
      klog.Errorf("delete failed for %s: %v", inst.ID, err)
    }
  }
  return err
}

Prevention

When it happens

Trigger: instanceAPI.GetServer(&instance.GetServerRequest{Zone: s.zone, ServerID: i.ID}) fails with a non-404 error: invalid/expired credentials, wrong zone configured, server ID not a UUID, permission denied, or transient API/network failure.

Common situations: Cluster tags specify a zone different from the zone in the Scaleway profile; stale instance-group state referencing a server removed out-of-band in another zone; IAM key without servers:read scope; Scaleway API outage.

Related errors


AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05). Data as JSON: /api/errors/a7085f79499c24b1. Report an issue: GitHub.