aws sqs to read and write to a queue

 To create a cloud formation sqs, we can use the following code

AWSTemplateFormatVersion: '2010-09-09'
Description: 'Creates SQS Queue with specific User Access'

Parameters:
  AccountId:
    Type: String
    Description: Your 12-digit AWS Account ID
    Default: '00000000'
  UserName:
    Type: String
    Description: IAM User to grant access
    Default: 'jeremydev'

Resources:
  MySQSQueue:
    Type: AWS::SQS::Queue
    Properties:
      QueueName: mytestsqs1
      VisibilityTimeout: 300

  MySQSQueuePolicy:
    Type: AWS::SQS::QueuePolicy
    Properties:
      Queues:
        - !Ref MySQSQueue
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Sid: AllowSpecificUser
            Effect: Allow
            Principal:
              AWS:
                - !Sub 'arn:aws:iam::${AccountId}:root'
                - !Sub 'arn:aws:iam::${AccountId}:user/${UserName}'
            Action: 'sqs:*'
            Resource: !GetAtt MySQSQueue.Arn

Outputs:
  QueueARN:
    Description: The ARN of the created SQS Queue
    Value: !GetAtt MySQSQueue.Arn
  QueueName:
    Description: The Name of the created SQS Queue
    Value: !GetAtt MySQSQueue.QueueName


As for the code to read and write to the queue, you can use the following code:

using Amazon;
using Amazon.SQS;
using Amazon.SQS.Model;
using System;
using System.Threading.Tasks;

public class SqsMessageSender
{
    // Specify your AWS Region
    private const string MyRegion = "ap-southeast-2"; // Replace with your actual region
    private const string MyQueueUrl = "https://sqs.ap-southeast-2.amazonaws.com/000000/mytestsqs"; // Replace with your actual queue URL
   
    private static IAmazonSQS _sqsClient;

    public static async Task Main(string[] args)
    {
        // Initialize the SQS client
        _sqsClient = new AmazonSQSClient(RegionEndpoint.GetBySystemName(MyRegion));

        string messageBody = "Hello, Amazon SQS!";
        await SendMessage(_sqsClient, MyQueueUrl, messageBody);

        var cancellationTokenSource = new CancellationTokenSource();
        await ReceiveMessage(_sqsClient, cancellationTokenSource.Token, qUrl: MyQueueUrl);
    }

    /// <summary>
    /// Method to put a message on an SQS queue.
    /// </summary>
    private static async Task SendMessage(IAmazonSQS sqsClient, string qUrl, string messageBody)
    {
        var sendMessageRequest = new SendMessageRequest
        {
            QueueUrl = qUrl,
            MessageBody = messageBody
        };

        SendMessageResponse responseSendMsg = await sqsClient.SendMessageAsync(sendMessageRequest);

        Console.WriteLine($"Message added to queue\n {qUrl}");
        Console.WriteLine($"HttpStatusCode: {responseSendMsg.HttpStatusCode}");
        Console.WriteLine($"MessageId: {responseSendMsg.MessageId}");
    }

    private static async Task ReceiveMessage(IAmazonSQS sqsClient, CancellationToken cancellationToken, string qUrl)
    {
        var messageCount = 0;
       
        var request = new ReceiveMessageRequest
        {
            QueueUrl = qUrl,
            MaxNumberOfMessages = 10,
            WaitTimeSeconds = 20,
            AttributeNames = new List<string> { "All" },
            MessageAttributeNames = new List<string> { "All" }
        };

        foreach (var _ in Enumerable.Range(0, 5)) // Loop to receive messages multiple times
        {
            var response = await sqsClient.ReceiveMessageAsync(request, cancellationToken);
            if (response.Messages.Count == 0)
            {
                Console.WriteLine("∅ No messages received. Waiting again...\n");
            }

            Console.WriteLine($"\n✓ Received {response.Messages.Count} message(s):\n");

            foreach (var message in response.Messages)
            {
                messageCount++;
                Console.WriteLine($"MessageId: {message.MessageId}");
                Console.WriteLine($"Body: {message.Body}");

                Console.WriteLine("Deleting message from queue...");
                await sqsClient.DeleteMessageAsync(new DeleteMessageRequest
                {
                    QueueUrl = qUrl,
                    ReceiptHandle = message.ReceiptHandle
                });
            }
        }        

        Console.WriteLine($"[Total processed: {messageCount}]\n");
    }
}


And if all runs well, you can get the following output when you run your app.







Comments

Popular posts from this blog

mongosh install properly

gemini cli getting file not defined error

NodeJS: Error: spawn EINVAL in window for node version 20.20 and 18.20