Lambda 函数在处理 SQS 消息后未显示正确的输出

Lambda function not displaying correct output after processing SQS message

目前,我在 AWS 中的工作流程如下:

**Step 函数 -> SQS 队列 -> Lambda 函数 **

Step Function 状态机在执行时会向 SQS 队列发送消息,然后该队列基于 SQS 触发器启动 Lambda 函数。这是简单的 Lambda(用 Python 编写):

# Library Imports
import boto3
import json
import os

# Variables
sqs   = boto3.resource('sqs')
queue_name = 'ExampleStandardQueue'
queue_url = os.environ['QUEUE_URL']
queue = sqs.get_queue_by_name(QueueName=queue_name)

# Handler
def lambda_handler(event, context):

  # Receive messages from queue, one at a time
  messages = queue.receive_messages()

  for message in messages:
    print('Processed message.')
    print('Message Attributes: {0}'.format(message.attributes))
    print('Message Body: {0}'.format(message.body))

当我删除 SQS 触发器并将消息发送到队列,然后测试 Lambda 函数时,我得到了正确的输出:

START RequestId: fdf3dffe-0271-4b03-974e-9d8762f2b6b3 Version: $LATEST
Processed message.
Message Attributes: None
Message Body: {"MessageTitle":"Create Group","input":"Started."}
END RequestId: fdf3dffe-0271-4b03-974e-9d8762f2b6b3
REPORT RequestId: fdf3dffe-0271-4b03-974e-9d8762f2b6b3  Duration: 60.38 ms  Billed Duration: 
100 ms  Memory Size: 128 MB Max Memory Used: 77 MB  Init Duration: 397.80 ms    

但是,当状态机向 SQS 队列发送消息时自动启动 Lambda 的自动化工作流时,日志如下所示:

START RequestId: 2fac6aa3-01ba-56dc-b077-3c41fdd731ec Version: $LATEST
END RequestId: 2fac6aa3-01ba-56dc-b077-3c41fdd731ec
REPORT RequestId: 2fac6aa3-01ba-56dc-b077-3c41fdd731ec Duration: 294.12 ms Billed Duration: 300 ms Memory Size: 128 MB Max Memory Used: 78 MB

基本上,这里的代码输出不会显示或生效,即使队列上的监控显示消息已被处理并且 lambda 函数已启动。我在这里错过了什么?

当您定义了 SQS 触发器时,Lambda 服务将轮询 SQS 以获取消息,并将这些消息发送到 event 参数中的函数中。在这种情况下,您永远不应该调用 messages = queue.receive_messages()。当您定义了 SQS 触发器时,您甚至不应该创建像 boto3.resource('sqs') 这样的 Boto3 SQS 客户端。

当您定义了 SQS 触发器时,您看不到任何消息的原因是 Lambda 服务已经从队列中删除消息,并将它们传递到您的函数中,因此当您的函数是尝试轮询队列,那里没有更多消息可供它接收。