带有 SQS 触发器的 AWS Lambda,SQS Lambda 目的地,从不添加到目的地队列

wil*_*ler 7 amazon-sqs amazon-web-services aws-lambda

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

它被设置为从触发QUEUE_A,执行有效载荷的身体进行一些修改,然后将其发送给QUEUE_B的成功,或QUEUE_ERRORS失效

QUEUE_B并在 lambda 函数上QUEUE_ERRORS设置为目标

当我从 CLI 触发 lambda 时,我得到了QUEUE_B一个好的记录和QUEUE_ERRORS一个坏的记录。所以,它似乎有效。

但是,当从 SQS 触发 lambda 时,我永远不会QUEUE_B或上获得记录QUEUE_ERRORS。一个好的记录运行 lambda,如果记录不好,它会转到QUEUE_A_DEADLETTER,这是我不想要的。

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

我接下来可以尝试什么?


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


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

在此处输入图片说明

Sar*_*ain 21

如果您同步调用 Lambda 函数,则不会触发目标。您可以阅读这篇文章以获得更好的想法。

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

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

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