6

我有一个配置为在消息发布到 SQS 队列时触发的 lambda。这是用于部署的 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 就会被执行。我怎么能把它延迟?

4

3 回答 3

9

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

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

于 2019-04-03T09:08:52.180 回答
5

2021年,最好的答案是使用SQS新的“批处理窗口”功能:

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 分钟的消息。

于 2021-04-18T16:55:14.027 回答
0

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

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

于 2019-04-03T09:15:26.187 回答