如何实现AWS Lambda阻塞等待事件并在指定时间窗口后超时
AWS Lambda长时长等待事件需求实现方案
纯Lambda无法满足需求
- AWS Lambda有硬性的最大执行时长限制,目前最高仅支持15分钟的运行时长,远低于你要求的10小时时间窗口,本身不可能长时间运行维持等待状态
- Lambda只要处于启动运行状态,即便你主动调用
sleep休眠,也会正常计算执行时长并计费,不存在你要求的「阻塞但不运行、不消耗资源」的等待状态,无事件触发时Lambda实例会被直接回收,无法维持等待逻辑
借助其他AWS服务的实现方案
方案1:Step Functions 标准工作流(推荐)
该方案不需要自己维护状态管理逻辑,可靠性最高:
- Step Functions 标准工作流最大执行时长可达1年,且内置的
Wait等待状态不会占用执行资源、也不会收取执行费用,完全符合你要的低开销阻塞等待要求 - 工作流设计逻辑:
- 配置并行执行的两个分支,同时启动
- 分支1设置为
Wait状态,等待时长配置为你需要的10小时,等待结束后直接调用处理超时逻辑的Lambda函数,抛出超时错误 - 分支2启用任务令牌等待模式,进入等待外部事件回调的状态:当你需要监听的目标事件触发时,调用回调接口通知Step Functions,收到回调后直接终止整个并行分支的执行,跳过超时逻辑
方案2:EventBridge + DynamoDB + Lambda
如果不想使用Step Functions,可以用该方案实现,成本更低:
- 收到启动等待窗口的触发请求时,在DynamoDB中写入一条等待记录,包含窗口截止时间、待匹配事件的特征标识,同时创建一条EventBridge定时规则,设置10小时后触发
- 为你需要监听的目标事件配置触发逻辑:事件到达后先查询DynamoDB,存在对应未过期的等待记录则标记为已触发,执行业务逻辑,同时删除之前创建的EventBridge定时规则
- 10小时后EventBridge定时规则触发检查Lambda,查询DynamoDB如果发现对应记录仍未被标记为已触发,就执行超时错误逻辑
内容的提问来源于stack exchange,提问作者user888270
相关产品推荐
相关产品推荐

