# Day 47 : Integrating AWS SQS and SNS for Reliable Messaging

Welcome to Day 47. Today we will learn how to integrating AWS SQS and SNS for reliable messaging.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1767956161211/4392ade2-5e93-420e-ac7e-27e113942117.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1767956351153/14507645-27c3-4d6a-8de5-fe1942ce5afc.png align="center")

```bash
AWSTemplateFormatVersion: '2010-09-09'
Description: 'Nautilus DevOps Priority Queuing System'

Resources:
  HighPriorityQueue:
    Type: AWS::SQS::Queue
    Properties:
      QueueName: datacenter-High-Priority-Queue

  LowPriorityQueue:
    Type: AWS::SQS::Queue
    Properties:
      QueueName: datacenter-Low-Priority-Queue

  PriorityTopic:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: datacenter-Priority-Queues-Topic

  HighPrioritySubscription:
    Type: AWS::SNS::Subscription
    Properties:
      TopicArn: !Ref PriorityTopic
      Endpoint: !GetAtt HighPriorityQueue.Arn
      Protocol: sqs
      FilterPolicy:
        priority:
          - high

  LowPrioritySubscription:
    Type: AWS::SNS::Subscription
    Properties:
      TopicArn: !Ref PriorityTopic
      Endpoint: !GetAtt LowPriorityQueue.Arn
      Protocol: sqs
      FilterPolicy:
        priority:
          - low

  LambdaExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: lambda_execution_role
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
            Action: sts:AssumeRole
      # Using Managed Policies to avoid PutRolePolicy permission errors in labs
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
        - arn:aws:iam::aws:policy/AmazonSQSFullAccess

  PriorityLambdaFunction:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: datacenter-priorities-queue-function
      Handler: index.lambda_handler
      Role: !GetAtt LambdaExecutionRole.Arn
      Runtime: python3.9
      Timeout: 10
      Environment:
        Variables:
          high_priority_queue: !Ref HighPriorityQueue
          low_priority_queue: !Ref LowPriorityQueue
      Code:
        ZipFile: |
          import boto3
          import os
          sqs = boto3.client('sqs')
          def delete_message(queue_url, receipt_handle, message):
              response = sqs.delete_message(QueueUrl=queue_url, ReceiptHandle=receipt_handle)
              return "Message " + "'" + message + "'" + " deleted"
          def poll_messages(queue_url):
              response = sqs.receive_message(
                  QueueUrl=queue_url,
                  MaxNumberOfMessages=1,
                  MessageAttributeNames=['All'],
                  WaitTimeSeconds=3
              )
              if "Messages" in response:
                  receipt_handle=response['Messages'][0]['ReceiptHandle']
                  message = response['Messages'][0]['Body']
                  return delete_message(queue_url, receipt_handle, message)
              else:
                  return "No more messages to poll"
          def lambda_handler(event, context):
              response = poll_messages(os.environ['high_priority_queue'])
              if response == "No more messages to poll":
                  response = poll_messages(os.environ['low_priority_queue'])
              return response

  SqsQueuePolicy:
    Type: AWS::SQS::QueuePolicy
    Properties:
      Queues:
        - !Ref HighPriorityQueue
        - !Ref LowPriorityQueue
      PolicyDocument:
        Statement:
          - Effect: Allow
            Principal:
              Service: sns.amazonaws.com
            Action: sqs:SendMessage
            Resource: "*"
            Condition:
              ArnEquals:
                aws:SourceArn: !Ref PriorityTopic
```

```bash
aws cloudformation create-stack --stack-name datacenter-priority-stack --template-body file:///root/datacenter-priority-stack.yml --capabilities CAPABILITY_NAMED_IAM
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1767956689463/d4c8631d-c3a4-4bb9-bb61-71a806b51d77.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1767956726629/a5cc3319-1d1c-4259-9e6f-079b53f06cd7.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1767956754958/8e0bb99a-2395-4071-95fb-3d29c79dee9d.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1767956777916/a2380ee4-f3c5-4f3d-8f81-cd5979ad2a14.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1767957668890/997bb495-9319-4082-9b0f-944281a27038.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1767957695009/35f56b23-e819-4d83-bb31-e78c9d0a0695.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1767957743621/0ece9b94-3f8a-4199-b481-844a018c9846.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1767957792252/34436b30-a51b-4823-b2f4-8df53faa733a.png align="center")

Congratulations you did it. It looks good. This lab was successfully completed without any errors. See you in day 48. If you have any issues please let me know I will be happy to assist you. Stay tuned and learn together. If you find my article useful, please kindly like and share it.
