当消息发布到 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”功能:
使用它,您可以允许 SQS 队列在调用 Lambda 函数之前最多收集 5 分钟的消息。
我将 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”功能:
使用它,您可以允许 SQS 队列在调用 Lambda 函数之前最多收集 5 分钟的消息。