Day 47 : Integrating AWS SQS and SNS for Reliable Messaging
100 Days of Cloud (AWS)

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


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
aws cloudformation create-stack --stack-name datacenter-priority-stack --template-body file:///root/datacenter-priority-stack.yml --capabilities CAPABILITY_NAMED_IAM








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.




