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

  1. Verify the SQS client region matches the queue URL's region.
  2. Grant sqs:DeleteQueue (and GetQueueAttributes) on the cluster queues in IAM.
  3. Retry on RequestThrottled with backoff.
  4. 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

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


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