user15292493
user15292493

Reputation: 31

Lamda to process SQS messages not triggered

I have a lambda function that's supposed to process my SQS messages. However, it doesn't seem to be triggered automatically even though I have my SQS as its event trigger. Below is my code.

import json
import boto3

def lambda_handler(event, context):
    max=2 # Number of messages to process @ a time
    if "max" in event:
        max=int(event["max"])
    else:
        max=1
    sqs = boto3.resource('sqs') # Get access to resource
    queue = sqs.get_queue_by_name(QueueName='mysqs.fifo') # Get queue by name
    count=0
    # Process messages
    for message in queue.receive_messages(MaxNumberOfMessages=max):
        body = json.loads(message.body) # Attribute list
        print("test")
        payload = message[body]
        print(str(payload))
        count+=1
        message.delete()
    return {
        'statusCode': 200,
        'body': str(count)
    }

Upvotes: 0

Views: 1250

Answers (1)

John Rotenstein
John Rotenstein

Reputation: 270039

When an AWS Lambda function is configured with Amazon SQS as a trigger, the messages are passed in via the event variable. The code inside the function should not call Amazon SQS directly.

Here is an example of an event being passed to the function:

{
    "Records": [
        {
            "messageId": "11d6ee51-4cc7-4302-9e22-7cd8afdaadf5",
            "receiptHandle": "AQEBBX8nesZEXmkhsmZeyIE8iQAMig7qw...",
            "body": "Test message.",
            "attributes": {
                "ApproximateReceiveCount": "1",
                "SentTimestamp": "1573251510774",
                "SequenceNumber": "18849496460467696128",
                "MessageGroupId": "1",
                "SenderId": "AIDAIO23YVJENQZJOL4VO",
                "MessageDeduplicationId": "1",
                "ApproximateFirstReceiveTimestamp": "1573251510774"
            },
            "messageAttributes": {},
            "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3",
            "eventSource": "aws:sqs",
            "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:fifo.fifo",
            "awsRegion": "us-east-2"
        }
    ]
}

Your code could then access the messages with:

for record in event['Records']:
    payload = record['body']
    print(payload)
    count += 1

There is no need to delete the message -- it will be automatically deleted once the Lambda function successfully executes.

See: Using AWS Lambda with Amazon SQS - AWS Lambda

Upvotes: 2

Related Questions