十分钟上手:用华为云 FunctionGraph 定时触发器做一个自动清理过期文件的 Serverless 任务

举报
yd_226023071 发表于 2026/11/08 17:56:20 2026/11/08
【摘要】 做过上线项目的人都遇到过同一个麻烦:日志文件、临时上传、缓存快照越攒越多,对象存储的账单跟着悄悄上涨。人工清理又费时,还容易误删。把这件事交给 Serverless 定时任务,一次写好就不用再管。思路很简单:FunctionGraph 函数 + 定时触发器 + 对象存储 SDK。每天凌晨,函数扫描指定桶里某个前缀下的对象,把超过保留天数的删掉。没有服务器要维护,空闲时不产生费用,失败了还能看...

做过上线项目的人都遇到过同一个麻烦:日志文件、临时上传、缓存快照越攒越多,对象存储的账单跟着悄悄上涨。人工清理又费时,还容易误删。把这件事交给 Serverless 定时任务,一次写好就不用再管。

思路很简单:FunctionGraph 函数 + 定时触发器 + 对象存储 SDK。每天凌晨,函数扫描指定桶里某个前缀下的对象,把超过保留天数的删掉。没有服务器要维护,空闲时不产生费用,失败了还能看日志定位原因。

第一步,创建函数。进入函数工作流控制台,新建 Python 3.10 的空白函数,把桶名、对象前缀、保留天数写进环境变量,不要写死在代码里,比如 BUCKET、PREFIX、EXPIRE_DAYS=30。这样换桶、改策略都不用改代码。

第二步,写清理逻辑。核心就三件事:分页列出对象、按最后修改时间判断是否过期、批量删除。先加一个 DRY_RUN 开关演练一遍,只打印将要删除的文件名,确认无误再真正删除。

import os
from datetime import datetime, timedelta, timezone

def handler(event, context):
    expire = datetime.now(timezone.utc) - timedelta(
        days=int(os.environ.get("EXPIRE_DAYS", "30")))
    # 分页列出 PREFIX 下的对象
    for obj in list_objects(os.environ["BUCKET"], os.environ["PREFIX"]):
        if obj["last_modified"] < expire:
            print("delete:", obj["key"])
            # delete_object(obj["key"])  # 演练通过后再放开
    return {"deleted": "done"}

第三步,配定时触发器。给函数加一个定时触发器,用 Cron 表达式每天凌晨两点跑一次,例如 0 0 2 * * ?。先手动触发一次,在日志里确认列出和删除的动作都正常,再交给它自动跑。

第四步,做好权限和安全。给函数配置最小权限的委托,只允许操作指定的桶;访问密钥不要写进代码,放到环境变量或凭据里;每次删除前写一条审计日志,方便事后核对。

最后是成本和避坑。每天跑一次的短任务,按调用次数和运行时长计费,量级非常小。要注意三点:前缀千万别写错,更不要对整个桶做通配删除;先在小桶里验证;保留天数宁可先设长一点,再慢慢收紧。

把“每天记得清理”变成“写一次就不用管”,是 Serverless 最适合做的事。日志归档、临时文件、缓存清理这类脏活累活,都可以照这个思路做一个定时小任务。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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