{"record":{"id":"95ce50567c8a212d","repo":"kubernetes/kops","slug":"error-deleting-sqs-queue-q-w","errorCode":null,"errorMessage":"error deleting SQS queue %q: %w","messagePattern":"error deleting SQS queue %q: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/resources/aws/sqs.go","lineNumber":57,"sourceCode":"\treturn nil\n}\n\nfunc DeleteSQSQueue(cloud fi.Cloud, r *resources.Resource) error {\n\tctx := context.TODO()\n\tc := cloud.(awsup.AWSCloud)\n\n\turl := r.ID\n\n\tklog.V(2).Infof(\"Deleting SQS queue %q\", url)\n\trequest := &sqs.DeleteQueueInput{\n\t\tQueueUrl: &url,\n\t}\n\tif _, err := c.SQS().DeleteQueue(ctx, request); err != nil {\n\t\tif awsup.AWSErrorCode(err) == \"AWS.SimpleQueueService.NonExistentQueue\" {\n\t\t\t// Concurrently deleted\n\t\t\treturn nil\n\t\t}\n\t\treturn fmt.Errorf(\"error deleting SQS queue %q: %w\", url, err)\n\t}\n\treturn nil\n}\n\nfunc ListSQSQueues(cloud fi.Cloud, vpcID, clusterName string) ([]*resources.Resource, error) {\n\tc := cloud.(awsup.AWSCloud)\n\n\tklog.V(2).Infof(\"Listing SQS queues\")\n\tqueuePrefix := strings.ReplaceAll(clusterName, \".\", \"-\")\n\n\trequest := &sqs.ListQueuesInput{\n\t\tQueueNamePrefix: &queuePrefix,\n\t}\n\tresponse, err := c.SQS().ListQueues(context.TODO(), request)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error listing SQS queues: %v\", err)\n\t}\n\tif response == nil || len(response.QueueUrls) == 0 {","sourceCodeStart":39,"sourceCodeEnd":75,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/pkg/resources/aws/sqs.go#L39-L75","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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)."],"exampleFix":"// before\nreturn fmt.Errorf(\"error deleting SQS queue %q: %w\", url, err)\n// after\nvar aerr interface{ ErrorCode() string }\n_ = aerr\ncode := awsup.AWSErrorCode(err)\nif code == \"AWS.SimpleQueueService.NonExistentQueue\" {\n    return nil\n}\nreturn fmt.Errorf(\"error deleting SQS queue %q: %w\", url, err)","handlingStrategy":"try-catch","validationCode":"// verify queue exists and is deletable first\nattrs, err := sqsClient.GetQueueAttributes(ctx, &sqs.GetQueueAttributesInput{\n    QueueUrl: &url,\n    AttributeNames: []sqstypes.QueueAttributeName{\"QueueArn\"},\n})\nif err != nil { /* already gone or no permission */ }","typeGuard":"func isQueueGone(err error) bool {\n    return awsup.AWSErrorCode(err) == \"AWS.SimpleQueueService.NonExistentQueue\"\n}","tryCatchPattern":"_, err := sqsClient.DeleteQueue(ctx, req)\nif err != nil {\n    if isQueueGone(err) { return nil }\n    var gapiErr smithy.APIError\n    if errors.As(err, &gapiErr) && gapiErr.ErrorCode() == \"AccessDenied\" {\n        return fmt.Errorf(\"missing sqs:DeleteQueue for %s: %w\", url, err)\n    }\n    return err\n}","preventionTips":["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."],"tags":["aws","sqs","delete-queue","iam"],"backgroundTag":"aws-api-mutation-failed","analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T07:17:12.445Z"}