【问题标题】:Add message attributes from lambda back to SQS DLQ将消息属性从 lambda 添加回 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))。有没有办法手动指定属性?

标签: node.js amazon-web-services triggers aws-lambda amazon-sqs


【解决方案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 函数。
  • 这很好,但我想知道如果可能的话如何在无服务器中做到这一点?
猜你喜欢
  • 2019-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-27
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
  • 2019-05-17
相关资源
最近更新 更多