用FunctionGraph 定时触发器,零服务器跑一个每日定时任务
一、背景与思路
定时任务大家第一反应可能是"开台 ECS 写个 crontab",但对轻量需求来说太重:要管服务器、管环境、还得保证它一直在线。FunctionGraph 是事件驱动的无服务器(Serverless)计算服务,你只写函数代码,触发器和运行环境都由平台管。配合它的 TIMER 触发器,就能按"固定频率"或"Cron 表达式"周期性执行函数。
适合用它的场景:
- 每天 / 每小时定时采集或同步数据;
- 定时生成报表、清理临时文件;
- 定时调用某个接口、发通知。
本文做一个最小可运行示例:一个每天触发、在日志里打印当前时间(北京时间)和自定义附加信息的小函数。你可以把"打印"替换成自己的业务逻辑。
二、第一步:创建函数
- 进入函数工作流 FunctionGraph控制台,左侧「函数 → 函数列表」,点「创建函数」;
- 模板选「空白模板」,函数类型选「事件函数」;
- 运行时语言选 Python 3.9(按你自己的需也可选其他版本),内存规格选 512MB 足够;
- 函数名称填
daily-timer-demo(自定义),点「创建函数」进入代码编辑页。
全程在控制台点几下即可,下面核心是一段 Python 代码,不依赖任何截图。
三、第二步:写函数代码
函数入口默认是 handler(event, context)。TIMER 触发器触发时,会把一个事件对象传给 event,其中 user_event 字段就是我们创建触发器时填的"附加信息"。下面这段代码只做一件最简单的事:拿到北京时间、打印出来,并返回结果——你真正的业务代码替换 print 那段即可。
import json
from datetime import datetime, timezone, timedelta
def handler(event, context):
# 取北京时间(UTC+8)
bj = datetime.now(timezone(timedelta(hours=8)))
now_str = bj.strftime("%Y-%m-%d %H:%M:%S")
# TIMER 触发器会把创建时填的"附加信息"放到 user_event 字段
user_event = ""
try:
user_event = event.get("user_event", "")
except Exception:
pass
msg = f"[{now_str}] 定时任务触发成功"
if user_event:
msg += f",附加信息:{user_event}"
print(msg)
# ===== 在这里替换成你的实际业务逻辑,例如 =====
# - 调用某个 HTTP 接口(requests.get / requests.post)
# - 读写 OBS / 数据库
# - 通过 SMN 发送消息通知
# =============================================
return {"status": "ok", "time": now_str}
几个关键点:
event是触发器传入的事件字典,event.get("user_event", "")取出附加信息;- 真正的任务写在
print(msg)之后,比如调接口、落库、发通知; - 函数
return的内容会出现在每次执行的"测试结果 / 日志"里,方便确认。
四、第三步:配置定时触发器
在函数详情页:
-
左侧「设置 → 触发器」,点「创建触发器」;
-
触发器类型选「定时触发器 (TIMER)」;
-
定时器名称自定义,例如
Timer-daily; -
触发规则二选一:
-
固定频率:选"天",填
1(即每 1 天触发一次,最简单); -
Cron 表达式:想要更精确的时间用这个。格式为「秒 分 时 日 月 星期(可选)」,可用
CRON_TZ指定时区。例如每天北京时间 09:00 触发:CRON_TZ=Asia/Shanghai 0 0 9 * * *(表示:秒0 分0 时9 任意日 任意月 任意星期,时区上海。)
-
-
「是否开启」选开启;
-
(可选)附加信息填一段自定义字符串,会进
event["user_event"]; -
点「确定」完成。
五、第四步:验证与查看日志
- 配置完可以先点「测试」手动触发一次,确认函数能跑通;
- 等触发器按规则自动跑之后,到「监控 → 日志」里能看到每次执行的时间和
print输出; - 如果只想手动验证、暂时不想自动跑,把触发器"是否开启"关掉即可。
六、成本
FunctionGraph 按请求次数和**执行时长(GB-秒)**计费,但有免费额度,而且子主账号共享:
- 请求次数:每月前 100 万次免费;
- 执行时间:每月前 40 万 GB-秒免费(例如 512MB 规格约合 80 万秒);
像"每天跑一次、几毫秒就结束"的轻量任务,基本永远落在免费额度内,不会产生费用。记得不用的函数和预留实例及时删除,避免意外计费。
七、小结
用 FunctionGraph 的 TIMER 触发器做定时任务,核心是三件事:写一个 handler 函数 → 配一个 TIMER 触发器(固定频率或 Cron)→ 在日志里看执行结果。全程不用买服务器、不用管环境,配合每月 100 万次免费请求,非常适合"每天自动跑点小活儿"这类需求。
把本文示例里的 print 换成你自己的逻辑,一个无人值守的定时任务就上线了。
- 点赞
- 收藏
- 关注作者
评论(0)