用FunctionGraph 定时触发器,零服务器跑一个每日定时任务

举报
海是岛思念的泪 发表于 2026/08/22 13:00:55 2026/08/22
【摘要】 不想买服务器也能跑定时任务?本文用华为云函数工作流 FunctionGraph 的 TIMER 触发器,零运维实现一个每日定时小任务(Python 3.9 在线编辑),含可复现代码与 Cron 示例,并说明免费额度。

一、背景与思路

定时任务大家第一反应可能是"开台 ECS 写个 crontab",但对轻量需求来说太重:要管服务器、管环境、还得保证它一直在线。FunctionGraph 是事件驱动的无服务器(Serverless)计算服务,你只写函数代码,触发器和运行环境都由平台管。配合它的 TIMER 触发器,就能按"固定频率"或"Cron 表达式"周期性执行函数。

适合用它的场景:

  • 每天 / 每小时定时采集或同步数据;
  • 定时生成报表、清理临时文件;
  • 定时调用某个接口、发通知。

本文做一个最小可运行示例:一个每天触发、在日志里打印当前时间(北京时间)和自定义附加信息的小函数。你可以把"打印"替换成自己的业务逻辑。

二、第一步:创建函数

  1. 进入函数工作流 FunctionGraph控制台,左侧「函数 → 函数列表」,点「创建函数」;
  2. 模板选「空白模板」,函数类型选「事件函数」;
  3. 运行时语言选 Python 3.9(按你自己的需也可选其他版本),内存规格选 512MB 足够;
  4. 函数名称填 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 的内容会出现在每次执行的"测试结果 / 日志"里,方便确认。

四、第三步:配置定时触发器

在函数详情页:

  1. 左侧「设置 → 触发器」,点「创建触发器」;

  2. 触发器类型选「定时触发器 (TIMER)」;

  3. 定时器名称自定义,例如 Timer-daily

  4. 触发规则二选一:

    • 固定频率:选"天",填 1(即每 1 天触发一次,最简单);

    • Cron 表达式:想要更精确的时间用这个。格式为「秒 分 时 日 月 星期(可选)」,可用 CRON_TZ 指定时区。例如每天北京时间 09:00 触发:

      CRON_TZ=Asia/Shanghai 0 0 9 * * *
      

      (表示:秒0 分0 时9 任意日 任意月 任意星期,时区上海。)

  5. 「是否开启」选开启

  6. (可选)附加信息填一段自定义字符串,会进 event["user_event"]

  7. 点「确定」完成。

五、第四步:验证与查看日志

  • 配置完可以先点「测试」手动触发一次,确认函数能跑通;
  • 等触发器按规则自动跑之后,到「监控 → 日志」里能看到每次执行的时间和 print 输出;
  • 如果只想手动验证、暂时不想自动跑,把触发器"是否开启"关掉即可。

六、成本

FunctionGraph 按请求次数和**执行时长(GB-秒)**计费,但有免费额度,而且子主账号共享:

  • 请求次数:每月前 100 万次免费
  • 执行时间:每月前 40 万 GB-秒免费(例如 512MB 规格约合 80 万秒);

像"每天跑一次、几毫秒就结束"的轻量任务,基本永远落在免费额度内,不会产生费用。记得不用的函数和预留实例及时删除,避免意外计费。

七、小结

用 FunctionGraph 的 TIMER 触发器做定时任务,核心是三件事:写一个 handler 函数 → 配一个 TIMER 触发器(固定频率或 Cron)→ 在日志里看执行结果。全程不用买服务器、不用管环境,配合每月 100 万次免费请求,非常适合"每天自动跑点小活儿"这类需求。

把本文示例里的 print 换成你自己的逻辑,一个无人值守的定时任务就上线了。

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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