Reputation: 3
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
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
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