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

vllm : Failed to infer device type

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

android studio kotlin source is null error