删除弹性云服务器实例及相关资源
引导式阅读
Java
删除弹性云服务器实例及相关资源
作者
C***
上架时间
2021-06-28 11:55:24

版本说明

本示例基于华为云SDK V1.0版本开发,高版本示例正在开发中。

场景介绍

用户通过调用API可删除1个或多个弹性云服务器实例,并可指定是否同时删除弹性云服务器实例绑定的弹性公网IP和数据盘,帮助用户快速管理弹性云服务器实例,提升业务效率。批量删除弹性云服务器实例时,一次最多可以删除1000个。

前提条件

  • 申请服务:用户已注册华为云账号,进行实名认证,或者是由华为云账号在IAM中创建的用户,是云服务的使用人员,具有独立的身份凭证,详见 统一身份认证服务基本概念
  • 配置环境
    • 1、本示例假定用户已经配置好 Maven 和 Java SDK, Maven 推荐版本为 3.6.3, Java SDK 适用于 JDK 1.8+, 示例程序在 Java version 1.8.0_202 & Windows 10 的环境下进行了测试。在 Linux 环境下仅进行了冒烟测试。
    • 2、推荐采用从华为云镜像站下载的方式下载 SDK, 详见安装Java SDK方式三,或华为开源镜像站语言类Maven中的说明。
    • 3、获取华为云账号的AK/SK。如果之前没有生成过AK/SK,可登录我的凭证界面,选择“管理访问密钥 » 新增访问密钥”来获取。
    • 4、获取项目和项目ID, 还是在上面的页面中,选择“项目列表”,查找要删除ECS所在的区域对应的项目和项目ID, 复制备用。
    • 5、示例程序将不常变化的AK/SK/项目ID/区域以环境变量的形式存储,分别命名为 HWC_AK/HWC_SK/HWC_PRJ_ID/HWC_REGION, 在获取到以上数值后,请设置以上4个环境变量。
    • 6、要进行测试,还应准备好要删除的 ECS, 在对应的区域,如华北-北京四(cn-north-4)建好1个或多个按需计费的 ECS 备用。

示例代码

按照 API版本选择建议, 弹性云服务器所提供的接口分为ECS接口与OpenStack原生接口,推荐使用ECS接口。对于删除弹性云服务器实例的功能,相对OpenStack原生接口,ECS接口支持批量删除,还多了两个选项,分别代表是否同时删除弹性云服务器实例绑定的弹性公网IP和数据盘。本示例程序对两种接口都进行了调用,在用户选择同时删除弹性云服务器实例绑定的弹性公网IP和数据盘时,将调用ECS接口,反之则调用OpenStack原生接口。

OSClientAKSK osclient = OSFactory.builderAKSK().credentials(ak, sk, region, projectId, cloud) .authenticate(); // 设置查询参数 Map<String , String> filter = new HashMap<String, String>(); int MAX_ECS=10; filter.put("limit", String.format("%d", MAX_ECS)); String ecsName = readUserInput("请输入 ECS 名称包含的字符串缩小查询范围,直接回车表示查询所有 ECS:"); if (ecsName.length()>0) { System.out.println(String.format("正在查询包含字符串(%s)的 ECS...", ecsName)); filter.put("name", ecsName); } else { System.out.println("正在查询所有 ECS..."); } // 调用查询虚拟机列表的接口 List<? extends Server> serverList = osclient.compute().servers().list(filter); if (serverList.size() > 0) { if (serverList.size() >= MAX_ECS) { System.out.println(String.format("查询成功,下面是前 %d 个 ECS", MAX_ECS)); } else { System.out.println(String.format("查询成功,共有 %d 个 ECS", serverList.size())); } System.out.println(String.format("%s\t%s\t%s", "序号", "ID", "名称")); int i=0; for (Server server : serverList) { System.out.println(String.format("%d\t%s\t%s", i, server.getId(), server.getName())); i++; } } else { System.out.println(String.format("未查询到符合条件的 ECS.")); return; } int i=readUserSelection(String.format("请输入要删除 ECS 的序号(0..%d), 无效输入将取消删除操作。", serverList.size()-1), 0, serverList.size()-1); if (i<0) { System.out.println("取消删除"); return; } Server server=serverList.get(i); System.out.println(String.format("正在删除 ECS %s, ID: %s...", server.getName(), server.getId())); int selection=readUserSelection("请选择: \n0. 只删除 ECS\n1. 删除 ECS 且删除绑定的数据盘和弹性公网IP\n2. 放弃删除", 0, 1); // delete server if (0==selection) { // https://github.com/huaweicloud/huaweicloud-sdk-java/blob/master/examples/ecs/ServerDemo.java ActionResponse repDeleteServer = osclient.compute().servers().delete(server.getId()); if (repDeleteServer.isSuccess()) { System.out.println("删除成功"); } else { System.out.println(String.format("删除失败: %s", repDeleteServer.getFault())); } } else if (1==selection) { // https://github.com/huaweicloud/huaweicloud-sdk-java/blob/master/examples/ecs/CloudServerV1.java ArrayList<String> serverIds = new ArrayList<String>(); serverIds.add(server.getId()); String deleteJobId = osclient.ecs().servers().delete(serverIds, true, true); if (null != deleteJobId) { System.out.println(String.format("删除成功, Id=%s", deleteJobId)); Job job = osclient.ecs().jobs().get(deleteJobId); if (null == job) { System.out.println("获取删除任务信息失败!"); return; } System.out.println(String.format("删除任务信息: %s", job)); } else { System.out.println("删除失败"); } }

