将来自Lambda的消息属性添加回SQS DLQ

4
我有一个针对SQS队列的Lambda触发器,它配置了一个死信队列(DLQ)。
当我的Lambda失败时,原始消息将被重定向到DLQ。现在我想向这个原始消息添加更多信息(比如为什么出错等)。我知道我不能修改原始消息,但我看到一个消息可以有附加的消息属性RequestID, ErrorCode, ErrorMessage
我该如何从我的Lambda函数(NodeJS)中使用/设置它们?

你如何从NodeJs代码或AWS DLQ设置中将消息传递到DLQ? - Chandani Patel
我有一个Lambda触发器正在监听DLQ。并且消息是通过SQS重试策略发送到DLQ的。 - Marc Sirisak
好的。在这种情况下,AWS会自动添加属性,以便您可以调试为什么它没有被处理。您可以从日志中检查消息,并在CloudWatch中交叉检查。 - Chandani Patel
当我检查DLQ时,我可以看到原始消息的消息正文,但在消息属性选项卡中,字段为空。我在lambda函数中这样抛出错误:throw new Error((err.message) ? err.message : JSON.stringify(err))。有没有一种方法可以手动指定属性? - Marc Sirisak
1个回答

0

虽然 Lambda 不允许您在将消息发送到 DLQ 之前以任何方式编辑重试的消息,但我们可以通过以下方式间接地向消息添加一些属性,以解释其失败原因。

enter image description here

这仅适用于特定情况,主要是针对异步、非流式调用,这基本上意味着 Lambda 的本机异步重试或 SNS 触发器可以工作,但例如基于 SQS 的重试则不行。另一个条件是返回/抛出的异常必须是 Error 或 Error 原型的扩展,适用于 Node Lambdas。

类似以下内容:

exports.handler = async (event, context, cb) => {
   class CustomError extends Error {
       constructor(message) {
           super(message);
           this.name = "Some Lambda Error";
           this.message = message;
       }
   };
   let error = new CustomError("Something went wrong")
   cb(error);

   // or just simply

   cb(new Error("Something went wrong"));
};

能否对用Python编写的Lambda执行相同的技巧? - ChernikovP
我还没有测试过。但我认为它也应该适用于Python函数。 - Piyush
这很棒,但如果可能的话,我想知道如何在 Serverless 中实现? - Jeremy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接