7

我有一个从 SQS 队列触发的简单 lambda 函数,我正在使用新的Lambda 目标功能。

它设置为从 触发QUEUE_A,对有效负载主体进行一些修改,然后QUEUE_B成功失败QUEUE_ERRORS时将其发送到。

QUEUE_B并在 lambda 函数上QUEUE_ERRORS设置为Destinations 。

当我从 CLI 触发 lambda 时,我得到一个记录QUEUE_B良好的记录,以及QUEUE_ERRORS一个糟糕的记录。所以,它似乎正在工作。

但是,当从 SQS 触发 lambda 时,我从未QUEUE_B在or上获得记录QUEUE_ERRORS。一个好的记录运行 lambda,而在一个不好的记录上它会转到QUEUE_A_DEADLETTER,这是我不想要的。

我已经尝试配置QUEUE_A为没有重试/死信 - 如果我这样做,如果记录不好,它将永远重试(无论我将可见性/重试设置多低)。

接下来我可以尝试什么?


编辑
CloudWatch 准确地向我展示了我希望看到的内容 - 我在“好”记录上看到了良好的日志,在“坏”记录上看到了堆栈跟踪/异常,所以这在函数本身 AFAIK 中不是问题。


编辑:用 SNS 触发器和目标替换 SQS 触发器和目标正在工作。那么,我认为这与 SQS 同步和 SNS 异步有关吗?有人知道吗?

在此处输入图像描述

4

1 回答 1

25

如果您同步调用 Lambda 函数,则不会触发目标。

Destinations 的主要用例是了解 Lambda 函数的异步执行结果,主要是为了更深入地了解执行细节,例如请求和响应上下文、有效负载、异常堆栈跟踪等。因此,如果同步调用 Lambda(例如,使用 cli 或通过 SQS 触发器),不会将任何消息传递到 Destinations 端点。

当您使用 CLI 时,您会使用aws lambda invoke-async. 相反,如果您使用aws lambda invoke(同步执行 Lambda),您将看到相同的问题,您的目标端点将不会收到消息。

您可以将 Destinations 端点保持为 SQS(您将在上面的文章中看到一个工作示例),但您的 Lambda 触发器必须更改为异步触发器。

于 2020-01-10T12:24:10.277 回答