AutoScaling 事件通知功能支持伸缩组级别的事件通知,您可以为您的伸缩组配置事件通知,并配置需要通知的伸缩活动类型,当发生对应的伸缩活动时,事件通知会推送伸缩活动详细信息到您配置的通知对象。目前事件通知功能支持三种通知对象、五种类型的伸缩活动。使用事件通知功能,您可以第一时间获知伸缩组内实例变化情况,实时监控伸缩组信息。
本文将介绍事件通知支持的 伸缩活动类型 和事件通知支持的 通知方式,并以最佳实践的方式向您介绍如何为事件通知配置不同类型的伸缩活动和接收对象。
事件通知支持的伸缩活动类型
当您在 创建事件通知 时,需要设置触发事件通知对应的伸缩活动类型,当伸缩组发生对应类型的伸缩活动时,事件通知触发执行,发送伸缩活动详细信息到您设置的通知对象。
事件通知(Notification)目前支持以下五种类型的伸缩活动:
- 扩容伸缩活动成功(AUTOSCALING:SCALE_OUT_SUCCESS)
- 扩容伸缩活动失败(AUTOSCALING:SCALE_OUT_ERROR)
- 缩容伸缩活动成功(AUTOSCALING:SCALE_IN_SUCCESS)
- 缩容伸缩活动失败(AUTOSCALING:SCALE_IN_ERROR)
- 伸缩活动拒绝执行(AUTOSCALING:SCALE_REJECT)
上述伸缩活动中,伸缩活动成功包含了部分成功和全部成功两种情况,您可以通过事件通知发出的伸缩活动详情来判断是部分成功还是全部成功。您还可以通过 DescribeNotificationTypes 接口查询事件通知支持的伸缩活动类型。
事件通知支持的通知方式
当伸缩活动触发事件通知功能时,事件通知功能需要将伸缩活动详情上报给对应的事件通知对象,目前事件通知支持下列三种通知方式:
- 伸缩活动详情上报到云监控系统事件
- 伸缩活动详情推送到消息服务(MNS)队列(Queue)中
- 伸缩活动详情推送到消息服务(MNS)主题(Topic)中
您可以参考 云产品系统事件监控 详细了解系统事件,该文档还介绍了如何在云监控控制台查看系统事件,以及如何为系统事件设置相应的报警规则等。您还可以参考 事件监控最佳实践来了解系统事件的使用方式。关于 MNS 主题和队列的介绍,您可以参考 队列使用帮助、主题使用帮助 来了解主题、队列的创建,消息的接收方式,以及如何为主题设置订阅等。
需要注意的是,MNS 消息服务会收取相应的费用,具体的收费标准可参考 云产品定价#消息服务 进行详细了解。
最佳实践
本章将展开介绍事件通知(Notification)支持的三种通知方式,针对三种通知方式分别创建事件通知,并给出最佳实践。
目前每个伸缩组最多支持创建 6 个事件通知配置,同一个伸缩组设置的通知对象不能相同,即如果伸缩组已经创建以云监控系统事件作为通知对象的事件通知配置时,则不能再创建以云监控系统事件作为通知对象的事件通知配置,同样,MNS 队列或主题在同一个伸缩组中作为通知对象只能出现一次。
基于云监控系统事件的事件通知功能
创建伸缩组和伸缩配置
首先,您需要创建 ESS 弹性伸缩组,然后创建伸缩配置,并启动伸缩组。您可以通过登录 ESS控制台 完成上述操作,具体方法可以参考 让 ESS 更灵活的新特性 中的 最佳实践 章节,您也可以通过 使用 OpenAPI 的方法来创建伸缩组和伸缩配置,具体方法可以参考 创建弹性伸缩 官方文档,或者参考云栖博客 使用 ESS SDK 快速创建多可用区伸缩组 和 使用 ESS SDK 快速创建多可用区伸缩组 来完成创建。
创建事件通知(OpenAPI)
如果您希望伸缩组发生伸缩活动时,能够把伸缩活动详情以 上报云监控系统事件 的方式来上报到云监控,然后通过云监控通知到您,那么您可以参考 创建事件通知配置 接口来创建事件通知配置,并指定通知对象为云监控。创建以云监控系统事件作为通知对象的 ESS 事件通知配置,对应的 JAVA 代码如下:
public class NotificationTest {
public static final String REGION_ID = "cn-hangzhou";
public static final String AK = "ak";
public static final String AKS = "aks";
public static final String SCALING_GROUP_ID = "asg-xxxxxxxxxxxx";
public static final String NOTIFICATION_ARN = "acs:ess:{regionId}:{userId}:cloudmonitor";
public static void main(String[] args) throws Exception {
IClientProfile clientProfile = DefaultProfile.getProfile(REGION_ID, AK, AKS);
IAcsClient client = new DefaultAcsClient(clientProfile);
createNotificationConfiguration(client);
}
private static void createNotificationConfiguration(IAcsClient client) throws ClientException {
CreateNotificationConfigurationRequest request = new CreateNotificationConfigurationRequest();
request.setScalingGroupId(SCALING_GROUP_ID);
request.setNotificationArn(NOTIFICATION_ARN);
List<String> notifications = Lists.newArrayList();
notifications.add("AUTOSCALING:SCALE_IN_SUCCESS");
notifications.add("AUTOSCALING:SCALE_IN_ERROR");
notifications.add("AUTOSCALING:SCALE_OUT_SUCCESS");
notifications.add("AUTOSCALING:SCALE_OUT_ERROR");
notifications.add("AUTOSCALING:SCALE_REJECT");
request.setNotificationTypes(notifications);
CreateNotificationConfigurationResponse acsResponse = client.getAcsResponse(request);
}
}
使用上述代码,可以为伸缩组创建以云监控为通知对象的事件通知配置,并设置了以下几种伸缩活动来触发事件通知:
- 扩容伸缩活动成功(AUTOSCALING:SCALE_OUT_SUCCESS)
- 扩容伸缩活动失败(AUTOSCALING:SCALE_OUT_ERROR)
- 缩容伸缩活动成功(AUTOSCALING:SCALE_IN_SUCCESS)
- 缩容伸缩活动失败(AUTOSCALING:SCALE_IN_ERROR)
- 伸缩活动拒绝执行(AUTOSCALING:SCALE_REJECT)
在使用上述代码创建 ESS 事件通知前配置时,您需要先导入 aliyun-java-sdk-core、aliyun-java-sdk-ess 两个 jar 包,具体的导入方法可以参考 使用 ESS SDK 快速创建多可用区伸缩组 中的 导入 ESS Java SDK 章节。 aliyun-java-sdk-ess 版本要求是 2.1.4 及以上版本。然后在代码中补充您自己的 AK 信息,并填写伸缩组 ID(ScalingGroupId)和事件通知接收对象(NotificationArn)等参数。NotificationArn 参数中的 regionId 表示伸缩组所在地区,userId 代表您使用的 AK 对应的用户 ID(主账号)。您可以参考 CreateNotificationConfiguration 接口获取事件通知配置的详细参数信息。
创建事件通知(控制台)
您也可以通过 弹性伸缩控制台 创建以云监控为通知对象的事件通知。
首先,登录 弹性伸缩控制台,进入事件通知列表页,点击创建时间通知按钮,如下图所示:
弹出创建事件通知对话框以后,通知方式选择云监控,选择需要接收通知的事件通知类型,点击创建事件通知按钮,如下图所示:
事件通知创建完成,如下图所示:
触发伸缩活动
伸缩活动触发的方式有多种,可以通过报警任务的方式来触发伸缩活动,也可以通过执行伸缩规则的方式来触发伸缩活动,伸缩组内实例健康检查以及伸缩组内实例最大最小检查等都有可能触发伸缩活动。本章以执行伸缩规则的方式来触发伸缩活动,向您介绍事件通知上报伸缩活动详情到云监控的过程。
首先,您需要登录 弹性伸缩控制台,进入伸缩组详情页,选择左侧导航栏的伸缩规则,弹出伸缩规则详情界面,如下图所示:
上图中,该伸缩组内已经有创建好的伸缩规则,如果您的伸缩组没有创建好的伸缩规则,可点击创建伸缩规则按钮创建伸缩规则。伸缩规则创建好以后,点击执行,便会触发伸缩活动。本章以执行伸缩规则 add1(增加1台Ecs)为例,触发扩容伸缩活动,您可以进入伸缩活动详情页,查看对应的伸缩活动的执行情况,如下图所示:
上图中,第一个伸缩活动即为刚才执行伸缩规则 add1 触发的伸缩活动,从图中可以看出,扩容伸缩活动执行成功,即伸缩组发生的伸缩活动类型为 扩容伸缩活动成功(AUTOSCALING:SCALE_OUT_SUCCESS)。在 创建事件通知 章节中,已经为伸缩组设置了该类型伸缩活动的事件通知,所以该类型的伸缩活动执行完以后,事件通知会以云监控系统事件的方式为您上报伸缩活动详情。
查看系统事件上报结果
首先,登录 云监控事件监控详情页,事件类型选择系统事件,云产品选择 ESS,然后点击搜索按钮,查看 ESS 为您上报的系统事件,如下图所示:
点击上图中的查看详情,可以查看上报的系统事件详细信息,如下图所示:
从上图可以看出,ESS 上报的系统事件,包含了以下信息:
- 产品类型
- 事件名称、级别、状态信息
- 伸缩组 ID
- 伸缩活动详情
伸缩活动详情以 JSON 格式上报给云监控,内容如下:
{
"cause": "The value of Total Capacity is lesser than the Minsize, changing the Total Capacity from \"0\" to \"1\".",
"description": "\"1\" ECS instances are added",
"endTime": "2018-04-26T05:49:03.000Z",
"expectNum": 1,
"instanceIds": [
"i-xxxxxxxxxxxxxxx"
],
"requestId": "xxxxxxxxxxxxxxx",
"scalingActivityId": "asa-xxxxxxxxxxxxx",
"startTime": "2018-04-26T05:48:01.000Z"
}
伸缩活动详情中各字段的意义,如下:
- cause 伸缩活动起因
- description 伸缩活动执行结果
- startTime 伸缩活动开始时间
- endTime 伸缩活动结束时间
- requestId 本次伸缩活动请求 ID
- expectNum 本次伸缩活动预计增加(减少)实例个数,只有成功的伸缩活动会有此参数
- instanceIds 本次伸缩活动实际成功增加(减少)的实例 ID 列表,只有成功的伸缩活动会有此参数
创建系统事件报警规则
ESS 事件通知功能把伸缩活动详情以系统事件的方式上报到云监控,如果您希望云监控能够进一步的以短信、邮件或者钉钉的方式通知您,您需要登录 云监控控制台 来为对应的系统事件创建报警规则。
首先,您需要登录 云监控事件监控详情页,在事件监控界面选择报警规则,点击创建报警规则,弹出如下创建报警规则对话框,如下图所示:
上图中,事件类型选择系统事件,产品类型选择 ESS,资源范围选择全部资源,然后选择需要通知的对应联系人组。ESS 上报给云监控的系统事件被分为信息、警告、严重三个等级,每个等级对应着不同的 ESS 伸缩活动类型,对应关系如下:
信息
- 弹性伸缩组扩容伸缩活动成功(AUTOSCALING:SCALE_OUT_SUCCESS)
- 弹性伸缩组缩容伸缩活动成功(AUTOSCALING:SCALE_IN_SUCCESS)
- 全部事件(即上述两个事件的集合)
严重
- 弹性伸缩组扩容伸缩活动失败(AUTOSCALING:SCALE_OUT_ERROR)
- 弹性伸缩组缩容伸缩活动失败(AUTOSCALING:SCALE_IN_ERROR)
- 全部事件(即上述两个事件的集合)
警告
- 弹性伸缩组伸缩活动执行被拒绝(AUTOSCALING:SCALE_REJECT)
- 全部事件(即上述事件)
选择需要报警的事件等级和事件名称,点击确定按钮,创建好报警规则。当云监控接收到对应的系统事件,命中了您配置的报警规则,则触发报警,报警任务会向您配置的联系人组发送报警信息,报警的接收方式以您定义的联系人组为准。关于云监控报警联系人及报警联系人组的设置,您可以参考云监控官方文档 报警联系人和报警联系组 进行设置。您还可以参考云监控官方文档 云产品系统事件监控 来学习如何查看系统事件并设置系统事件对应的报警规则。
总结
基于云监控系统事件的事件通知功能,设置的事件通知对象为云监控,当伸缩组发生事件通知对应类型的伸缩活动时,事件通知将伸缩活动详情以系统事件的方式上报到云监控,云监控系统事件命中配置好的系统事件报警规则时,云监控会向报警规则中设置的联系人组发送报警信息。您可以通过管理联系人组的方式来管理您的伸缩活动详情接收方。
基于 MNS 队列的的事件通知功能
创建伸缩组和伸缩配置
参考上一章节中的 创建伸缩组和伸缩配置。
创建 MNS 队列
如果您打算使用 MNS 队列作为事件通知接收对象,首先需要创建好对应的 MNS 队列。您可以参考 MNS 官方文档 队列使用手册 通过 OpenAPI 创建 MNS 队列,也可以登录 MNS控制台 创建 MNS 队列。创建 MNS 队列参数的设置方法,您可以参考官方文档 创建队列 。
需要注意,您打算用来接收事件通知的 MNS 队列需要与您的伸缩组在同一个 Region 下。由于 MNS 队列服务在下列几个 Region 暂时没有开放,因此以下几个 Region 下的伸缩组暂不支持设置 MNS 队列作为事件通知接收对象:
- 华北 3(张北)
- 华北 5(呼和浩特)
- 美国东部 1(弗吉尼亚)
创建事件通知(OpenAPI)
如果您希望伸缩组发生伸缩活动的时候能够以消息推送的方式将伸缩活动详情推送到 MNS 队列,那么您可以通过 创建事件通知 接口来创建事件通知,并设置通知对象为 MNS 队列。创建以 MNS 队列作为通知对象的 ESS 事件通知配置,对应的 JAVA 代码如下:
public class NotificationTest {
public static final String REGION_ID = "cn-hangzhou";
public static final String AK = "ak";
public static final String AKS = "aks";
public static final String SCALING_GROUP_ID = "asg-xxxxxxxxxxxx";
public static final String NOTIFICATION_ARN = "acs:ess:{regionId}:{userId}:queue/{queueName}";
public static void main(String[] args) throws Exception {
IClientProfile clientProfile = DefaultProfile.getProfile(REGION_ID, AK, AKS);
IAcsClient client = new DefaultAcsClient(clientProfile);
createNotificationConfiguration(client);
}
private static void createNotificationConfiguration(IAcsClient client) throws ClientException {
CreateNotificationConfigurationRequest request = new CreateNotificationConfigurationRequest();
request.setScalingGroupId(SCALING_GROUP_ID);
request.setNotificationArn(NOTIFICATION_ARN);
List<String> notifications = Lists.newArrayList();
notifications.add("AUTOSCALING:SCALE_IN_SUCCESS");
notifications.add("AUTOSCALING:SCALE_IN_ERROR");
notifications.add("AUTOSCALING:SCALE_OUT_SUCCESS");
notifications.add("AUTOSCALING:SCALE_OUT_ERROR");
notifications.add("AUTOSCALING:SCALE_REJECT");
request.setNotificationTypes(notifications);
CreateNotificationConfigurationResponse acsResponse = client.getAcsResponse(request);
}
}
上述代码的使用方法,您可以参考基于云监控系统事件的事件通知功能 章节中的 创建事件通知配置。
创建事件通知(控制台)
您也可以通过 弹性伸缩控制台 创建以 MNS 队列为通知对象的事件通知。
首先,登录 弹性伸缩控制台,进入事件通知列表页,点击创建时间通知按钮,如下图所示:
弹出创建事件通知对话框以后,通知方式选择 MNS 队列,选择需要接收通知的事件通知类型,点击创建事件通知按钮,如下图所示:
事件通知创建完成,如下图所示:
触发伸缩活动
参考上一章节中的 触发伸缩活动。
MNS 队列消息接收
当伸缩组触发了事件通知配置的几种伸缩活动中的任何一种时,伸缩活动详情会以消息推送的方式推送到 MNS 队列中。MNS 队列中信息消费的方式有多种,您可以参考 消费消息 或者 队列使用手册 来实现对 MNS 队列中消息的消费,您还可以登录 MNS控制台 消费队列中的消息。本章以登录 MNS控制台 为例,向您展示如何查看队列中接收到的消息。首先,登录 MNS控制台 ,点击队列列表页右侧的接收消息按钮,如下图所示:
点击接收消息以后,弹出接收消息对话框,您可以设置自动删除已接收消息对话框,在接收消息对话框点击接收消息,该消息会被自动删除,消息内容包含了本次接收到的伸缩活动的详细信息,如下图所示:
事件通知功能将伸缩活动详情以 JSON 格式推送到 MNS 队列中,内容如下:
{
"content": {
"cause": "A user requests to execute scaling rule \"asr-bp15mij88gn6o0ilk9me\", changing the Total Capacity from \"0\" to \"1\".",
"description": "\"1\" ECS instances are added",
"endTime": "2018-04-24T09:15:16.000Z",
"expectNum": 1,
"instanceIds": [
"i-xxxxxxx"
],
"requestId": "DB614856-XXXX-XXXX-XXXX-23A44E86FC6C",
"scalingActivityId": "asa-xxxxxxxxxxxxxx",
"startTime": "2018-04-24T09:13:37.000Z"
},
"event": "AUTOSCALING:SCALE_OUT_SUCCESS",
"eventLevel": "INFO",
"eventStatus": "normal",
"product": "ESS",
"regionId": "cn-hangzhou",
"resourceArn": "acs:ess:cn-hangzhou:111111111111111:scalingGroup/asg-xxxxxxxxxxxxx",
"time": "2018-04-24T09:15:16.785Z",
"userId": "111111111111111"
}
上述内容中:
- event 此次事件通知对应的伸缩活动类型,事件通知支持的伸缩活动类型可参考 事件通知支持的伸缩活动类型 进行详细了解。
- eventLevel 事件级别,目前分为 INFO、WARN、CRITICAL 三个级别,分别对应伸缩活动成功、拒绝、失败。
- resourceArn 伸缩组唯一标识符,包括了伸缩组所在的 Region 信息,所属的用户 ID 信息,以及伸缩组 ID 信息。
content 包含了本次伸缩活动的详细信息
- cause 本次伸缩活动的起因
- description 本次伸缩活动的执行结果
- expectNum 本次伸缩活动期望增加或者减少的实例数(只有伸缩活动成功才上报此参数)
- instanceIds 本次伸缩活动成功弹出或者释放的实例ID(只有伸缩活动成功才上报此参数)
- scalingActivityId 本次伸缩活动 ID
对于 MNS 队列中消息的消费方式,推荐您使用 MNS 提供的长轮询的方式进行消费 ,如果队列中的消息您只打算消费一次,那么您可以在消费完以后删除对应的消息。关于长轮询方式消费队列中消息的方法,您可以参考 MNS 官方给出的 长轮训最佳实践 文档,并使用文档中提供的示例代码来消费队列消息。
总结
基于 MNS 队列的的事件通知功能, 设置的事件通知对象为 MNS 队列,当伸缩组发生对应类型的伸缩活动时,事件通知功能将伸缩活动详情以消息推送的方式推送到对应的 MNS 队列中,您可以使用长轮询的方式来消费队列中的信息,获取本次伸缩活动详情。
基于 MNS 主题的的事件通知功能
创建伸缩组和伸缩配置
参考上一章节中的 创建伸缩组和伸缩配置。
创建 MNS 主题
如果您打算使用 MNS 主题作为事件通知接收对象,那么您需要提前创建好 MNS 主题。您可以参考 MNS 官方文档 主题使用手册 使用 OpenAPI 来创建 MNS 主题,也可以登录 MNS控制台 创建 MNS 主题。MNS 主题参数的设置方法,您可以参考文档 CreateTopic。需要注意,您打算用来接收事件通知的 MNS 主题需要与您的伸缩组在同一个 Region 下。由于 MNS 主题服务在下列几个 Region 暂时没开放,因此以下几个 Region 下的伸缩组暂不支持将通知对象设置为 MNS 主题:
- 华北 3(张北)
- 华北 5(呼和浩特)
- 美国东部 1(弗吉尼亚)
- 亚太东南2(悉尼)
- 中东东部1(迪拜)
- 欧洲中部1(法兰克福)
MNS 主题接收到消息以后并不能和 MNS 队列一样直接消费。MNS 主题创建好以后需要为这个主题创建订阅,当主题接收到消息以后,会实时的将消息推送到对应的订阅方,您可以通过登录 MNS控制台 的方式来创建主题订阅,如下图所示:
也可以参考 MNS 官方文档 Subscription操作、主题使用手册 来创建主题订阅。目前 MNS 主题支持以下几种订阅方式:
- HTTP (暂不支持 HTTPS)
- MNS 队列
- 阿里短信
- 邮箱
- 移动推送
关于上述几种订阅方式,您可以参考 邮件推送、Queue推送、短信发送完整流程、移动推送 这几篇官方文档来了解不同主题订阅方式对应的设置方法。
创建事件通知(OpenAPI)
如果您希望伸缩组发生伸缩活动的时候能够以消息推送的方式将伸缩活动详情推送到 MNS 主题,那么您可以使用 创建事件通知 接口来创建事件通知,并指定通知对象为 MNS 主题。创建以 MNS 主题作为通知对象的 ESS 事件通知配置,对应的 JAVA 代码如下:
public class NotificationTest {
public static final String REGION_ID = "cn-hangzhou";
public static final String AK = "ak";
public static final String AKS = "aks";
public static final String SCALING_GROUP_ID = "asg-xxxxxxxxxxxx";
public static final String NOTIFICATION_ARN = "acs:ess:{regionId}:{userId}:topic/{topicName}";
public static void main(String[] args) throws Exception {
IClientProfile clientProfile = DefaultProfile.getProfile(REGION_ID, AK, AKS);
IAcsClient client = new DefaultAcsClient(clientProfile);
createNotificationConfiguration(client);
}
private static void createNotificationConfiguration(IAcsClient client) throws ClientException {
CreateNotificationConfigurationRequest request = new CreateNotificationConfigurationRequest();
request.setScalingGroupId(SCALING_GROUP_ID);
request.setNotificationArn(NOTIFICATION_ARN);
List<String> notifications = Lists.newArrayList();
notifications.add("AUTOSCALING:SCALE_IN_SUCCESS");
notifications.add("AUTOSCALING:SCALE_IN_ERROR");
notifications.add("AUTOSCALING:SCALE_OUT_SUCCESS");
notifications.add("AUTOSCALING:SCALE_OUT_ERROR");
notifications.add("AUTOSCALING:SCALE_REJECT");
request.setNotificationTypes(notifications);
CreateNotificationConfigurationResponse acsResponse = client.getAcsResponse(request);
}
}
上述代码的使用方法,您可以参考基于云监控系统事件的事件通知功能 章节中的 创建事件通知配置。
创建事件通知(控制台)
您也可以通过 弹性伸缩控制台 创建以 MNS 队列为通知对象的事件通知。
首先,登录 弹性伸缩控制台,进入事件通知列表页,点击创建时间通知按钮,如下图所示:
弹出创建事件通知对话框以后,通知方式选择 MNS 主题,选择需要接收通知的事件通知类型,点击创建事件通知按钮,如下图所示:
事件通知创建完成,如下图所示:
MNS 主题消息接收
当伸缩组触发了事件通知配置的几种伸缩活动中的任何一种时,事件通知功能就会将伸缩活动详情推送到 MNS 主题,MNS 主题接收到消息以后会将消息推送到主题设置的订阅端,订阅端自行消费消息。
总结
基于 MNS 主题的的事件通知功能 设置的事件通知对象为 MNS 主题,当伸缩组发生对应类型的伸缩活动时,事件通知功能将伸缩活动详情推送到 MNS 主题中。MNS 主题作为接受对象相比 MNS 队列作为接收对象,可选择的信息消费方式更多,不仅支持 MNS 队列的消费方式,而且支持 HTTP、移动推送等方式来消费事件通知。
写在最后
弹性伸缩服务正在快速地发展,后续会有更多的新功能新特性推出,感谢您的一路陪伴。