SQS

Simple Queue service

$ aws sqs list-queues --profile nonprod_admin | jq .[][] | grep -i 'dev\|test\|nonprod'
"https://eu-west-1.queue.amazonaws.com/123456781234/AJS-testQueue"
"https://eu-west-1.queue.amazonaws.com/123456781234/dev-archive-data-queue"

Trivial example lambda

import boto3
 
def SendMsgToSQS(event, context):
    # Create SQS client
    sqs = boto3.client('sqs')
    queue_url = 'https://sqs.eu-west-1.amazonaws.com/123456927/AJS-testQueue'
 
 
    # Send message to SQS queue
    response = sqs.send_message(
        QueueUrl=queue_url,
        DelaySeconds=0,
        MessageAttributes={
            'Title': {
                'DataType': 'String',
                'StringValue': 'String Quartets'
            },
            'Composer': {
                'DataType': 'String',
                'StringValue': 'Johann Sebastian Bach'
            },
            'DateComposed': {
                'DataType': 'Number',
                'StringValue': '1700'
            }
        },
        MessageBody=(
            'Music popularity for:- '
            'week starting 01/06/1720'
        )
    )
 
    return (response['MessageId'])
 
#SendMsgToSQS('event', 'context')

Place jobs on Queue

sqs-ami-sendInfo.py places jobs on a queue.

#!/usr/bin/env python
 
from __future__ import print_function
import sys
import boto3
 
data = {'AMIage': '6', 'AMIimageID': 'ami-094ef7a0cbb90a7c1', 'accountID': '12345678'}
profile = 'nonprod_admin'
context = ''
 
# Create SQS client
session = boto3.session.Session(profile_name=profile)
sqs = session.client('sqs')
 
 
def send2SQS(args, context):
    queue_url = 'https://sqs.eu-west-1.amazonaws.com/057726927330/AJS-testQueue'
 
    AMIage = args['AMIage']
    AMIimageID = args['AMIimageID']
    accountID = args['accountID']
 
    # print (type(AMIage), type(AMIimageID), type(accountID))
    # print (AMIage, AMIimageID, accountID)
 
    # Send message to SQS queue
    response = sqs.send_message(
        QueueUrl=queue_url,
        DelaySeconds=0,
        MessageAttributes={
            'AMIage': {
                'DataType': 'Number',
                'StringValue': AMIage
            },
            'AMIimageID': {
                'DataType': 'String',
                'StringValue': AMIimageID
            },
            'accountID': {
                'DataType': 'Number',
                'StringValue': accountID
            }
        },
        MessageBody=(
            'List of AMI, age and accounts '
            'sent from sqs-ami-info.py'
        )
    )
 
    return (response['MessageId'])
 
 
response = send2SQS(data, context)
print ('Message ID is ', response)

Remove jobs from queue

sqs-ami-rcvInfo.py picks one message from the queue and deletes it after reading.

#!/usr/bin/env python
 
from __future__ import print_function
import sys
import boto3
 
data = {'AMIage': '6', 'AMIimageID': 'ami-094ef7a0cbb90a7c1', 'accountID': '12345678'}
profile = 'nonprod_admin'
context = ''
 
# Create SQS client
session = boto3.session.Session(profile_name=profile)
sqs = session.client('sqs')
 
 
def MainFunction():
    queue_url = 'https://sqs.eu-west-1.amazonaws.com/057726927330/AJS-testQueue'
 
    MsgCount = int(getMsgCount(queue_url, context))
    print("MsgCount is ", MsgCount)
 
    if MsgCount == 0:
        # no messages, so quit
        # print("No messages on queue.")
        return ("No messages on queue.")
    else:
        # print ('non zero message count')
        MSGresponse = getMsgFromSQS(queue_url, context)
        print('=' * 6)
        print('non zero message count', MSGresponse)
        print('=' * 6)
 
 
def getMsgCount(queue_url, context):
    print('getMsgCount function')
    # This gets the number of messages on the queue.
    numberOfMessagesResponse = sqs.get_queue_attributes(
        QueueUrl=queue_url,
        AttributeNames=['ApproximateNumberOfMessages']
    )
    numberOfMessages = numberOfMessagesResponse['Attributes']['ApproximateNumberOfMessages']
    # print("Approx Number of Messages >", numberOfMessages, "<")
    return (numberOfMessages)
 
 
 
def getMsgFromSQS(queue_url, context):
    print('getMsgFromSQS function')
    # Get 1st message from SQS queue
    response = sqs.receive_message(
        QueueUrl=queue_url,
        AttributeNames=['SentTimestamp'],
        MaxNumberOfMessages=1,
        MessageAttributeNames=[
            'All'
        ],
        VisibilityTimeout=0,
        WaitTimeSeconds=0
    )
 
    print('=' * 6)
    print("getFromSQS->", response)
    # print("getFromSQS-> Messages->", response)
    print('=' * 6)
 
 
    for i in response['Messages']:
        receipt_handle = (i['ReceiptHandle'])
        messageID = (i['MessageId'])
        print('----')
        print(i['Body'])
        print(i['MessageAttributes']['AMIimageID']['StringValue'])
        print(i['MessageAttributes']['AMIage']['StringValue'])
        print(i['MessageAttributes']['accountID']['StringValue'])
 
        # Call delete message function
        deleteMessageFromSQS(receipt_handle, queue_url, messageID )
 
    return (i['Body'], i['MessageAttributes']['AMIimageID']['StringValue'], i['MessageAttributes']['AMIage']['StringValue'], i['MessageAttributes']['accountID']['StringValue'])
 
 
def deleteMessageFromSQS(receipt_handle, queue_url, message_ID):
    print('deleteMessageFromSQS function')
    print('=' * 6)
    print("delete message ->", receipt_handle)
    print('=' * 6)
 
    # Delete received message from queue
    sqs.delete_message(
        QueueUrl=queue_url,
        ReceiptHandle=receipt_handle
    )
    print('=' * 6)
    print('Received and deleted message', message_ID)
    print('=' * 6)
 
 
mainresponse = MainFunction()
print (mainresponse)
 
aws/sqs.txt · Last modified: 27/01/2022 16:00 by andrew