华为云 FunctionGraph 入门实践:用 Serverless 定时任务清理 OBS 过期文件

举报
yd_283142278 发表于 2026/11/13 11:03:16 2026/11/13
【摘要】 前言对象存储里的时间越久,过期文件越多:测试上传的临时包、过期日志、已经失效的备份。手动清理费时,专门跑一台服务器做清理又不划算。函数工作流(FunctionGraph)这类 Serverless 服务正好适合这种“定期跑一次、跑完就停”的任务。本文以一个定时清理 OBS 过期文件的函数为例,讲清楚从创建函数到配置定时触发的完整过程。 一、为什么用 Serverless 做定时清理传统做法...

前言

对象存储里的时间越久,过期文件越多:测试上传的临时包、过期日志、已经失效的备份。手动清理费时,专门跑一台服务器做清理又不划算。函数工作流(FunctionGraph)这类 Serverless 服务正好适合这种“定期跑一次、跑完就停”的任务。本文以一个定时清理 OBS 过期文件的函数为例,讲清楚从创建函数到配置定时触发的完整过程。

一、为什么用 Serverless 做定时清理

传统做法是在一台云服务器上写 cron 脚本,缺点是服务器要长期开机、要自己管运维。Serverless 函数的特点是:按需执行,只有触发时才运行,平时不产生计算费用(以实际计费规则为准);无需管理服务器,不用关心系统补丁、进程守护;自带触发器,定时触发器可以直接按 cron 表达式调度。适合的场景包括:定期清理临时文件、定时生成报表、定时同步数据。反过来,不适合的场景是需要长时间运行、需要常驻内存状态的任务。

二、准备工作

开始之前需要准备两样东西:一个华为云账号,并开通 FunctionGraph 和 OBS 服务;一个 OBS 桶,用于存放和清理测试文件。建议先用一个专门的测试桶,避免误删生产数据。函数运行需要访问 OBS 的权限。在创建函数时,FunctionGraph 会要求配置委托(Agency),把操作 OBS 的权限授予函数执行时使用的临时凭证。按最小权限原则,只给这个桶的读写权限即可,不要给账号级通配权限。

三、编写清理函数

以下用 Python 写一个简单的清理函数:逻辑是列出指定桶中某个前缀下的对象,删除最后修改时间超过指定天数的对象。代码:import os;from datetime import datetime, timezone, timedelta;from obs import ObsClient;def handler(event, context): 从 context 取临时 AK/SK/Token;endpoint 从环境变量 OBS_ENDPOINT 取,默认 obs.cn-north-4.myhuaweicloud.com;bucket 从 OBS_BUCKET 取;prefix 从 OBS_PREFIX 取,默认 tmp/;expire_days 从 EXPIRE_DAYS 取,默认 30;创建 ObsClient;cutoff = 现在减去 expire_days 天;循环用 listObjects 按 prefix 分页列举(marker 翻页,每页 100 个),对每个对象比较 lastModified,小于 cutoff 的调用 deleteObject 删除并记入 deleted,否则记入 kept;返回删除与保留数量。几个要点:凭据不要写死在代码里,用执行上下文提供的临时 AK/SK/Token,通过委托获得;桶名、前缀、保留天数用环境变量配置,改策略不用改代码;分页列举,对象多时用 marker 循环翻页,避免漏删;只删明确过期的对象,先比较 lastModified 再删除,删除前也可以先写一条日志,方便事后核对。依赖方面,访问 OBS 需要用到 OBS Python SDK,可以在函数代码包里带上 obs 依赖,或者在 FunctionGraph 控制台使用在线编辑时按指引添加依赖包。

四、配置定时触发器

函数写好后,在函数详情页添加一个定时触发器(Timer):触发周期选“按 cron 表达式”,例如每天凌晨 3 点执行一次(具体写法以控制台的 cron 格式为准)。初次上线建议先把触发周期设成“每 5 分钟一次”跑几次测试,确认删除逻辑无误后再改回每天一次。测试时注意观察两件事:函数日志里打印的删除数量是否符合预期;OBS 控制台里对应前缀下的对象数量是否真的减少了。

五、给清理加一道保险

删除操作不可逆,上线前建议加三层保险:先用测试桶验证,先在测试桶里放几个新旧文件混合的对象,跑一次函数,确认只删旧文件;开启 OBS 版本控制或先做一次备份,重要桶先开启多版本保留,误删还能找回;保留天数留足余量,比如业务上 7 天就过期,函数里可以设 14 天,多留一倍缓冲,同时把删除清单输出到日志里,便于审计。另外可以给函数配一个简单的告警:如果某次删除数量异常大(比如超过 1000 个),先只记录日志、不真正删除,等人工确认后再放开。

六、常见问题

函数执行超时怎么办?默认超时时间一般是几秒到几十秒,对象很多时一次清理可能跑不完。可以把单次删除数量上限设小一点,分多次触发完成;或者提高函数的超时时间和内存配置。定时触发没执行?先检查触发器状态是否为“启用”,再看函数日志里有没有对应的执行记录。cron 表达式里的时区也要注意,控制台显示的一般是北京时间。权限报错怎么处理?多数是委托权限不足:检查委托是否授予了对应桶的读写权限,以及委托的信任关系是否指向 FunctionGraph 服务。

结语

一个定时清理函数,代码不到一百行,却覆盖了 Serverless 任务的完整链路:触发器调度、临时凭据访问云服务、环境变量配置、日志审计。同样的模式可以复用到定时备份检查、定时生成统计报表等场景。下一步可以试试把清理结果推送到消息通知服务,清理完成后自动收到一条执行报告。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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