330 lines
17 KiB
Java
330 lines
17 KiB
Java
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<String> 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<DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstance> 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<String> 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<String> 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);
|
||
}
|
||
}
|