首页 > 解决方案 > lamda 处理未触发的 SQS 消息

问题描述

我有一个 lambda 函数,它应该处理我的 SQS 消息。但是,即使我将 SQS 作为其事件触发器,它似乎也不会自动触发。下面是我的代码。

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)
    }

标签: amazon-web-servicesaws-lambdaamazon-sqs

解决方案


当 AWS Lambda 函数配置为使用 Amazon SQS 作为触发器时,消息通过event变量传入。函数内的代码不应直接调用 Amazon SQS。

event这是传递给函数的示例:

{
    "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"
        }
    ]
}

然后,您的代码可以通过以下方式访问消息:

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

无需删除该消息——一旦 Lambda 函数成功执行,它将被自动删除。

请参阅:将 AWS Lambda 与 Amazon SQS 结合使用 - AWS Lambda


推荐阅读