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
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.