资源用量每日播报:用 SMN 主题订阅推到邮箱和群里
一、背景:资源用量该主动推,而不是每天去翻控制台
云上跑着一堆资源,流量、存储、费用每天都在变。等月底账单出来才发现某个桶悄悄涨到几个 T,已经晚了。理想状态是每天收到一条播报:今天各资源用了多少、和昨天比涨了没。但每天手动登控制台看一遍,三天就坚持不下去。
华为云的 SMN(简单消息通知服务,Simple Message Notification)就是干"把消息主动推给订阅者"这件事的:你建一个主题(Topic),往里加邮箱、短信、HTTP 端点等订阅者,然后用一条发布(Publish)调用把消息推给所有人。本文讲怎么用 SMN 把"每日资源用量"做成一条自动推送,配合定时任务,每天定点把汇总发到你邮箱或群机器人。
二、SMN 的三个核心概念
理解 SMN 只要抓住三个词:
- 主题(Topic):一个消息频道,比如叫
daily-usage-report; - 订阅(Subscription):挂在主题下的接收端,可以是邮箱、短信、HTTP/HTTPS 端点、函数等;
- 发布(Publish):往主题推一条消息,所有已确认订阅的接收端都能收到。
订阅在生效前通常需要"确认"——比如邮箱订阅会发一封确认信,点一下才算激活,避免有人乱填别人邮箱收到你的消息。这个确认动作只做一次,之后长期有效。
三、建主题、加订阅
在 SMN 控制台建一个主题:
- 新建主题,名称
daily-usage-report,选好协议支持范围; - 添加订阅,协议选「邮件」,端点填你的邮箱;想推到群(如企业微信/钉钉机器人)就选「HTTP」端点,填机器人的 webhook 地址;
- 邮箱订阅会收到确认邮件,点击确认链接激活;
- HTTP 端点一般会收到一条验证请求,你的机器人服务要按规范回确认。
订阅建好之后,发布消息就只用一个动作。下面是 KooCLI 发布的示意:
hcloud smn message publish \
--topic_urn <你的主题URN> \
--subject "每日资源用量播报" \
--message "今日 OBS 用量 120GB(较昨日 +3GB);ECS 2 台运行中;预估费用 ¥12.5"
topic_urn 是主题的唯一标识,控制台和 API 都能拿到。消息内容就是你要播报的文本,支持换行。具体发布接口字段以官方文档为准。
四、播报内容从哪来
消息本身得有人生成。常见做法是写一个定时脚本(本机 cron、或 FunctionGraph 的 TIMER 触发器),每天固定时间:
- 调各云服务的用量/计量 API,把 OBS 容量、ECS 数量、流量等取回来;
- 拼成一段人话文本;
- 调 SMN 的发布接口推到主题。
def build_report():
lines = []
lines.append(f"OBS 用量 {obs_usage()}GB")
lines.append(f"运行中 ECS {ecs_count()} 台")
lines.append(f"预估今日费用 ¥{estimate_cost()}")
return "\n".join(lines)
def push():
smn_publish(topic_urn, subject="每日资源用量播报", message=build_report())
obs_usage 这类函数内部去调对应服务的查询接口,返回值拼成文本。这样每天到点,你和团队邮箱/群里就收到一条干净的汇总,不用任何人手动看控制台。
五、关键注意点
第一,订阅确认别忘了。最容易被漏的就是邮箱那封确认信,没点确认就永远收不到,排查时还以为代码错了。加完订阅先验证"能不能收到测试消息"再上定时。
第二,HTTP 端点要做验证响应。群机器人/webhook 订阅时,SMN 会先发验证请求,你的服务必须按规范返回确认,否则订阅处于待确认状态,消息发不出去。
第三,消息别太长。SMN 单条消息有长度限制,播报就写关键数字和涨跌,详细明细放链接或附件,别把整张报表塞进一条文本。
第四,敏感信息脱敏。播报可能含资源名、IP,推到群时要考虑群里谁都能看,必要时只播汇总数字、不暴露具体实例 ID。
第五,失败要能感知。如果某天推送没收到,是脚本挂了还是 SMN 限流?建议脚本自身有最低限度的失败告警(比如推不掉就写日志/发另一条到备用渠道),别让"没收到播报"被误读成"一切正常"。
六、总结一下
资源用量每日播报是 SMN 最接地气的使用场景:建主题、加订阅、定时发布,三步走完就能让关键数字每天主动找你,而不是你去找它。真正的灵活点在订阅端——邮箱、群机器人、短信、甚至另一个函数都能挂上,一条消息多端触达。脚本生成播报文本、SMN 负责投递,职责清晰。
- 点赞
- 收藏
- 关注作者
评论(0)