Serverless 定时巡检实战:用 FunctionGraph 替代常驻巡检脚本
一、背景:常驻巡检脚本的烦恼
我们有一批跑在 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,但定时巡检这种低频短时的活,交给函数是最省心的。把“跑起来”交给平台,把精力留给巡检规则本身。
- 点赞
- 收藏
- 关注作者
评论(0)