Eesha
Eesha

Reputation: 3

Delete message from SQS DLQ

How to delete a message whose MessageId is known from a SQS DLQ which is having around 10k messsages?

I tried to do it using lambda function but the max messages that can be received using that are only 10.

What are the best ways to do this?

Upvotes: 0

Views: 2110

Answers (2)

vumdao
vumdao

Reputation: 621

Another way of using python script

#!/usr/bin/env python
import boto3


def delete_msg_id(queue_url, message_id):
    """Delete message based on message ID

    :param queue_url: URL of the SQS queue to read.
    :param message_id: message id to be deleted
    """
    sqs_client = boto3.client("sqs")

    while True:
        resp = sqs_client.receive_message(
            QueueUrl=queue_url, AttributeNames=["All"], MaxNumberOfMessages=10, WaitTimeSeconds=1
        )

        for msg in resp["Messages"]:
            try:
                if msg["MessageId"] == message_id:
                    sqs_client.delete_mesage(QueueUrl=queue_url, ReceiptHandle=msg["ReceiptHandle"])
            except KeyError:
                print('failed')
                continue


if __name__ == '__main__':
    delete_msg_id('my_sqs_url', 'my_msg_id')

Ref to Moving Big Number Of Messages Between SQS Queues

Upvotes: 0

Cássio Lacerda
Cássio Lacerda

Reputation: 1634

It seems your question is for just one message, but in any case, you can use deleteMessageBatch method. In a node server, you would have this:

const AWS = require("aws-sdk");

const messageIds = ["1", "2", "3"];

const removeNotificationFromQueueData = messageIds.map((id) => {
  return {
    ReceiptHandle: id,
    Id: id,
  };
});

const sqs = new AWS.SQS();

sqs
  .deleteMessageBatch({
    QueueUrl: "http://myQueueUrlEndpoint",
    Entries: removeNotificationFromQueueData,
  })
  .promise();

Upvotes: 1

Related Questions