Serverless 小实践:用 FunctionGraph 定时触发器自动清理过期文件
【摘要】 背景:临时文件越积越多对象存储桶用久了,总会攒下不少临时文件:系统导出的报表、用户上传一半就放弃的残片、早已过期的安装包。手动清理费时费力,专门起一台服务器跑定时脚本又显得小题大做。FunctionGraph 的定时触发器正好适合这类“每天跑一次、跑完就走”的任务,按量计费,成本几乎可以忽略。 整体思路在 FunctionGraph 创建一个 Python 函数:列出指定桶、指定前缀下超过...
背景:临时文件越积越多
对象存储桶用久了,总会攒下不少临时文件:系统导出的报表、用户上传一半就放弃的残片、早已过期的安装包。手动清理费时费力,专门起一台服务器跑定时脚本又显得小题大做。FunctionGraph 的定时触发器正好适合这类“每天跑一次、跑完就走”的任务,按量计费,成本几乎可以忽略。
整体思路
- 在 FunctionGraph 创建一个 Python 函数:列出指定桶、指定前缀下超过保留天数的对象并删除;
- 给函数创建一个定时触发器,每天凌晨 2 点执行一次;
- 为函数配置最小权限的委托,只允许操作目标桶;
- 把每次删除的数量和对象名写进函数日志,并配置一条云监控告警做兜底。
关键代码
核心逻辑只有两步:分页列出对象,筛选出过期对象批量删除。
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)