将消息属性从 lambda 添加回 SQS DLQ

Posted

技术标签:

【中文标题】将消息属性从 lambda 添加回 SQS DLQ【英文标题】:Add message attributes from lambda back to SQS DLQ 【发布时间】:2019-01-24 01:49:09 【问题描述】:

我在配置了 DLQ 的 SQS 队列上有一个 lambda 触发器。

当我的 lambda 失败时,来自队列的原始消息将被重定向到 DLQ。 现在我想在这个原始消息中添加更多信息(比如为什么会出现错误等)。我知道我不能修改原始消息,但我看到消息可以有额外的消息属性RequestID, ErrorCode, ErrorMessage

如何通过我的 lambda 函数 (NodeJS) 使用/设置它们?

【问题讨论】:

如何将消息从 NodeJs 代码或 AWS DLQ 设置传递到 DLQ? 我有一个监听 DLQ 的 lambda 触发器。消息通过 SQS 重新驱动策略发送到 DLQ。 好的。在这种情况下,AWS 会自动添加属性,以便您可以调试它未处理的原因。您可以从日志中查看消息并在 cloudwatch 中进行交叉检查。 当我检查 DLQ 时,我可以看到原始消息的消息正文,但在消息属性选项卡中,字段为空。我在 lambda 函数中抛出这样的错误:throw new Error((err.message) ? err.message : JSON.stringify(err))。有没有办法手动指定属性? 【参考方案1】:

虽然 lambda 不允许您在发送到 DLQ 之前以任何方式编辑重试消息,但我们可以间接在消息中添加一些attributes,如下所示,可以解释它失败的原因。

这仅适用于特定情况,主要适用于 asynchronous, non-stream-based invocations,这基本上意味着 lambda 的本机异步重试或 SNS 触发器有效,但基于 SQS 的重试则不起作用。另一个条件是返回/抛出的异常必须是错误或节点 lambda 的错误原型的扩展。

类似

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 执行相同的技巧? 我还没有测试过。但我认为它也应该适用于 python 函数。 这很好,但我想知道如果可能的话如何在无服务器中做到这一点?

以上是关于将消息属性从 lambda 添加回 SQS DLQ的主要内容,如果未能解决你的问题,请参考以下文章

更长触发 lambda 的 SQS 消息

从 AWS Lambda 读取 SQS 队列

消息发布到 SQS 时如何触发 lambda?

从 AWS SQS 获取消息的延迟

当消息存在于 SQS 队列中时触发 AWS 中的 Lambda 函数

SQS 队列中的确认消息