将消息属性从 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的主要内容,如果未能解决你的问题,请参考以下文章