如何实现仅在每日00:00-03:00触发AWS Lambda执行?
可以实现,具体方案如下
需要用到的AWS服务
- 原有服务:SNS主题、带名称过滤条件的SQS订阅、目标Lambda函数
- 新增服务:Amazon EventBridge(用于定时触发Lambda消费消息)
具体操作步骤
创建专用SQS队列
- 针对需要限时处理的特定过滤名称,单独创建一个标准SQS队列(避免和其他消息混流)。
- 配置SNS主题的订阅:将符合该过滤条件的消息投递到这个专用队列,确保过滤规则准确匹配目标消息。
移除队列的Lambda直接触发器
- 不要给这个专用队列配置直接触发Lambda的触发器,确保消息只会积压在队列中,不会被即时处理。
配置EventBridge定时调度
- 进入Amazon EventBridge控制台,创建新的调度规则:
- 选择「定时调度」类型,设置调度表达式:
- 若使用UTC时间,对应每日00:00-03:00的表达式为
cron(0 0-2 * * ? *)(覆盖00:00、01:00、02:00三个整点,持续触发至03:00);若使用北京时间,需转换为UTC时间(北京时间=UTC+8,对应UTC16:00-19:00,表达式为cron(0 16-18 * * ? *))。
- 若使用UTC时间,对应每日00:00-03:00的表达式为
- 目标选择你的Lambda函数,在目标配置中添加SQS队列的ARN作为参数,方便Lambda定位目标队列。
- 选择「定时调度」类型,设置调度表达式:
- 进入Amazon EventBridge控制台,创建新的调度规则:
调整Lambda函数逻辑
- 修改Lambda代码,使其在被EventBridge触发时执行以下操作:
- 调用SQS的
ReceiveMessageAPI,批量拉取队列中的消息(建议设置MaxNumberOfMessages为10,WaitTimeSeconds为20以优化拉取效率)。 - 复用原有业务逻辑,逐条或批量处理拉取到的消息。
- 处理完成后,调用
DeleteMessageBatchAPI删除已处理的消息。 - 循环执行拉取-处理-删除流程,直到队列无剩余消息,或达到Lambda超时限制(建议将Lambda超时设置为15分钟,确保能处理单日积压消息)。
- 调用SQS的
- 修改Lambda代码,使其在被EventBridge触发时执行以下操作:
配置权限
- 给EventBridge添加触发Lambda的权限(控制台创建规则时会自动生成,无需手动配置)。
- 给Lambda函数添加SQS的
ReceiveMessage、DeleteMessageBatch权限,确保能正常操作目标队列。
补充说明
- 若担心单次Lambda执行无法处理完所有积压消息,可设置EventBridge规则在00:00-03:00期间每隔5分钟触发一次,确保消息及时处理。
- 标准SQS队列支持无限消息积压,无需担心消息丢失(只要队列未被删除)。
内容的提问来源于stack exchange,提问作者Reece Young
相关产品推荐
相关产品推荐

