AWS Lambda:在功能 A 之后 10 分钟执行功能 B

AWS Lambda: Execute function B 10 minutes after function A

我正在为时间敏感的应用程序开发无服务器后端。

是否可以在 Lambda 函数 A 后 XX 分钟执行 Lambda 函数 B

我正在寻找一个干净的无服务器解决方案。使用 setTimeout 或类似的方法太过骇人听闻了。

示例:在 Lambda 函数执行 10 分钟后使用 SNS 发送通知。

是的,您可以使用 SQS Delay Queues 触发 lambda B。

步骤如下

创建消息延迟设置为 10 分钟的 SQS 队列 将 Lambda B 触发器设置为上述 SQS 现在,在 Lambda 函数 A 执行后,在 SQS

上发送一条消息

现在因为在 SQS 上设置了延迟,消息将在 10 分钟后可用,一旦可用,它将触发 Lambda B

最简单的方法是使用延迟交付的 SQS。

  1. Lambda-A 将一条消息添加到 SQS 队列并将传递延迟设置为 10 分钟。您可以设置 0 到 15 分钟之间的任何延迟。您还可以使用 SQS 延迟队列来延迟添加到队列中的所有消息。 https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-delay-queues.html

  2. 10 分钟后,SQS 消息可见并且 SQS 触发 Lambda-B。

  3. Lambda-B 接收 Amazon SQS 事件并使用接收句柄从队列中删除消息。这是来自 https://docs.aws.amazon.com/lambda/latest/dg/eventsources.html#eventsources-sqs 的示例:

.

 "Records": [
    {
        "messageId": "c80e8021-a70a-42c7-a470-796e1186f753",
        "receiptHandle": "AQEBJQ+/u6NsnT5t8Q/VbVxgdUl4TMKZ5FqhksRdIQvLBhwNvADoBxYSOVeCBXdnS9P+erlTtwEALHsnBXynkfPLH3BOUqmgzP25U8kl8eHzq6RAlzrSOfTO8ox9dcp6GLmW33YjO3zkq5VRYyQlJgLCiAZUpY2D4UQcE5D1Vm8RoKfbE+xtVaOctYeINjaQJ1u3mWx9T7tork3uAlOe1uyFjCWU5aPX/1OHhWCGi2EPPZj6vchNqDOJC/Y2k1gkivqCjz1CZl6FlZ7UVPOx3AMoszPuOYZ+Nuqpx2uCE2MHTtMHD8PVjlsWirt56oUr6JPp9aRGo6bitPIOmi4dX0FmuMKD6u/JnuZCp+AXtJVTmSHS8IXt/twsKU7A+fiMK01NtD5msNgVPoe9JbFtlGwvTQ==",
        "body": "{\"foo\":\"bar\"}",
        "attributes": {
            "ApproximateReceiveCount": "3",
            "SentTimestamp": "1529104986221",
            "SenderId": "594035263019",
            "ApproximateFirstReceiveTimestamp": "1529104986230"
        },
        "messageAttributes": {},
        "md5OfBody": "9bb58f26192e4ba00f01e2e7b136bbd8",
        "eventSource": "aws:sqs",
        "eventSourceARN": "arn:aws:sqs:us-west-2:594035263019:NOTFIFOQUEUE",
        "awsRegion": "us-west-2"
    }
]

您可能可以使用 message timers in SQS.

获得您想要的东西

函数 A 应该向队列发布一条消息,延迟 10 分钟,函数 B 应该订阅该队列。

我认为最简单的方法是使用 AWS Step Functions。 您可以 -

  1. 配置一个由函数A、等待状态、函数B组成的步进机
  2. 从函数A调用步进机,它将由等待状态和函数B组成(如果你想从函数A开始有延迟)。