我是AWS的n00b亲戚,如果这是一个愚蠢的问题,请道歉。
我有一个用Java编写的AWS Lambda。我也有一个接收AWS S3事件消息的SQS队列。然后,我针对SQS队列创建了Lambda触发器,以便我的Lambda可以将S3事件作为SQS消息接收并适当地对其进行处理。
一切正常。我唯一遇到的问题是,即使SQS队列中没有消息,Lambda似乎也每2分钟接收一次SQS事件消息的通知。
Java代码如下:
public class SQSEventHandler implements RequestHandler<SQSEvent, Void> {
@Override
public Void handleRequest(SQSEvent sqsEvent, Context context) {
if (sqsEvent != null) {
LOGGER.debug("Received SQS event: {}", sqsEvent.toString());
... do stuff...
如果我查看CloudWatch日志(我使用SLF4J进行日志),我可以看到Lambda每2分钟被不同的SQS消息触发一次,即使在没有S3事件消息要处理的时期:
02:54:16 START RequestId: d5454080-8ea3-4c44-93e9-caa5bd903599 Version: $LATEST
02:54:16 [2020-02-13 02:54:16.220] - [d5454080-8ea3-4c44-93e9-caa5bd903599] DEBUG <package>.SQSEventHandler - Received SQS event: {}
02:54:16 END RequestId: d5454080-8ea3-4c44-93e9-caa5bd903599
02:54:16 REPORT RequestId: d5454080-8ea3-4c44-93e9-caa5bd903599 Duration: 1.05 ms Billed Duration: 100 ms Memory Size: 512 MB Max Memory Used: 161 MB
02:56:16 START RequestId: 9d5acbba-b96c-47e9-81c2-2d448e4ca6e9 Version: $LATEST
02:56:16 [2020-02-13 02:56:16.386] - [9d5acbba-b96c-47e9-81c2-2d448e4ca6e9] DEBUG <package>.SQSEventHandler - Received SQS event: {}
02:56:16 END RequestId: 9d5acbba-b96c-47e9-81c2-2d448e4ca6e9
02:56:16 REPORT RequestId: 9d5acbba-b96c-47e9-81c2-2d448e4ca6e9 Duration: 1.23 ms Billed Duration: 100 ms Memory Size: 512 MB Max Memory Used: 161 MB
02:58:16 START RequestId: 54bc4fa4-bcaf-4834-9185-09c9c7e2d757 Version: $LATEST
02:58:16 [2020-02-13 02:58:16.451] - [54bc4fa4-bcaf-4834-9185-09c9c7e2d757] DEBUG <package>.SQSEventHandler - Received SQS event: {}
02:58:16 END RequestId: 54bc4fa4-bcaf-4834-9185-09c9c7e2d757
02:58:16 REPORT RequestId: 54bc4fa4-bcaf-4834-9185-09c9c7e2d757 Duration: 1.01 ms Billed Duration: 100 ms Memory Size: 512 MB Max Memory Used: 161 MB
没有其他具有此Lambda触发器的SQS队列。
如您所见,SQS事件对象不是null,但不会在toString()调用中产生任何结果。
我无法解决问题所在,我们将不胜感激。
答案 0 :(得分:1)
我不知道,有一个CloudWatch规则设置为每两分钟向我的Lambda发送一条消息。找到此位置后,我禁用了规则,不再触发Lambda。
答案 1 :(得分:0)
您的Lambda函数对SQS消息有何作用?
如果它已完成处理,则必须将它们从SQS队列中删除,否则它们将在Visibility Timeout到期后重新出现。这是SQS如何处理接收消息的应用程序然后在它们完成对消息的处理之前就死掉的设计。