群晖 APM 在云上留下的残留资源:Docker 跑官方脚本,先列出再删除
云账单里那些没人认领的资源,是从哪来的
用 ActiveProtect 备份或还原云上的主机时,APM 会在 AWS、Azure 里临时创建一批资源:跑任务用的工作实例、托管磁盘和快照、网络接口。任务顺利收尾时它们会被自动删掉,本来不必有人操心。
怕就怕「断开连接」这四个字——资源与 ActiveProtect 失联后,自动清理流程走不完,这些实例、磁盘、网卡就留在云账户里继续计费。备份系统本身一切正常,云账单却月月多出几笔来路不明的开销,这种钱花得冤枉还容易漏查。官方为此提供了一个清理脚本,专门识别并删除已与 APM 断连一段时间的带标记资源。
清理路:Docker 容器里跑官方脚本
两个云平台的操作骨架一致,都在本机完成,不占用生产环境:
- 准备好 Docker 环境,下载官方的 resource_cleaner 压缩包并解压;
- 启动一个 Ubuntu 22.04 容器,把解压目录挂载进去,进入目录;
- 在容器里做系统更新,装上 python3、pip 与基础工具;
- 按平台安装依赖套件:AWS 侧装脚本目录里 aws_platform 的依赖并安装 AWS CLI,Azure 侧装 azure_platform 的依赖与 Azure CLI;
- 运行平台对应的登录命令,验证自己的云账户身份。
随后是两步走,顺序别颠倒:
python3 resource_cleaner.py --platform aws
python3 resource_cleaner.py --platform aws --deleteExpire
头一条只列出过期资源,不带删除动作——先看清单,确认列出来的确实是 APM 遗留的实例、磁盘、快照、网卡,再执行带删除参数的第二条。Azure 平台把参数里的 aws 换成 azure 即可。若因资源之间存在依赖关系,部分资源删不掉,官方口径是重跑一遍删除命令,让脚本按依赖顺序再清一轮。
账户侧:权限只给这次清理需要的动作
脚本要动云上的资源,账户得先授权。做法不是直接拿管理员全权去跑,而是建一条收窄的策略:
- AWS:进 IAM 控制台创建策略,只放行脚本用到的动作——列出区域与资源、终止实例、删除卷与快照、注销镜像、删安全组、删网卡、删密钥对、删 CloudFormation 堆栈,保存后把策略附加给自己的用户;
- Azure:进订阅的访问控制(IAM)新建自定义角色,JSON 里只写各类资源的读取与删除动作——虚拟机、磁盘、快照、网卡、公网地址、安全组、虚拟网络与子网的读和删,再把角色分配给自己的账户。
清理做完,这条专用策略或角色可以随手撤下——临时授权用完即收,不给账户留长期的多余权限。
小结
云上残留资源的麻烦在于「看不见」:备份任务一切正常,钱却照扣。官方脚本把识别和删除拆成两条命令,先列后删;账户侧配一条最小权限,用完回收。
诚鑫致达科技帮客户做云成本核对时,会把云厂商的月度账单逐条过一遍——来路不明的实例和磁盘当场追主人,追不到主人的,就按这套列删流程清出去。