如何为S3桶特定文件夹配置对象超7小时未处理的告警通知
S3指定文件夹未处理对象超时告警配置方案
前置准备
首先修改现有处理S3文件的Lambda逻辑:文件处理完成后,给对应S3对象添加标签,键为process_status,值为done,后续通过该标签区分已处理/未处理对象。如果Lambda处理完成后会直接删除源文件,可以跳过这步,直接通过对象是否存在判断处理状态。
方案1:EventBridge定时巡检(中小规模桶首选,部署成本最低)
- 新建一个独立的巡检Lambda,核心逻辑如下:
- 调用S3的
list_objects_v2接口,限定只查询你指定的文件夹前缀下的对象 - 遍历返回的对象列表,同时满足两个条件的即为异常未处理对象:
- 对象最后修改时间距当前时间超过7小时
- 调用
get_object_tagging接口确认对象没有process_status=done标签
- 只要查询到符合条件的对象,直接调用SNS主题、企业微信/钉钉webhook等渠道发送告警,告警内容可附上未处理对象的S3路径方便排查
- 调用S3的
- 在Amazon EventBridge中创建定时规则,触发频率设置为每30分钟/1小时执行一次巡检Lambda,可根据业务对告警延迟的容忍度调整频率
- 额外给巡检Lambda配置CloudWatch错误告警,避免巡检脚本故障导致告警失效
注意:如果桶内对象数量超过10万,频繁调用
list_objects_v2和get_object_tagging会产生额外API开销,建议选择下面的方案2。
方案2:S3 Inventory + Athena + CloudWatch告警(大规模桶首选,性能开销更低)
- 为目标S3桶开启S3 Inventory配置,导出频率设置为每小时,导出字段包含对象前缀、最后修改时间、对象标签,导出路径指定到同账号下的另一个存储桶
- 在Athena中创建外部表,关联S3 Inventory的导出路径,配置分区规则自动识别新增的导出文件
- 创建CloudWatch告警,自定义查询逻辑为:统计指定前缀下、最后修改时间超过7小时、标签不含
process_status=done的对象数量 - 配置告警触发条件为统计值≥1时,推送通知到关联的SNS主题即可
可选优化方案
如果业务的对象上传频率很高,可以新增DynamoDB表做状态记录:
- 配置S3事件通知,新对象上传到指定文件夹时,自动触发一个轻量Lambda,把对象路径、上传时间、处理状态初始值写入DynamoDB
- 现有处理Lambda完成任务后,更新DynamoDB中对应记录的处理状态为已完成
- 巡检逻辑直接查询DynamoDB筛选超时未处理的记录即可,完全不需要调用S3接口,开销更低查询速度更快
内容的提问来源于stack exchange,提问作者Aadhinarayanan J
相关产品推荐
相关产品推荐

