Serverless 小实践:用 FunctionGraph 定时触发器自动清理过期文件

举报
yd_223584905 发表于 2026/11/10 11:37:20 2026/11/10
【摘要】 背景:临时文件越积越多对象存储桶用久了,总会攒下不少临时文件:系统导出的报表、用户上传一半就放弃的残片、早已过期的安装包。手动清理费时费力,专门起一台服务器跑定时脚本又显得小题大做。FunctionGraph 的定时触发器正好适合这类“每天跑一次、跑完就走”的任务,按量计费,成本几乎可以忽略。 整体思路在 FunctionGraph 创建一个 Python 函数:列出指定桶、指定前缀下超过...

背景:临时文件越积越多

对象存储桶用久了,总会攒下不少临时文件:系统导出的报表、用户上传一半就放弃的残片、早已过期的安装包。手动清理费时费力,专门起一台服务器跑定时脚本又显得小题大做。FunctionGraph 的定时触发器正好适合这类“每天跑一次、跑完就走”的任务,按量计费,成本几乎可以忽略。

整体思路

  1. 在 FunctionGraph 创建一个 Python 函数:列出指定桶、指定前缀下超过保留天数的对象并删除;
  2. 给函数创建一个定时触发器,每天凌晨 2 点执行一次;
  3. 为函数配置最小权限的委托,只允许操作目标桶;
  4. 把每次删除的数量和对象名写进函数日志,并配置一条云监控告警做兜底。

关键代码

核心逻辑只有两步:分页列出对象,筛选出过期对象批量删除。

def handler(event, context):
    cutoff = datetime.now(timezone.utc) - timedelta(days=30)
    marker = ""
    while True:
        resp = client.listObjects(bucket, prefix="tmp/", marker=marker)
        expired = [o.key for o in resp.contents if o.lastModified < cutoff]
        if expired:
            client.deleteObjects(bucket, expired)
        if not resp.isTruncated:
            break
        marker = resp.nextMarker

三个容易踩的坑

第一,超时时间。 函数默认超时只有 3 秒,批量删除很容易超时。把超时调到 60 秒以上,并用分页遍历代替一次性拉全量,避免单次执行时间过长。

第二,误删风险。 上线前先跑一周“只记录、不删除”的试运行模式,确认待删清单没有业务文件再打开删除开关;对象前缀要精确到业务目录,不要对着桶根目录操作。

第三,权限过大。 不要给函数挂全量对象存储权限,委托只授予目标桶的删除权限,同时开启桶的版本控制,万一误删还能从历史版本找回。

成本与效果

每天触发一次,一个月大约 30 次调用,单次执行几秒,按量计费的花费基本可以忽略。桶里不再有超过保留期的垃圾对象,团队也不用再安排人手定期手动清理。

小结

定时触发器加轻量函数,是处理周期性运维杂事最顺手的一组组合。下次再遇到“定期跑一次”的活,可以先想想能不能用它替代常驻脚本,把服务器资源留给真正需要长期运行的服务。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。