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 服务已经从队列中删除消息,并将它们传递到您的函数中,因此当您的函数是尝试轮询队列,那里没有更多消息可供它接收。
目前,我在 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 服务已经从队列中删除消息,并将它们传递到您的函数中,因此当您的函数是尝试轮询队列,那里没有更多消息可供它接收。