运行示例

在命令行下,进入 pom.xml 文件所在目录,运行以下命令将执行 App 类的 main 方法。

# 打包 mvn package # 将依赖包复制到 target/dependency/ 目录下 mvn dependency:copy-dependencies -Dmdep.useRepositoryLayout=false # 执行 App 类的 main 方法,注意在 Linux 下,应将 ';' 更改为 ':' # java -cp "target/sdkExample-1.0-SNAPSHOT.jar;target/dependency/*" cn.eaglesoftware.hwcloud.App # Windows 命令行下 # java -cp "target/sdkExample-1.0-SNAPSHOT.jar:target/dependency/*" cn.eaglesoftware.hwcloud.App # Linux 命令行下 java -cp "target/sdkExample-1.0-SNAPSHOT.jar;target/dependency/*" cn.eaglesoftware.hwcloud.App

运行结果

程序执行过程中,首先会查询环境变量配置的区域下的 ECS, 以列表的形式向用户展现(最多10条,用户可输入 ECS 名称的一部分缩小查询范围),用户输入序号可选择其中的 1 个 ECS, 再次选择是否要删除绑定的数据盘和弹性公网IP后,执行删除操作,并将删除结果输出到控制台。

-----------------------样例----------------------------------------

请输入 ECS 名称包含的字符串缩小查询范围,直接回车表示查询所有 ECS: test 正在查询包含字符串(test)的 ECS... 查询成功,共有 6 个 ECS 序号 ID 名称 0 5e15b1c1-f191-421f-a9f6-72dcf83bcd58 ecs-test-0002 1 22858c35-7da0-4395-8429-ccc724d66ab9 ecs-test-0006 2 3085d0eb-7b7c-4d06-ae13-abd8e375fe93 ecs-test-0003 3 370707e2-86f1-4d7e-86da-3eca915472bc ecs-test-0005 4 6007a24b-2db6-4095-9bfb-c27fddd296d6 ecs-test-0001 5 3aa7f8de-f350-45ff-957a-b433886ac6a9 ecs-test-0004 请输入要删除 ECS 的序号(0..5), 无效输入将取消删除操作。 1 正在删除 ECS ecs-test-0006, ID: 22858c35-7da0-4395-8429-ccc724d66ab9... 请选择: 0. 只删除 ECS 1. 删除 ECS 且删除绑定的数据盘和弹性公网IP 2. 放弃删除 1 删除成功, Id=ff8080817395c20d0174539e00b74c0b 删除任务信息: Job(status=INIT, entities=JobEntities(subJobsTotal=null, subJobs=null), jobId=ff8080817395c20d0174539e00b74c0b, jobType=deleteVMs, beginTime=2020-09-03T10:58:17.909Z, endTime=, errorCode=null, failReason=null, message=null, code=null, subJobsTotal=null, subJobs=null)