如何基于时长触发AWS Lambda:DynamoDB状态超时告警需求
替代Step Functions的实现方案
方案一:DynamoDB Streams + SQS延迟队列 + Lambda
这是适配需求的低成本直接方案,刚好匹配你需要的延迟时长(SQS标准队列支持最长15分钟延迟):
- 给你的DynamoDB表开启DynamoDB Streams,仅捕获
NEW_IMAGE类型的状态变更记录即可。 - 编写一个状态监听Lambda,订阅该Stream。每当捕获到状态变更:
- 若新状态为
requested,向一个SQS延迟队列发送消息,设置延迟5分钟,消息中携带记录的主键(如ID); - 若新状态为
Initiated,向另一个SQS延迟队列发送消息,设置延迟15分钟,同样携带记录主键。
- 若新状态为
- 给每个SQS队列绑定对应的告警Lambda:
- 当延迟消息到期触发Lambda时,先去DynamoDB查询该记录的当前状态;
- 若状态仍为
requested(对应5分钟队列),则发送告警;若已更新为其他状态,直接忽略; - 同理,
Initiated对应的Lambda检查状态是否未变为InProgress,是则发送对应告警。
- 额外优化:若状态在延迟期间更新(比如从
requested变为Initiated),可让状态监听Lambda通过消息唯一标识(如主键+状态生成的MessageDeduplicationId)删除SQS中的旧消息,减少不必要的Lambda执行。
方案二:EventBridge Scheduler + Lambda
通过定时任务实现延迟触发,灵活性更强(支持更长延迟,满足你的15分钟需求完全没问题):
- 同样用DynamoDB Streams触发状态监听Lambda,捕获状态变更事件。
- 针对不同状态创建对应的EventBridge定时任务:
- 状态为
requested时,创建5分钟后执行的定时任务,目标绑定告警Lambda,传递记录主键作为参数; - 状态为
Initiated时,创建15分钟后执行的定时任务,传递主键参数; - 给定时任务设置唯一名称,比如
check-status-<记录ID>-<状态值>,方便后续状态变更时删除旧任务。
- 状态为
- 当状态再次更新(如从
requested变为Initiated),状态监听Lambda需删除之前创建的requested对应定时任务,避免误告警。 - 告警Lambda执行时,必须先查询DynamoDB当前状态,确认未更新后再发送告警。
关键注意事项
- 所有告警逻辑必须先校验当前状态——延迟期间状态可能已更新,但消息/定时任务已生成,这一步是避免误告警的核心。
- 处理DynamoDB Streams的Lambda要做好幂等性,比如用Stream记录的
SequenceNumber去重,避免重复创建消息或定时任务。
内容的提问来源于stack exchange,提问作者dimitrislam
相关产品推荐
相关产品推荐

