package com.muyu.common.config; import com.aliyun.ecs20140526.Client; import com.aliyun.ecs20140526.models.*; import com.aliyun.tea.TeaException; import com.aliyun.tea.TeaModel; import com.aliyun.teaopenapi.models.Config; import com.muyu.common.contents.CreateContents; import com.muyu.common.domain.CreateVo; import com.muyu.common.domain.DeleteServer; import com.muyu.common.domain.Icreate; import org.springframework.stereotype.Component; import java.util.List; /** * @author yn * @description 实例创建-查询-删除 * @date 2024-04-12 15:10 */ @Component public class CreateAnConfig { /** * Initialization 初始化公共请求参数 */ public static Client Initialization(String regionId) throws Exception { Config config = new Config(); // 您的AccessKey ID config.accessKeyId = CreateContents.ACCESSKEYIDDATA; // 您的AccessKey Secret config.accessKeySecret = CreateContents.ACCESSKEYSECRETDATA; // 您的可用区ID config.regionId = regionId; return new Client(config); } static int i = 1; public static void main(String[] args_) throws Exception { System.setOut(new java.io.PrintStream(System.out, true, "UTF-8")); List args = java.util.Arrays.asList(args_); Client client = ClientConfig.createClient(); DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest() .setRegionId("cn-shanghai") .setInstanceName("Test-server") .setPageSize(10); com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions(); try { // 复制代码运行请自行打印 API 的返回值 DescribeInstancesResponse describeInstancesResponse = client.describeInstancesWithOptions(describeInstancesRequest, runtime); DescribeInstancesResponseBody body = describeInstancesResponse.getBody(); DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstances instances = body.getInstances(); List instance = instances.getInstance(); instance.stream().forEach(item->{ System.out.println("实例{" + i + "}的ID:" + item.getInstanceId()); System.out.println("名称:" + item.getInstanceName()); System.out.println("地域ID:" + item.getRegionId()); System.out.println("状态:" + item.getStatus()); System.out.println("类型:" + item.getInstanceType()); System.out.println("CPU核心数:" + item.getCpu()); System.out.println("内存大小:" + item.getMemory() + "MB"); System.out.println("磁盘大小:" + item.getLocalStorageCapacity() + "G"); System.out.println("操作系统:" + item.getOSName()); System.out.println("网络类型:" + item.getInstanceNetworkType()); System.out.println("公网出带宽值:" + item.getInternetMaxBandwidthOut() + "Mbit/s"); System.out.println("公网入带宽值:" + item.getInternetMaxBandwidthIn() + "Mbit/s"); System.out.println("公网IP:" + item.getPublicIpAddress().getIpAddress()); System.out.println("私网IP:" + item.getVpcAttributes().getPrivateIpAddress().ipAddress); System.out.println("专有网络VPCID:" + item.getVpcAttributes().getVpcId()); System.out.println("安全组ID:" + item.getSecurityGroupIds().getSecurityGroupId()); System.out.println("创建时间:" + item.getCreationTime()); System.out.println("到期时间:" + item.getExpiredTime()); System.out.println("是否可以回收:" + (item.getRecyclable()?"是":"否") + "\n\n"); i++; }); } catch (TeaException error) { // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。 // 错误 message System.out.println(error.getMessage()); // 诊断地址 System.out.println(error.getData().get("Recommend")); com.aliyun.teautil.Common.assertAsString(error.message); } catch (Exception _error) { TeaException error = new TeaException(_error.getMessage(), _error); // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。 // 错误 message System.out.println(error.getMessage()); // 诊断地址 System.out.println(error.getData().get("Recommend")); com.aliyun.teautil.Common.assertAsString(error.message); } } /** * 查询实例方法 * @throws Exception */ public static void findByCreate(CreateVo createVo) throws Exception { //java.util.List args = java.util.Arrays.asList(args_); // 地域Id //String regionId = "cn-shanghai"; String regionId = createVo.getRedionId(); // 要查询的资源类型。取值范围: // Zone:可用区。 // IoOptimized:I/O 优化。 // InstanceType:实例规格。 // SystemDisk:系统盘。 // DataDisk:数据盘。 // Network:网络类型。 // ddh:专有宿主机。 //String destinationResource = "InstanceType"; String destinationResource = createVo.getDestinationResource(); // 是否为I/O优化实例 // optimized:I/O优化 // none:非IO优化 //String ioOptimized = "optimized"; String ioOptimized = createVo.getIoOptimized(); // 实例规格 //说明: 如果您指定了InstanceType,则无法指定Cores或者Memory。 //String instanceType = "ecs.u1-c1m1.large"; String instanceType = createVo.getInstanceType(); Client client = CreateAnConfig.Initialization(regionId); // 查询指定地域下所有可用区的库存供应情况 CreateAnConfig.DescribeAvailableResource(client, regionId, destinationResource, ioOptimized, instanceType); } /** * DescribeAvailableResource 查询指定地域下所有可用区的库存供应情况 */ public static void DescribeAvailableResource(Client client, String regionId, String destinationResource, String ioOptimized, String instanceType) throws Exception { System.setOut(new java.io.PrintStream(System.out, true, "UTF-8")); DescribeAvailableResourceRequest request = new DescribeAvailableResourceRequest() .setRegionId(regionId) .setDestinationResource(destinationResource) .setIoOptimized(ioOptimized) .setInstanceType(instanceType); try { com.aliyun.teaconsole.Client.log("--------------------查询" + regionId + "地域下所有可用区的" + instanceType + "库存供应情况:--------------------"); DescribeAvailableResourceResponse responces = client.describeAvailableResource(request); com.aliyun.teaconsole.Client.log("--------------------查询结果:" + com.aliyun.teautil.Common.toJSONString(TeaModel.buildMap(responces.body.availableZones)) + "--------------------"); } catch (TeaException error) { com.aliyun.teaconsole.Client.log("--------------------查询失败:" + com.aliyun.teautil.Common.toJSONString(error.code) + "--------------------"); } catch (Exception _error) { TeaException error = new TeaException(_error.getMessage(), _error); com.aliyun.teaconsole.Client.log("--------------------查询失败:" + com.aliyun.teautil.Common.toJSONString(error.code) + "--------------------"); } } /** * 创建实例方法 * @param icreate * @throws Exception */ public static String createAnServer(Icreate icreate) throws Exception { // java.util.List args = java.util.Arrays.asList(args_); // 地域Id //String regionId = "cn-shanghai"; String regionId = icreate.getRehionId(); // 镜像 ID,启动实例时选择的镜像资源。 // String imageId = "m-uf6elrscl3c9wk6o762l"; String imageId = icreate.getImageId(); // 实例规格 //String instanceType = "ecs.u1-c1m1.large"; String instanceType = icreate.getInstanceType(); // 新创建实例所属于的安全组 ID。 //String securityGroupId = "sg-uf6bj6vxp8ruhvffdsau"; String securityGroupId = icreate.getSecurityGroupId(); // 虚拟交换机 ID。 //String vSwitchId = "vsw-uf66jtgij0ptqxf1ix6l7 "; String vSwitchId = icreate.getVSwitchId(); // 公网出带宽最大值,单位为 Mbit/s。取值范围:0~100。 默认值:0。 //Integer internetMaxBandwidthOut = Integer.parseInt("2"); Integer internetMaxBandwidthOut = Integer.parseInt(icreate.getInternetMaxBandwidthOut()); // 网络计费类型。取值范围: // PayByBandwidth: 按固定带宽计费。 // PayByTraffic: 按使用流量计费。 // 默认值:PayByTraffic。 //String internetChargeType = "PayByTraffic"; String internetChargeType = icreate.getInternetChargeType(); // 系统盘大小 //String size = "20"; String size = icreate.getSize(); // 系统盘的云盘种类 //String category = "cloud_essd"; String category = icreate.getCategory(); // ECS实例的计费方式 // PrePaid:包年包月 // PostPaid:按量付费 //String instanceChargeType = "PostPaid"; String instanceChargeType = icreate.getInstanceChargeType(); Client client = CreateAnConfig.Initialization(regionId); // 批量创建实例 String instances = CreateAnConfig.RunInstances(client, regionId, imageId, instanceType, securityGroupId, vSwitchId, internetMaxBandwidthOut, internetChargeType, size, category, instanceChargeType); return instances; } /** * RunInstances 通过备选实例规格创建ECS实例最佳实践 * 该场景中,在调用RunInstances创建ECS实例时判断是否发生库存不足等错误,如果发生错误,将调用DescribeRecommendInstanceType查询备选实例,然后通过备选实例规格重新创建ECS实例。 */ public static String RunInstances(Client client, String regionId, String imageId, String instanceType, String securityGroupId, String vSwitchId, Integer internetMaxBandwidthOut, String internetChargeType, String size, String category, String instanceChargeType) throws Exception { System.setOut(new java.io.PrintStream(System.out, true, "UTF-8")); RunInstancesRequest request1 = new RunInstancesRequest() .setRegionId(regionId) .setImageId(imageId) .setInstanceType(instanceType) .setSecurityGroupId(securityGroupId) .setVSwitchId(vSwitchId) .setInstanceName("Myname") .setDescription("Myprocure") .setInternetMaxBandwidthOut(internetMaxBandwidthOut) .setInternetChargeType(internetChargeType) .setInstanceChargeType(instanceChargeType) // 批量创建五台ECS实例,如果不设置该参数,默认创建一台ECS实例。 // amount = 5, // 如果缺少库存可以接受的最低创建数量。 // minAmount = 2, // 打开预检参数功能,不会实际创建ECS实例,只检查参数正确性、用户权限或者ECS库存等问题。 // 实际情况下,设置了DryRun参数后,Amount必须为1,MinAmount必须为空,您可以根据实际需求修改代码。 .setDryRun(false) .setSystemDisk(new RunInstancesRequest.RunInstancesRequestSystemDisk() .setSize(size) .setCategory(category)); RunInstancesResponse responces = client.runInstances(request1); try { com.aliyun.teaconsole.Client.log("--------------------批量创建实例开始--------------------"); com.aliyun.teaconsole.Client.log("--------------------创建实例成功,实例ID:" + com.aliyun.teautil.Common.toJSONString(responces.body.instanceIdSets.instanceIdSet) + "--------------------"); } catch (TeaException error) { com.aliyun.teaconsole.Client.log("--------------------创建实例失败:" + error+ "--------------------"); } catch (Exception _error) { TeaException error = new TeaException(_error.getMessage(), _error); com.aliyun.teaconsole.Client.log("--------------------创建实例失败:" +error + "--------------------"); } return com.aliyun.teautil.Common.toJSONString(responces.body.instanceIdSets.instanceIdSet); } public static DescribeInstancesResponse DescribeInstances(Client client, String regionId, String instanceIds, String instanceName) throws Exception { DescribeInstancesRequest req = new DescribeInstancesRequest() .setRegionId(regionId) .setInstanceName(instanceName); if (!com.aliyun.teautil.Common.empty(instanceIds)) { req.instanceIds = com.aliyun.teautil.Common.toJSONString(com.aliyun.darabonbastring.Client.split(instanceIds, ",", 50)); } DescribeInstancesResponse resp = client.describeInstances(req); com.aliyun.teaconsole.Client.log("--------------------查询需要删除的实例--------------------"); return resp; } public static void ModifyInstanceAttribute(Client client, String instatnceId) throws Exception { ModifyInstanceAttributeRequest req = new ModifyInstanceAttributeRequest() .setInstanceId(instatnceId) .setDeletionProtection(false); client.modifyInstanceAttribute(req); com.aliyun.teaconsole.Client.log("--------------------" + instatnceId + "释放保护取消成功--------------------"); } public static void DeleteInstances(Client client, String regionId, String instanceIds, String force) throws Exception { DeleteInstancesRequest req = new DeleteInstancesRequest() .setRegionId(regionId) .setInstanceId(com.aliyun.darabonbastring.Client.split(instanceIds, ",", 50)) .setForce(com.aliyun.teautil.Common.equalString(force, "true")); DeleteInstancesResponse resp = client.deleteInstances(req); com.aliyun.teaconsole.Client.log("--------------------实例释放成功--------------------"); com.aliyun.teaconsole.Client.log(com.aliyun.teautil.Common.toJSONString(com.aliyun.teautil.Common.toMap(resp))); } /** * 批量删除实力 * @param deleteServer * @throws Exception */ public static void DeleServerCreateAn(DeleteServer deleteServer) throws Exception { // 区域ID //String regionId = "cn-shanghai"; String regionId = deleteServer.getRegionId(); // 多个实例ID,用英文逗号分隔 //String instanceIds = "i-uf6h4s0jtpvobykd7vzc"; String instanceIds = deleteServer.getInstanceIds(); // 实例名称,支持使用通配符*进行模糊搜索 //String instanceName = "MyFirstEcsInstance"; String instanceName = deleteServer.getInstanceName(); // 强制删除有删除保护的机器 //String deleteProtected = "true"; String deleteProtected = deleteServer.getDeleteProtected(); // 强制删除运行中的机器 //String force = "true"; String force = deleteServer.getForce(); Client client = CreateAnConfig.Initialization(regionId); if (com.aliyun.teautil.Common.equalString(deleteProtected, force)) { DescribeInstancesResponse describeInstancesResp = CreateAnConfig.DescribeInstances(client, regionId, instanceIds, instanceName); instanceIds = ""; for (DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstance instance : describeInstancesResp.body.instances.instance) { instanceIds = "" + instance.instanceId + "," + instanceIds + ""; if (instance.deletionProtection) { CreateAnConfig.ModifyInstanceAttribute(client, instance.instanceId); } } instanceIds = com.aliyun.darabonbastring.Client.subString(instanceIds, 0, -1); } if (com.aliyun.teautil.Common.empty(instanceIds)) { com.aliyun.teaconsole.Client.log("--------------------无有效实例可删除--------------------"); return ; } CreateAnConfig.DeleteInstances(client, regionId, instanceIds, force); } }