测试环境开了忘关?云上临时资源生命周期管理实战

去年一个客户,月底看账单发现测试环境费用比上个月涨了一倍。一查,有个开发三个月前开了几台高配GPU实例跑模型训练,跑完忘了关。三台g4dn.xlarge,每月近2000美金,跑了三个月没人发现。
开发也很委屈:“我记得关了的。”
这不是个例。我见过太多公司,测试环境、开发环境、临时分支环境,开了忘关,月底账单吓一跳。
测试环境不是生产环境,不需要7x24小时跑。但怎么让它们在不用的时间自动关,才是问题。
今天聊聊云上临时资源生命周期管理。不是那种“要记得关”的废话,而是帮你理清楚:怎么让资源用完自动销毁,不用靠人记。
01 为什么人工标记不管用
很多公司的做法:开资源时打个Tag“过期时间:2025-06-01”,到了时间人工检查关不关。
问题:
人记不住。三个月前开的机器,谁还记得去查?
人懒得查。每次查一遍所有资源,费时费力。
人不敢关。怕关错了影响别人,宁可不关。
那家客户的GPU实例打了Tag“ml-training”,但没写过期时间。后来那个开发离职了,没人知道这机器是干嘛的。不敢关,一直开着。
人工管理一定会漏。要自动化。
02 资源分类:永久 vs 临时
不是所有资源都需要自动销毁。先分类。
永久资源:生产环境、长期运行的数据库、共享服务。不自动关。
准永久资源:预发环境、长期测试环境。非工作时间可关。
临时资源:开发个人环境、分支环境、CI/CD跑出来的实例、实验性资源。用完即焚。
那家客户的GPU实例属于临时资源,应该用完即焚。但没人定义它是什么类型,所以没人管。
03 生命周期管理四步法
第一步:创建时打标签
创建资源时,必须打标签:
owner: 谁开的purpose: 干什么用ttl: 存活时长(小时/天)auto-off: 是否允许自动关
自动化创建(如Terraform)可以强制要求这些标签。
第二步:空闲检测
不是所有资源都有明确的ttl。有的资源开了,但没人记得设ttl。需要空闲检测。
检测方法:
最后访问时间:过去7天有没有流量?
CPU利用率:过去7天平均CPU<5%?
网络流量:过去7天网络收发几乎为0?
符合条件的,标记为“空闲待回收”。
第三步:预警通知
空闲资源不是直接删。先发通知:
第1天:发邮件/slack给owner,“你的资源空闲7天了,3天后将自动关闭”
第3天:再次提醒,“明天将自动关闭”
第4天:自动关闭,发通知“已关闭”
第四步:自动销毁
关闭不是删。先停止实例(保留磁盘)。观察一段时间没问题,再删除。
关闭后7天:如果无人重启,自动删除
删除后30天:快照保留在冷存储(防止误删)
那家客户后来实现了自动化:Terraform创建时强制打ttl标签;每天扫描超过ttl的资源,自动关机;关机7天后自动删除。三个月后,测试环境成本降了60%。运维负责人说:“以前月底看账单像开盲盒,现在知道下个月大概多少钱。”
04 工具怎么实现
AWS方案:
用Tag标记
expiration和auto-offConfig + Lambda:定期扫描不符合策略的资源
Systems Manager Automation:执行关机、销毁操作
K8s环境:
用Namespace隔离临时环境
设置ResourceQuota限制资源
用CronJob定期扫描Namespace,超过存活时间自动删除
通用脚本:
用云SDK列出所有资源
按Tag过滤(owner、ttl、创建时间)
超过存活时间 → 调API关机 → 记录日志
05 文化配套:谁开谁关
光有技术不够。要有制度。
谁创建,谁负责销毁。创建人必须填owner标签。
成本归属。每月出报表,各团队/各人开了多少资源,没关的标注出来。
定期复盘。月底看哪些资源长期闲置没关,改流程或加自动化。
那家客户后来把“测试环境成本”纳入各团队的OKR。每个团队月初有预算,超了要说明。开发开资源时会更小心,开完也会记得关。
写在最后
测试环境开了忘关,不是人懒,是流程没跟上。
那家客户的运维负责人后来总结:“以前靠自觉,月底账单教做人。现在靠自动,开了自动关,忘了也不怕。”
你的测试环境,是靠人记,还是靠自动?