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
- Check the wrapped Scaleway error type (scw response error status) for 403/404/unknown-zone details.
- Confirm the configured zone (cluster tags 'zone' or SCW profile default zone) matches where the server actually lives.
- Ensure the credentials/IAM policy allow reading servers (servers:read) in the project.
- 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
- Verify cluster tags' zone matches the servers' actual zone.
- Test credentials with a read-only Scaleway API call before destructive operations.
- Watch for out-of-band console deletions that leave kops state stale.
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
- failed to delete instance IP %s: %w
- error deleting group %q: %w
- deregistering cloud instance %s of group %q: %w
- DeleteGroup not implemented on azureCloud
- failed to delete %s: %w
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/a7085f79499c24b1.
Report an issue: GitHub.