"""SQS utility functions.""" import json import boto3 import botocore from lambdacommon.common_config import logger import config sqs_config = botocore.config.Config( retries={ 'max_attempts': 5, 'mode': 'standard', } ) sqs_client = boto3.client( 'sqs', config=sqs_config, region_name=config.AWS_REGION) def delete_message(receipt_handle): """ Delete an SQS message. Args: receipt_handle (str): Receipt handle of message to delete Returns: int: HTTP status code from delete method call """ try: queue = sqs_client.get_queue_url(QueueName=config.SQS_QUEUE_NAME) response = sqs_client.delete_message( QueueUrl=queue['QueueUrl'], ReceiptHandle=receipt_handle, ) except botocore.exceptions.ClientError as error: logger.exception('Error deleting SQS message: {}'.format( error.response['Error']['Message'])) raise error return response['ResponseMetadata']['HTTPStatusCode'] def get_queue_message_count(): """ Get number of messages in SQS queue. Returns: int: number of messages in queue """ try: queue = sqs_client.get_queue_url(QueueName=config.SQS_QUEUE_NAME) queue_attributes = sqs_client.get_queue_attributes( QueueUrl=queue['QueueUrl'], AttributeNames=['ApproximateNumberOfMessages'] ) message_count = int( queue_attributes['Attributes']['ApproximateNumberOfMessages']) except botocore.exceptions.ClientError as error: logger.exception('Error getting SQS attributes: {}'.format( error.response['Error']['Message'])) raise error return message_count def receive_message(): """ Receive SQS message with details about break-glass sessions. Returns: str: SQS message receipt handle dict: SQS message body """ try: queue = sqs_client.get_queue_url(QueueName=config.SQS_QUEUE_NAME) response = sqs_client.receive_message( QueueUrl=queue['QueueUrl'], WaitTimeSeconds=config.SQS_WAIT_TIME_SECONDS, VisibilityTimeout=config.SQS_MESSAGE_VISIBILITY_TIMEOUT, MaxNumberOfMessages=1, ) if 'Messages' in response: message = response['Messages'][0] receipt_handle = message['ReceiptHandle'] message_body = json.loads(message['Body']) else: logger.warning('No messages receieved from queue: this is ' 'unexpected and suggests multiple consumers') return {}, {} except botocore.exceptions.ClientError as error: logger.exception('Error getting SQS messages: {}'.format( error.response['Error']['Message'])) raise error return receipt_handle, message_body