我的 lambda 函数没有从 SQS 服务接收事件

问题描述

我已经设置了一个 lambda 函数一个 SQS 服务。我希望来自 SQS 服务的事件被 lambda 函数使用。

SQS 配置

enter image description here

enter image description here

所有其他配置都设置为与认值匹配。

Lambda 触发器

enter image description here

Lambda 配置

enter image description here

使用的代码来自 sqs-poller 模板(以及配置)

代码配置

我正在使用 following code 发送事件。我使用以下命令运行代码

AWS_SDK_LOAD_CONfig=true AWS_SHARED_CREDENTIALS_FILE=./credentials node sqs.js

这很好,因为我在 SQS 服务的监控面板中看到了消息。

知道为什么我的 lambda 函数没有使用事件吗?

解决方法

您的架构中似乎有两个相互竞争的概念。

Amazon SQS 和 AWS Lambda

当 Amazon SQS 队列被配置为 AWS Lambda 函数的触发器时,AWS 服务会轮询 SQS 队列以查找消息。找到消息后,将调用 Lambda 函数,并将消息通过 event 变量传递给函数。

Lambda 函数随后可以处理这些消息,从 event 变量读取消息的详细信息。

如果 Lambda 函数正确完成,AWS 服务会自动从 SQS 队列中删除消息。如果函数中出现错误,消息会在隐身期结束后自动重新出现在 SQS 队列中。

AWS Lambda 函数实际上从未调用 Amazon SQS 服务来接收或删除消息。相反,它会在被调用时获得消息。

SQS 轮询器

您提到您正在使用 sqs-poller 类。我不确定您指的是 Receiving Messages Using the QueuePoller Class in Amazon SQS - AWS SDK for Ruby 还是 @jishimi/sqs-poller - npm

尽管如此,轮询是一种传统方式,工作进程从 SQS 队列中检索消息,然后在处理完消息后将其删除。过程是:

  • 他们要求检查 SQS 队列中是否有可用的消息
  • 如果是这样,他们会调用一个工人
  • 当工作人员完成后,他们删除消息

您应该注意到,当 SQS 配置为 AWS Lambda 函数的触发器时,AWS Lambda 服务执行的相同步骤。因此,使用轮询架构与使用 SQS 作为 AWS Lambda 函数的触发器不兼容

你应该选择一个,而不是两个。