当前位置: 首页 > 知识库问答 >
问题:

Lambda添加错误消息到SQS消息

胡高朗
2023-03-14

我有一个基本的SQS队列,它使用redrive策略触发Lambda,在5次重试后将失败的消息发送到DLQ。我读到Lambda应该在消息中添加关于错误的消息属性

除了在DLQ中查看消息时,我没有看到任何来自Lambda的ErrorCode、ErrorMessage属性外,其他一切都正常工作。有人用这个吗?

共有1个答案

林富
2023-03-14

您混淆了两个不同功能的行为。

SQS队列可以具有死信队列。

当消息的ReceiveCount超过队列的maxReceiveCount时,Amazon SQS将消息移动到死信队列(带有原始消息ID)。

https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html

Lambda函数也可以有一个死信队列。

任何异步调用的Lambda函数都会在丢弃事件之前重试两次。如果重试失败并且不确定原因,请使用死信队列(DLQ)将未处理的事件定向到Amazon SQS队列或Amazon SNS主题以分析失败。

...

写入DLQ目标ARN的有效载荷是原始事件有效载荷,对消息正文没有任何修改。消息的属性包含帮助您理解事件未被处理的原因的信息

https://docs.aws.amazon.com/lambda/latest/dg/dlq.html

您所拥有的是前者——一个带有DLQ的SQS队列,而不是后者——一个带有DLQ的Lambda函数。

在您的配置中,根据重新驱动策略,消息只需按所述移动到DLQ,而无需修改。

在侦听SQS队列的Lambda函数上的DLQ中不可能接收您正在查找的消息,因为SQS/Lambda集成不使用异步函数调用。

Lambda轮询队列,并使用包含队列消息的事件同步调用函数。

https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html

无法以其他方式配置SQS/Lambda集成,使用DLQ(而不是SQS队列)配置Lambda函数本身将没有效果。

解决方法是使用Lambda函数的CloudWatch日志来查找有问题的消息。在代码中记录SQS MessageId,以便稍后在日志中找到它。

 类似资料:
  • 我在配置了DLQ的SQS队列上有一个lambda触发器。 当我的lambda失败时,来自队列的原始消息将被重定向到DLQ。现在我想添加更多的信息到这个原始的消息(如为什么有一个错误等)。我知道我不能修改原始消息,但我看到消息可以有额外的消息属性。 如何从lambda函数(NodeJS)使用/设置它们?

  • 我有一个连接到lambda的队列(fifo)。我想在lambda中向标准队列发送一条消息。但没有发送/接收任何消息。然而,如果我尝试从非SQS连接的lambda(通过AppSync)发送它,它会工作。 我查过: lambda有权发送SQS消息(您可以在那里看到) 由于我已成功地从另一个lambda(非SQS)向标准队列发送消息,因此正确配置了标准队列 SQS URL是否正确 控制台中不会显示任何错

  • 但是,如果我的Lambda不期望任何输入,它将自己转到SQS并拉出消息,有输入有意义吗?我是否可以让它无效,或者甚至完全使用其他方法签名(当然,在本例中不实现那个接口)?

  • 目前我正在使用SQS-Lambda集成 Lambda的并发可用。SQS批次设置为1记录,0延迟。 SQS的可见性超时为15分钟,Lambda最大执行时间为15分钟 我会注意到,有时SQS消息在飞行中被卡住,根本没有被任何Lambda处理(它们在15分钟后落入死信队列,CloudWatch显示没有Lambda被消息调用) 有人面临过同样的问题吗? 我在VPC内部运行Lambda,如果这很重要的话

  • 我有触发lambda的SQS。 当我将消息放入SQS队列时,它会显示正在传输的消息,而我的lambda无法处理该消息。 我的Lambda有以下权限 它也有以下权限 当我附加"管理员访问"权限权限,它的工作和lambda被触发。我不确定我在这里错过了哪个许可。我的SQS队列未加密。

  • 我有一个这样的系统设计 SQS- 前提条件 Lambda函数使用try-catch块,它不会抛出任何错误 跑了一会儿之后 我们在DLQ中发现了一些信息 DLQ中的消息具有属性近似接收计数为2或更大。 这和预期的一样吗 在我看来,如果没有错误抛出在Lambda,DLQ消息应该总是零。