kubernetes/kops · error
error deleting SQS queue %q: %w
Error message
error deleting SQS queue %q: %w
What it means
DeleteSQSQueue in pkg/resources/aws/sqs.go calls SQS DeleteQueue for the cluster's queue URL and wraps failures with this message. AWS.SimpleQueueService.NonExistentQueue is explicitly treated as success (concurrent deletion); everything else — permissions, network, invalid URL — produces this error.
Source
Thrown at pkg/resources/aws/sqs.go:57
return nil
}
func DeleteSQSQueue(cloud fi.Cloud, r *resources.Resource) error {
ctx := context.TODO()
c := cloud.(awsup.AWSCloud)
url := r.ID
klog.V(2).Infof("Deleting SQS queue %q", url)
request := &sqs.DeleteQueueInput{
QueueUrl: &url,
}
if _, err := c.SQS().DeleteQueue(ctx, request); err != nil {
if awsup.AWSErrorCode(err) == "AWS.SimpleQueueService.NonExistentQueue" {
// Concurrently deleted
return nil
}
return fmt.Errorf("error deleting SQS queue %q: %w", url, err)
}
return nil
}
func ListSQSQueues(cloud fi.Cloud, vpcID, clusterName string) ([]*resources.Resource, error) {
c := cloud.(awsup.AWSCloud)
klog.V(2).Infof("Listing SQS queues")
queuePrefix := strings.ReplaceAll(clusterName, ".", "-")
request := &sqs.ListQueuesInput{
QueueNamePrefix: &queuePrefix,
}
response, err := c.SQS().ListQueues(context.TODO(), request)
if err != nil {
return nil, fmt.Errorf("error listing SQS queues: %v", err)
}
if response == nil || len(response.QueueUrls) == 0 {View on GitHub (pinned to 4c8573c808)
Solutions
- Verify the SQS client region matches the queue URL's region.
- Grant sqs:DeleteQueue (and GetQueueAttributes) on the cluster queues in IAM.
- Retry on RequestThrottled with backoff.
- Confirm the queue URL is intact (correct account/region, no truncation).
Example fix
// before
return fmt.Errorf("error deleting SQS queue %q: %w", url, err)
// after
var aerr interface{ ErrorCode() string }
_ = aerr
code := awsup.AWSErrorCode(err)
if code == "AWS.SimpleQueueService.NonExistentQueue" {
return nil
}
return fmt.Errorf("error deleting SQS queue %q: %w", url, err) Defensive patterns
Strategy: try-catch
Validate before calling
// verify queue exists and is deletable first
attrs, err := sqsClient.GetQueueAttributes(ctx, &sqs.GetQueueAttributesInput{
QueueUrl: &url,
AttributeNames: []sqstypes.QueueAttributeName{"QueueArn"},
})
if err != nil { /* already gone or no permission */ } Type guard
func isQueueGone(err error) bool {
return awsup.AWSErrorCode(err) == "AWS.SimpleQueueService.NonExistentQueue"
} Try / catch
_, err := sqsClient.DeleteQueue(ctx, req)
if err != nil {
if isQueueGone(err) { return nil }
var gapiErr smithy.APIError
if errors.As(err, &gapiErr) && gapiErr.ErrorCode() == "AccessDenied" {
return fmt.Errorf("missing sqs:DeleteQueue for %s: %w", url, err)
}
return err
} Prevention
- Ensure the SQS client region matches each queue URL's region.
- Grant sqs:DeleteQueue on cluster-prefixed queues in IAM.
- Treat NonExistentQueue as success for idempotent deletion.
- Back off on RequestThrottled instead of failing the run.
When it happens
Trigger: SQS DeleteQueue returning errors other than NonExistentQueue: AccessDenied (sqs:DeleteQueue not granted on the queue), QueueDeletedRecently (60-second recreate cooldown irrelevant to delete but some proxies map oddly), InvalidAddress (malformed queue URL), RequestThrottled, or network errors.
Common situations: Queue already deleted by another kops run but a different error code surfaced; IAM scoped to specific queue ARNs missing the one being deleted; queue URL from a different region than the client (InvalidAddress); account-level SQS throttling.
Related errors
- rendering policy as json: %w
- error listing SQS queues: %v
- IP version is incorrect
- provider ID cannot be empty
- provider ID number cannot be empty
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/95ce50567c8a212d.
Report an issue: GitHub.