【发布时间】:2019-08-24 17:06:47
【问题描述】:
我有一个配置为在消息发布到 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
我正在使用AWS::SQS::QUEUE 的DelaySeconds 属性,这显然不起作用。一旦消息发布到队列,我的 lambda 就会被执行。我怎样才能延迟呢?
【问题讨论】:
-
嗯,这按预期工作。
DelaySeconds将在指定的时间内延迟将消息传递到队列。这并不意味着它会在这段时间内不可见,因此一旦消息进入队列,您的 Lambda 函数就会尝试将其拾取。恐怕你想要达到的目标是不可能的。我真的没有看到这样做有很大的好处。也许如果你稍微重构一下你的架构,你就不需要这些类型的解决方法 -
@ThalesMinussi 感谢您的回复。我的用例是,在执行特定任务一分钟后,我需要在另一个 lambda 中执行一些操作。所以我将一条消息推送到队列(触发另一个 lambda),希望它会在一分钟后执行。这有意义吗?
-
恐怕您无法使用 SQS 实现这一目标。我看到的一种方法(不用想太多)是在 DynamoDB 中创建一个包含该消息的项目。然后,您可以将云监视事件与 Lambda 挂钩,例如每 10 秒轮询一次此 DynamoDB 表,因此每次它看到尚未运行的新项目时,您就会调用您的 Lambda。现在我把问题还给你:这有意义吗?
-
我说的是 10 秒,但它是一个随机数。如果您想每分钟查看一次,则每分钟运行一次云观看事件。但是,它可能会落入一些灰色区域,您的物品在 1 分 59 秒内不会被拾取。如果你能等那么久,我认为这应该没问题。您还可以在 DynamoDB 表中添加一列,其中包含有关何时运行的信息。因此,如果您运行 CloudWatch 事件并且 item.shouldRunAt 晚于当前时间,请不要执行任何操作并等待下一次执行
-
可以的,step函数呢?如果我创建一个步进函数,其中第一步只是延迟一分钟,然后我的 lambda 可以执行。
标签: triggers aws-lambda delay amazon-sqs aws-sam