Serverless 定时巡检实战:用 FunctionGraph 替代常驻巡检脚本

举报
yd_252559278 发表于 2026/11/07 10:23:47 2026/11/07
【摘要】 一、背景:常驻巡检脚本的烦恼我们有一批跑在 ECS 上的业务接口,需要每 5 分钟巡检一次:调接口、看返回码,异常时发告警。最早的做法是在一台 ECS 上放一个常驻 Python 脚本加 cron,简单直接,但时间一长问题都冒出来了:脚本挂了没人知道,机器重启后 cron 没起来,日志散落在机器上查起来费劲。最尴尬的一次是巡检脚本自己 OOM 了,业务没问题,告警却炸了锅。二、为什么换成 F...

一、背景:常驻巡检脚本的烦恼

我们有一批跑在 ECS 上的业务接口,需要每 5 分钟巡检一次:调接口、看返回码,异常时发告警。最早的做法是在一台 ECS 上放一个常驻 Python 脚本加 cron,简单直接,但时间一长问题都冒出来了:脚本挂了没人知道,机器重启后 cron 没起来,日志散落在机器上查起来费劲。最尴尬的一次是巡检脚本自己 OOM 了,业务没问题,告警却炸了锅。

二、为什么换成 FunctionGraph

FunctionGraph 是华为云的 Serverless 函数服务,按调用次数和运行时长计费,不用管服务器。定时巡检这种低频、短时、无状态的任务,天然适合函数:不用维护机器和进程,函数只在触发时运行;定时触发器直接配 cron 表达式,改频率不用改代码;每次执行都有独立日志,进 LTS 就能按时间检索。

三、落地做法

函数本身很简单:读一张巡检配置表(接口地址、期望状态码、超时时间),逐个发请求,把结果写进日志,异常时发通知。核心逻辑大概是这样:

import requests

def handler(event, context):
    for target in TARGETS:
        try:
            r = requests.get(target["url"], timeout=5)
            ok = r.status_code == target["expect"]
        except Exception as e:
            ok = False
            log_error(target, e)
        if not ok:
            send_alert(target)

定时触发器配成每 5 分钟一次,函数超时设 60 秒,内存 256MB。告警走 SMN 短信加邮件。

四、踩过的三个坑

第一个坑是冷启动。函数闲置一段时间后首次调用会慢几百毫秒,巡检本身不敏感,但如果把超时设得太紧,冷启动那次就会误报。做法是给请求超时留足余量,函数超时比单次请求超时大一个量级。第二个坑是并发。上一次执行还没跑完时下一次又来了,两个实例同时巡检会发重复告警。解决办法是把函数并发数限制为 1。第三个坑是权限。函数要访问内网接口和调用 SMN,缺了对应权限会直接报错。做法是给函数绑一个最小权限的委托,只放行巡检目标和 SMN。

五、效果与成本

换成函数之后,巡检脚本的运维工作基本消失了:不用再管进程死活。费用上,5 分钟一次、每次运行几秒,一个月下来调用次数不到一万次,费用可以忽略。巡检项的增减变成了改配置表的事,新接口上线十分钟就能接进巡检。

六、落地检查清单

  • 定时触发器的 cron 是否和预期一致,先用 1 分钟间隔跑十分钟验证;
  • 函数超时与单次请求超时是否留出余量;
  • 告警通道是否真实打通过一次,别等到真出事才发现短信没发出去。

小结

不是所有任务都适合 Serverless,但定时巡检这种低频短时的活,交给函数是最省心的。把“跑起来”交给平台,把精力留给巡检规则本身。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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