How to use AWS SQS Locally
Posted: 12/27/2020
Softwaremill has created an SQS compatible interface that is a docker container. As long as you have docker you can run it. Here is the official repository.
docker-compose.yaml
version: "2" services: elasticmq: image: softwaremill/elasticmq-native ports: - '9324:9324' #Server - '9325:9325' #UI volumes: elasticmq: null
You can start the server by running the container: docker-compose up
-d
You can automatically create a queue on start via config file or you can create on programmatically.
startup_script.py
import boto3 VISIBILITY_TIMEOUT = "10800" # seconds client = boto3.resource( "sqs", endpoint_url="http://localhost:9324", region_name="DOESNOTMATTER", aws_secret_access_key="DOESNOTMATTER", aws_access_key_id="DOESNOTMATTER", use_ssl=False, ) response = client.create_queue( QueueName="queue1", Attributes={"VisibilityTimeout": VISIBILITY_TIMEOUT} )
Creating/sending messages
# using boto3.client sqs = boto3.client( "sqs", region_name="DOESNOTMATTER", endpoint_url="http://localhost:9324/queue/queue1", aws_access_key_id="DOESNOTMATTER", aws_secret_access_key="DOESNOTMATTER", ) response = sqs.send_message( QueueUrl="http://localhost:9324/queue/queue1", MessageAttributes={ "message_type": {"DataType": "String", "StringValue": "message_type"} }, MessageBody=str("body") ) # using boto3.resource client = boto3.resource( 'sqs', endpoint_url="http://localhost:9324", region_name="DOESNOTMATTER", aws_secret_access_key='DOESNOTMATTER', aws_access_key_id='DOESNOTMATTER', use_ssl=False ) queue = client.get_queue_by_name(QueueName='queue1') response = queue.send_message( MessageAttributes={ "message_type": {"DataType": "String", "StringValue": "message_type"} }, MessageBody=str("body") ) response_code = response["ResponseMetadata"]["HTTPStatusCode"] if not (response_code >= 200 and response_code < 300): raise Exception(f"Non 200 response after sending message {response_code}") print(str(response["MessageId"]))
Polling/receiving messages
# boto3.client sqs = boto3.client( "sqs", region_name="DOESNOTMATTER", endpoint_url="http://localhost:9324/queue/queue1", aws_access_key_id="DOESNOTMATTER", aws_secret_access_key="DOESNOTMATTER", ) response = sqs.receive_message( QueueUrl="http://localhost:9324/queue/queue1", MaxNumberOfMessages=1, MessageAttributeNames=["message_type"], VisibilityTimeout=int(VISIBILITY_TIMEOUT), # 0 - 43200 WaitTimeSeconds=0, # 0 - 20 (delay of message retrieval) ) message = response.get("Messages") # boto3.resource client = boto3.resource( 'sqs', endpoint_url="http://localhost:9324", region_name="DOESNOTMATTER", aws_secret_access_key='DOESNOTMATTER', aws_access_key_id='DOESNOTMATTER', use_ssl=False ) queue = client.get_queue_by_name(QueueName='queue1') response = queue.receive_messages( MaxNumberOfMessages=1, MessageAttributeNames=["message_type"], VisibilityTimeout=int(VISIBILITY_TIMEOUT), WaitTimeSeconds=0 ) message = response.pop() # ^ NOTE This message object is very different then the message object below