如何使用AWS EventBridge实现Lambda失败后每1-2小时重试至当日23点
实现方案
你可以通过两种主流AWS原生方案实现需求,不需要引入额外第三方服务:
方案1:EventBridge + Lambda 轻量实现(改造成本最低)
- 首先改造现有Python Lambda,新增3个核心逻辑:
- 入口处先加Google Search Console(GSC) API可用性校验:调用GSC轻量查询接口(比如历史固定日期的小数据量查询接口),返回异常直接抛出错误终止本次执行
- 执行拉取逻辑前先判断当前时间是否超过当日23点,超过则直接标记任务结束,不触发后续重试,示例判断代码:
from datetime import datetime, timezone # 请调整为你业务对应的时区 def is_before_23(): current_time = datetime.now(timezone.utc).astimezone() return current_time.hour < 23- 拉取到数据后增加完整性校验:判断数据量是否符合历史日均阈值,低于阈值也视为执行失败,避免存入不完整的脏数据到S3
- 配置AWS侧规则:
- 保留原有每日固定触发的EventBridge规则,新增一条重试专用EventBridge规则,触发频率设为1.5小时(符合1-2小时间隔要求)
- 给Lambda配置失败目的地:将执行失败的事件路由到自定义EventBridge事件总线,匹配重试规则触发下一次运行
- 给重试规则配置生效时间窗口:仅在每日首次触发时间到当日23:00之间生效,超过窗口自动停止触发,避免跨天运行
- 重试次数上限设为10次即可,按1.5小时间隔计算,完全覆盖当日可重试时间范围
方案2:Step Functions 工作流实现(可控性更高)
如果需要更精细化的重试管控,推荐用该方案:
- 搭建Step Functions状态机,核心流程如下:
- 调用Lambda执行GSC API可用性校验
- 校验通过 → 执行数据拉取+完整性校验 → 校验成功直接结束工作流
- 校验不通过/拉取失败 → 进入等待节点,设置等待时长为1.5小时
- 等待结束后判断当前时间是否≤当日23:00,是的话回到步骤1重试,否则直接结束工作流
- 原有EventBridge规则改为每日固定时间触发该Step Functions状态机即可
该方案所有重试逻辑可视化配置,不需要额外维护事件路由规则,排查问题更方便,也不会出现重复触发的异常情况
额外优化建议
- 单次Lambda执行内,给GSC API调用加2-3次指数退避重试,小范围网络波动不需要触发跨小时的重试
- Lambda日志中增加重试次数字段标记,方便后续统计GSC API的异常频率
内容的提问来源于stack exchange,提问作者Niko
相关产品推荐
相关产品推荐

