如何实现AWS Lambda非并发调用且两次调用间隔30分钟?
可行实现方案
方案一:Step Functions 串行工作流
固定任务场景
若任务数量和每个任务的自定义事件预先确定,直接构建串行状态机即可:
- 在Step Functions中定义状态机,按顺序排列任务节点:每个节点调用目标Lambda并传入自定义事件,节点后添加
Wait状态(设置为1800秒),最后一个任务节点无需等待直接结束。 - 触发状态机执行后,所有任务会严格按顺序运行,等待时间从上一个任务完成后开始计算,完全满足30分钟间隔要求。
动态任务场景
若任务数量不固定,结合Lambda生成动态工作流:
- 将所有任务的自定义事件按顺序存储到DynamoDB或S3。
- 编写Lambda函数读取任务列表,动态生成包含串行任务和等待状态的Step Functions状态机定义。
- 调用Step Functions API启动该动态状态机,实现批量任务的串行延迟执行。
方案二:DynamoDB任务队列 + Lambda + EventBridge 链式调度
适合任务数量动态、需严格基于上一个任务完成时间计算间隔的场景:
- 用DynamoDB创建任务表,包含字段:
任务ID、执行顺序、自定义事件、状态(待执行/执行中/已完成)。 - 一次性将所有任务写入表中,按执行顺序排序。
- 触发初始Lambda执行:
- 查询表中第一个
待执行任务,标记为执行中。 - 执行业务逻辑,传入自定义事件。
- 任务完成后,标记为
已完成,并查询下一个待执行任务。 - 若存在下一个任务,调用EventBridge API创建30分钟后触发的调度,触发同一Lambda并传入下一个任务的事件。
- 查询表中第一个
- 重复上述流程,直至所有任务执行完毕。
方案三:SQS FIFO队列 + Lambda 手动延迟调度
利用SQS FIFO的串行特性,结合EventBridge实现间隔控制:
- 创建SQS FIFO队列,关闭Lambda自动触发,确保消息按顺序存储。
- 一次性将所有任务消息按顺序发送到队列。
- 触发初始Lambda,手动从队列接收一条消息并处理业务逻辑。
- 任务完成后,调用EventBridge创建30分钟后的调度任务,触发同一Lambda。
- 后续Lambda重复步骤3-4,直至队列无消息剩余。
内容的提问来源于stack exchange,提问作者Nikhil Gupta
相关产品推荐
相关产品推荐

