阿里云短信
通过阿里云短信服务(SendSms)把告警发成短信到值班人手机,新人可按步骤直接完成配置。
概述
阿里云短信通知媒介利用 阿里云 短信服务 · SendSms API 把告警以普通短信的形式推送到手机。一般作为邮件/IM 的补充通道——即使手机装不了 IM,短信也能收到。
- 适用场景:运维值班兜底通知、不装 IM 的老板/甲方需要被同步告警。
- 你需要准备:
- 一个已实名认证、开通短信服务的阿里云账号;
- 阿里云 AccessKey ID / AccessKey Secret(建议用 RAM 子账号);
- 已审核通过的短信签名
SignName(例如"夜莺监控"); - 已审核通过的短信模板
TemplateCode(形如SMS_123456789)。
- 整个配置分三步:①在阿里云申请签名和模板 → ②在夜莺新建阿里云短信通知媒介 → ③给用户配置手机号,通知规则里选择接收人。
阿里云短信签名和模板都需要工单审核(1~3 个工作日),而且不同行业对文案要求不同,建议提前多申请几个备用模板。
第一步:在阿里云控制台准备资料
-
登录 阿里云短信服务控制台,首次使用需要开通。
-
申请短信签名:进入 国内消息 → 签名管理 → 添加签名。企业用户建议填写营业执照上的公司简称,个人用户只能用个人姓名、App 名等。
-
申请短信模板:进入 国内消息 → 模板管理 → 添加模板。
-
模板类型选"通知短信"(告警场景不能选"营销短信");
-
关键:变量名要叫
incident,因为夜莺预置的请求体里写的是TemplateParam = {"incident":"故障{{$tpl.incident}},请及时处理"}——也就是说"故障 + 规则名 + ,请及时处理"这一整段会作为${incident}的取值传给阿里云; -
推荐模板内容(最简单):
您有一条告警 ${incident}审核通过后用户手机收到的短信是:
【你的签名】您有一条告警 故障CPU使用率超阈值,请及时处理。 -
提交审核,通过后得到
SMS_XXXXXXXX。
-
-
在 RAM 访问控制 创建子账号,授予
AliyunDysmsFullAccess权限,记下 AccessKey ID / AccessKey Secret。
第二步:在夜莺新建阿里云短信通知媒介
-
登录夜莺 → 左侧菜单 通知 → 通知媒介。
-
在左侧类型面板中点击 阿里云短信,进入新建页面(URL
/notification-channels/add?ident=ali-sms)。 -
填写基础信息:

区块 字段 是否需要改 说明 基础配置 名称 需要 例如 阿里云短信变量配置 联系方式 保持默认 Phone短信以用户的手机号作为 $sendtoHTTP 配置 URL 保持默认 https://dysmsapi.aliyuncs.comHTTP 配置 请求方法 POSTHTTP 配置 请求头 保持默认 Content-Type: application/json、Host: dysmsapi.aliyuncs.com,签名时需要,不要删 -
往下找到"请求参数",把预置字段里的占位符替换成你的实际值:

参数名 值 说明 AccessKeyId 你的 AK ID 第一步 RAM 控制台拿到的 LTAI5t...AccessKeySecret 你的 AK Secret 对应的 Secret PhoneNumbers {{ $sendto }}保持默认,发送时会替换为接收人手机号 SignName 你的短信签名 第一步审核通过的签名名称,完全照抄,一个汉字不差 TemplateCode SMS_XXXXXXXX第一步审核通过的模板编号 TemplateParam {"incident":"故障{{$tpl.incident}},请及时处理"}JSON 字符串;左边 key(这里是 incident)必须与阿里云模板里的${xxx}变量名完全一致。{{$tpl.incident}}来自系统自带的Aliyun SMS消息模板(默认就是{{$event.RuleName}})夜莺后端会自动用你填的 AK/SK 计算 ACS3-HMAC-SHA256 签名,并在调用前把
AccessKeyId / AccessKeySecret从 query 中剔除,不会明文出现在实际请求里。 -
点击 保存。
第三步:给用户配置手机号 & 通知规则
- 进入 人员组织 → 用户管理,给需要接短信的用户填写手机号字段(11 位中国手机号;国际号码需要单独开通国际短信)。
- 进入 通知 → 通知规则 → 新增:
- 通知媒介:选择阿里云短信媒介;
- 消息模板:选系统自带的
Aliyun SMS——它的incident字段默认渲染为{{$event.RuleName}},配合默认请求体TemplateParam = {"incident":"故障{{$tpl.incident}},请及时处理"},最终送到阿里云的${incident}取值约等于故障<规则名>,请及时处理; - 接收人 / 接收团队:选目标用户;
- 适用级别 / 适用时段:按需过滤;
- 保存。
- 点击"通知测试",若参数正确,手机上会在数秒内收到一条带
【你的签名】 您有一条告警 xxx的短信。
阿里云侧的计费与合规
- 短信按条计费,每 70 字一条,超过的内容会分拆成多条收费。具体价格参考 阿里云短信定价。
- 短信内容必须和模板审核时的文案完全一致。模板里没有的文字、或被审核驳回的关键词,阿里云会拒发(返回
isv.OUT_OF_SERVICE或isv.ILLEGAL_CONTENT)。 - 每个签名 + 模板对同一手机号有频控(默认 1 分钟 5 条、1 小时 10 条、24 小时 50 条,通知类模板可工单申请调整)。
常见问题
Q1:返回 SignatureDoesNotMatch?
A:AK Secret 填错;或签名内容里包含不可见字符(换行、空格)。
Q2:返回 isv.SMS_SIGNATURE_ILLEGAL / 签名不合法?
A:SignName 参数值与实际审核通过的签名不一致,检查空格、标点、中英文括号。签名字段必须严格一致。
Q3:返回 isv.OUT_OF_SERVICE / isv.ILLEGAL_CONTENT?
A:模板内容与审核时不符,或含有敏感词。回到阿里云控制台,点进模板详情查看"原始模板内容",把 TemplateParam 填入的值控制在和模板一致的上下文。
Q4:返回 isv.MOBILE_NUMBER_ILLEGAL?
A:用户填的手机号格式不对。国内号码只填 11 位(不带 +86);国际号码需要走 SendMessageToGlobe(不同 API,需要另建一个通知媒介、手动改 URL 和 action)。
Q5:我想让短信里同时出现告警规则名 + 触发值 + 时间,但模板只接受一个变量?
A:
- 方法一:申请一个包含多个变量的模板,如
【${name}】 ${level} 告警:${detail},然后在TemplateParam里分别赋值; - 方法二:让
{{$tpl.incident}}在消息模板里拼接出一行紧凑文本(不超过 20 字),直接塞到一个变量里发送。
Q6:一次告警想群发给多个人?
A:阿里云 SendSms 单次最多支持 1000 个手机号,但夜莺目前是按接收人循环调用,一人一次。人数多时适当拉大"重试间隔"避免频控。