当消息发布到 SQS 时,如何延迟触发 lambda?

How to trigger lambda with some delay when message published to SQS?

我将 lambda 配置为在消息发布到 SQS 队列时触发。这是用于部署的 SAM 模板。

  MyQueue:
    Type: AWS::SQS::Queue
    Properties:
        VisibilityTimeout: 180
        DelaySeconds: 90

  MyLambda:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: ../pathToCode
      Handler: index.handler
      Events:
        MySQSEvent:
          Type: SQS
          Properties:
              Queue: !GetAtt MyQueue.Arn

我正在使用 DelaySeconds 属性 或 AWS::SQS::QUEUE,这显然不起作用。消息发布到队列后,我的 lambda 就会立即执行。我怎样才能延迟它?

最佳解决方案是使用 AWS Step Functions。

SQS触发的lambda应该执行一个状态机,其中第一步是所需的睡眠量,第二步是lambda调用。

延迟秒数:每当您轮询队列时,它都会延迟接收消息调用。但是无论何时将消息推送到队列中,消息都会立即插入。

如果您希望您的 lambda 在特定时间间隔后执行 post 触发器,请在开始执行之前放置一个 sleep(n) 并在需要时增加 lambda 超时。截至目前,没有直接的方法来延迟触发器,只要消息在队列中,就会触发您的 lambda。

2021 年,最佳答案是使用 SQS 的新“批量 window”功能:

https://aws.amazon.com/about-aws/whats-new/2020/11/aws-lambda-now-supports-batch-windows-of-up-to-5-minutes-for-functions/

使用它,您可以允许 SQS 队列在调用 Lambda 函数之前最多收集 5 分钟的消息。