如何将 AWS lambda 设置为在流程开始后 24 小时触发?
How can I set an AWS lambda to be triggered 24hs after the beginning of a process?
我有以下架构 (使用 AWS-IoTCore 和 AWS-Lambdas),它在某个 MQTT 事件后启动。在主进程结束时,一个标志 success
被保存在数据库中。这个过程大约需要 5 分钟。我想在流程开始后 24 小时调用 Lambda 函数来检查数据库中是否存在该标志。如何在没有 stepfunctions 的情况下在 Lambda 函数中设置此超时或延迟?
在执行 AWS Lambda 函数之前,"wait 24 hours" 有两条可能的路径。
在 AWS Step Functions 中使用 'wait' 步骤
AWS Step Functions 非常适合编排多步 Lambda 函数。有一个可以触发的 Wait state,然后流可以触发另一个 Lambda 函数。 Step Functions 将跟踪每个单独的请求,您可以看到每个执行及其当前状态。听起来不错!
安排您自己的检查
使用 Amazon CloudWatch Events 定期触发 AWS Lambda 函数。 Lambda 函数可以查询数据库以查找未成功完成的进程的记录。但是,由于您的代码需要查找 "non-successful" 个进程,因此首先需要将每个进程添加到数据库中(例如,在 'Process' 函数的开头)。
替代方法:仅跟踪失败
上图中的架构将'success'存储在数据库中,然后在24小时后检查。根据此图,看起来[=44=]好像数据库的唯一目的是跟踪成功的进程。
相反,我建议:
- 将顶行更改为仅存储 'failed' 个进程及其失败时间(假设可以检测到失败)
- 定期触发 AWS Lambda 函数,它将:
- 检查数据库
- 检索早于 24 小时的失败进程
- 提交它们进行重新处理
- 从数据库中删除记录,或将它们标记为 'retried' 以避免将来检索
基本上,数据库用于跟踪失败,而不是跟踪成功。 "wait 24 hours" 步骤替换为定期数据库检查失败进程。
我不确定为什么系统要等待 24 小时才能发送 'success' 电子邮件,但我认为这是您设计的有意部分。
您可以使用CloudWatch Events(或EventBridge)将Lambda函数安排到运行一次, 在设定的时间。
要创建 CloudWatch 事件规则,您可以使用 PutRule API operation to create the rule and then add the Lambda function as the target using PutTargets。 Lambda 函数还应允许 CloudWatch Events 在其函数策略中调用该函数。
我还使用以下 cron 表达式对此进行了测试:cron(0 0 1 1 ? 2021)
这将在 Fri, 01 Jan 2021 00:00:00 GMT
触发一次目标 Lambda 函数。另请注意,由于 CW invoking the function asynchronously. After the Lambda function has been invoked, you can delete the rule 来自同一函数的清理功能可能会被多次调用。
我有以下架构 success
被保存在数据库中。这个过程大约需要 5 分钟。我想在流程开始后 24 小时调用 Lambda 函数来检查数据库中是否存在该标志。如何在没有 stepfunctions 的情况下在 Lambda 函数中设置此超时或延迟?
在执行 AWS Lambda 函数之前,"wait 24 hours" 有两条可能的路径。
在 AWS Step Functions 中使用 'wait' 步骤
AWS Step Functions 非常适合编排多步 Lambda 函数。有一个可以触发的 Wait state,然后流可以触发另一个 Lambda 函数。 Step Functions 将跟踪每个单独的请求,您可以看到每个执行及其当前状态。听起来不错!
安排您自己的检查
使用 Amazon CloudWatch Events 定期触发 AWS Lambda 函数。 Lambda 函数可以查询数据库以查找未成功完成的进程的记录。但是,由于您的代码需要查找 "non-successful" 个进程,因此首先需要将每个进程添加到数据库中(例如,在 'Process' 函数的开头)。
替代方法:仅跟踪失败
上图中的架构将'success'存储在数据库中,然后在24小时后检查。根据此图,看起来[=44=]好像数据库的唯一目的是跟踪成功的进程。
相反,我建议:
- 将顶行更改为仅存储 'failed' 个进程及其失败时间(假设可以检测到失败)
- 定期触发 AWS Lambda 函数,它将:
- 检查数据库
- 检索早于 24 小时的失败进程
- 提交它们进行重新处理
- 从数据库中删除记录,或将它们标记为 'retried' 以避免将来检索
基本上,数据库用于跟踪失败,而不是跟踪成功。 "wait 24 hours" 步骤替换为定期数据库检查失败进程。
我不确定为什么系统要等待 24 小时才能发送 'success' 电子邮件,但我认为这是您设计的有意部分。
您可以使用CloudWatch Events(或EventBridge)将Lambda函数安排到运行一次, 在设定的时间。
要创建 CloudWatch 事件规则,您可以使用 PutRule API operation to create the rule and then add the Lambda function as the target using PutTargets。 Lambda 函数还应允许 CloudWatch Events 在其函数策略中调用该函数。
我还使用以下 cron 表达式对此进行了测试:cron(0 0 1 1 ? 2021)
这将在 Fri, 01 Jan 2021 00:00:00 GMT
触发一次目标 Lambda 函数。另请注意,由于 CW invoking the function asynchronously. After the Lambda function has been invoked, you can delete the rule 来自同一函数的清理功能可能会被多次调用。