Lambda将ErrorMessage添加到SQS消息

时间:2019-04-03 03:51:25

标签: aws-lambda amazon-sqs

我有一个基本的SQS队列,它使用重新驱动策略触发Lambda,以便在5次重试后将失败的消息发送到DLQ。 I read that Lambda should add message attributes about the error to the message

一切正常,但当我查看DLQ中的消息时,我看不到Lambda的任何ErrorCode,ErrorMessage属性。有人有这个工作吗?

1 个答案:

答案 0 :(得分:1)

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

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函数本身将无效。

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