抢占式实例的中断事件为被动触发事件,当您在开发抢占式实例中断事件处理程序过程中,无法有效地进行代码调试。因此阿里云提供了模拟抢占式实例中断事件的方式,便于您调试运维程序。
背景信息
模拟抢占式实例中断事件需要依赖阿里云云监控,您可以通过云监控控制台或者云监控API模拟中断事件。中断事件的触发机制如下图所示:
模拟抢占式实例中断事件的方式主要分为以下两种:

方式一:通过云监控控制台模拟中断事件
本方式中,以云监控设置中断事件报警规则,并将事件投递到消息服务队列为例,介绍如何通过云监控控制台模拟中断事件。
- 登录云监控控制台。
- 在左侧导航栏,选择事件监控 > 系统事件。
- 单击事件报警规则页签。
- 单击创建报警规则。
- 在创建/修改事件报警面板,完成以下配置,然后单击确定。
- 报警规则名称:自定义名称。例如:抢占式实例中断事件报警。
- 产品类型:选择云服务器ECS。
- 事件类型:选择系统事件。
- 事件等级:选择警告。
- 事件名称:选择抢占式实例中断通知。
- 资源范围:保持默认配置。
- 报警方式:您需要根据实际情况,选择适用于您业务的报警方式。本示例中,选择消息服务队列。
成功创建后,您可以在报警规则页签,查看已创建的规则。 - 在抢占式实例中断事件的报警规则的操作列,单击调试。
- 在创建事件调试界面,修改JSON文件,然后单击确定。您需要将JSON文件中资源相关的信息替换为待模拟中断事件的抢占式实例的信息。JSON文件内容如下所示。其中:
- 阿里云账号UID变量需要替换为当前登录的阿里云账号UID。
- <resource-id>以及i-abcdef两个变量需要替换为抢占式实例的实例ID。
- <地域ID>变量需要替换为抢占式实例所属的地域ID。
{ "product": "ECS", "resourceId": "acs:ecs:cn-shanghai:阿里云账号UID:instance/<resource-id>", "level": "WARN", "instanceName": "instanceName", "regionId": "<地域ID>", "groupId": "0", "name": "Instance:PreemptibleInstanceInterruption", "content": { "instanceId": "i-abcdef", "action": "delete" }, "status": "Normal" }
成功发起调试后,系统将根据您设置的报警方式推送报警信息。
方式二:通过云监控OpenAPI模拟中断事件
本方式中,使用Alibaba Cloud SDK for Java,以云监控设置中断事件报警规则,并将事件投递到消息服务队列为例,介绍如何通过云监控OpenAPI模拟中断事件。
- 完成准备工作。
- 获取阿里云账号对应的AccessKey。具体操作,请参见创建AccessKey。
- 在开发环境中安装Java SDK。您需要在Maven项目中添加以下依赖。具体操作,请参见Java SDK使用手册。
<dependency> <groupId>com.aliyun</groupId> <artifactId>tea-openapi</artifactId> <version>0.0.13</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>cms20190101</artifactId> <version>1.0.1</version> </dependency>
- 获取阿里云账号对应的AccessKey。
- 调用云监控的创建或修改事件的报警规则接口,创建抢占式实例中断事件报警规则。Java代码样例如下所示:
import com.aliyun.cms20190101.models.*; import com.aliyun.teaopenapi.models.*; /** * 调用PutEventRule创建或修改事件的报警规则。 */ public class Sample { // 初始化请求参数。 public static com.aliyun.cms20190101.Client createClient(String accessKeyId, String accessKeySecret) throws Exception { //您的阿里云账号的AccessKey ID以及AccessKey Secret。 Config config = new Config().setAccessKeyId(accessKeyId).setAccessKeySecret(accessKeySecret); // OpenAPI的接入点(Endpoint)。 config.endpoint = "metrics.cn-hangzhou.aliyuncs.com"; return new com.aliyun.cms20190101.Client(config); } public static void main(String[] args_) throws Exception { java.util.List<String> args = java.util.Arrays.asList(args_); /** * 变量<your-access-key-id>需要设置为您的阿里云账号的AccessKey ID。 * <your-access-key-secret>需要设置为您的阿里云账号的AccessKey Secret。 */ com.aliyun.cms20190101.Client client = Sample.createClient("<your-access-key-id>", "<your-access-key-secret>"); PutEventRuleRequest.PutEventRuleRequestEventPattern eventPattern0 = new PutEventRuleRequest.PutEventRuleRequestEventPattern() // 设置事件报警规则的类型。 .setEventTypeList(java.util.Arrays.asList("*")) // 事件报警规则的等级。 .setLevelList(java.util.Arrays.asList("*")) // 事件报警规则的名称 .setNameList(java.util.Arrays.asList("Instance:PreemptibleInstanceInterruption")) // 云服务类型 .setProduct("ECS"); PutEventRuleRequest putEventRuleRequest = new PutEventRuleRequest() // 自定义规则名称。 .setRuleName("spot_release_event_test") .setEventPattern(java.util.Arrays.asList(eventPattern0)) // 事件报警规则的类型。 .setEventType("SYSTEM") // 事件报警规则的状态。 .setState("ENABLED"); //未打印返回结果,如有需要您可以自行打印。 client.putEventRule(putEventRuleRequest); } }
- 通过阿里云消息服务MNS,创建消息队列。创建消息队列的代码样例,请参见步骤二:创建队列。
- 调用云监控的PutEventRuleTargets接口,为已创建的报警规则设置报警方式,将消息投递至已创建的消息队列中。Java代码样例如下所示:
import com.aliyun.cms20190101.models.*; import com.aliyun.teaopenapi.models.*; /** * 调用PutEventRuleTargets添加或修改报警规则的发送目标。 */ public class Sample { // 初始化请求参数。 public static com.aliyun.cms20190101.Client createClient(String accessKeyId, String accessKeySecret) throws Exception { //您的阿里云账号的AccessKey ID以及AccessKey Secret。 Config config = new Config().setAccessKeyId(accessKeyId).setAccessKeySecret(accessKeySecret); // OpenAPI的接入点(Endpoint)。 config.endpoint = "metrics.cn-hangzhou.aliyuncs.com"; return new com.aliyun.cms20190101.Client(config); } public static void main(String[] args_) throws Exception { /** * 变量<your-access-key-id>需要设置为您的阿里云账号的AccessKey ID。 * <your-access-key-secret>需要设置为您的阿里云账号的AccessKey Secret。 */ com.aliyun.cms20190101.Client client = Sample.createClient("<your-access-key-id>", "<your-access-key-secret>"); PutEventRuleTargetsRequest.PutEventRuleTargetsRequestMnsParameters mnsParameters0 = new PutEventRuleTargetsRequest.PutEventRuleTargetsRequestMnsParameters() // 消息队列所属的地域。 .setRegion("cn-hangzhou") // 规则发送目标的唯一标识。 .setId("1") // 队列名称。 .setQueue("mq-test"); PutEventRuleTargetsRequest putEventRuleTargetsRequest = new PutEventRuleTargetsRequest() // 指定报警规则的名称。 .setRuleName("spot_release_event_test") .setMnsParameters(java.util.Arrays.asList( mnsParameters0 )); //未打印返回结果,如有需要您可以自行打印。 client.putEventRuleTargets(putEventRuleTargetsRequest); } }
- 调用云监控的SendDryRunSystemEvent接口,发送模拟中断事件。Java代码样例如下所示:
import com.aliyun.cms20190101.models.*; import com.aliyun.teaopenapi.models.*; /** *调用SendDryRunSystemEvent调试云资源的系统事件。 */ public class Sample { // 初始化请求参数。 public static com.aliyun.cms20190101.Client createClient(String accessKeyId, String accessKeySecret) throws Exception { //您的阿里云账号的AccessKey ID以及AccessKey Secret。 Config config = new Config().setAccessKeyId(accessKeyId).setAccessKeySecret(accessKeySecret); // OpenAPI的接入点(Endpoint)。 config.endpoint = "metrics.cn-hangzhou.aliyuncs.com"; return new com.aliyun.cms20190101.Client(config); } public static void main(String[] args_) throws Exception { /** * 变量<your-access-key-id>需要设置为您的阿里云账号的AccessKey ID。 * <your-access-key-secret>需要设置为您的阿里云账号的AccessKey Secret。 */ com.aliyun.cms20190101.Client client = Sample.createClient("<your-access-key-id>", "<your-access-key-secret>"); SendDryRunSystemEventRequest sendDryRunSystemEventRequest = new SendDryRunSystemEventRequest() // 云服务名称。 .setProduct("ecs") // 报警事件名称。 .setEventName("Instance:PreemptibleInstanceInterruption") // 设置模拟事件的内容。 .setEventContent("{\"product\":\"ECS\",\"resourceId\":\"acs:ecs:cn-shanghai:133160284996****:instance/i-abcdef\",\"level\":\"WARN\",\"instanceName\":\"instanceName\",\"regionId\":\"cn-beijing\",\"name\":\"Instance:PreemptibleInstanceInterruption\",\"content\": {\"instanceId\":\"i-abcdef****\",\"action\":\"delete\"},\"status\":\"Normal\"}"); //未打印返回结果,如有需要您可以自行打印。 client.sendDryRunSystemEvent(sendDryRunSystemEventRequest); } }
- 在队列中接收模拟事件的消息。接收消息的代码样例,请参见步骤四:接收和删除消息。