变更ECS实例规格
更新时间:2019-11-12 16:31:40
本教程详细介绍如何使用Alibaba Cloud SDK for Java变更ECS实例规格(可修改公网宽带大小)。 在使用本教程前,请确保已完成以下操作:
前提条件
<dependencies>
<!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-core -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.4.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-ecs-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-ecs</artifactId>
<version>4.17.4</version>
</dependency>
</dependencies>
代码示例
本文操作示例主要以代码形式体现,具体代码如下:
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.ecs.model.v20140526.DescribeResourcesModificationRequest;
import com.aliyuncs.ecs.model.v20140526.DescribeResourcesModificationResponse;
import com.aliyuncs.ecs.model.v20140526.DescribeResourcesModificationResponse.AvailableZone.AvailableResource.SupportedResource;
import com.aliyuncs.ecs.model.v20140526.ModifyInstanceSpecRequest;
import com.aliyuncs.ecs.model.v20140526.ModifyInstanceSpecResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.google.gson.Gson;
import java.util.List;
/**
* DescribeResourcesModification 查询升级和降配实例规格或者系统盘时,某一可用区的可用资源信息
* ModifyInstanceSpec 调整一台按量付费ECS实例的实例规格和公网带宽大小
*/
public class ModifyInstance {
// 已关机状态的ECS实例
private static String instancenId = "i-bp1gh*****";
public static void main(String[] args) {
Gson gson = new Gson();
IAcsClient client = Initialization();
// 查询某实例升级实例规则时的可用资源信息
List<DescribeResourcesModificationResponse.AvailableZone> availableZones = DescribeResourcesModification(client);
System.out.println("--------------------Available resource information for instance rules--------------------");
System.out.println(gson.toJson(availableZones));
// 获取实例的可用资源信息
// (此处应根据实际情况或者结合前端业务来进行)
SupportedResource supportedResource = availableZones.get(0).getAvailableResources().get(0).getSupportedResources().get(0);
// 支持的可供创建的具体资源
ModifyInstanceSpecResponse response = ModifyInstanceSpec(client, supportedResource.getValue());
System.out.println("--------------------Instance specification changes successfully--------------------");
System.out.println(gson.toJson(response));
}
/**
* ModifyInstanceSpec 调整一台按量付费ECS实例的实例规格和公网带宽大小
*/
private static ModifyInstanceSpecResponse ModifyInstanceSpec(IAcsClient client, String value) {
ModifyInstanceSpecRequest request = new ModifyInstanceSpecRequest();
// 指定的实例ID
request.setInstanceId(instancenId);
/**
* 是否支持跨集群升级实例规格。默认值:false
* 当参数AllowMigrateAcrossZone取值为true时,一旦您根据返回信息升级了云服务器,请留意以下注意事项:
*
* 经典网络类型实例:
* 对于已停售的实例规格,非I/O优化实例变配到I/O优化实例时,实例私网IP地址、磁盘设备名和软件授权码会发
* 生变化。对于Linux实例,普通云盘(cloud)会被识别为xvda或者xvdb等,高效云盘(cloud_efficiency)
* 和SSD云盘(cloud_ssd)会被识别为vda或者vdb等。
* 对于正常售卖的实例规格族,实例的私网IP地址会发生变化。
*
* 专有网络VPC类型实例:
* 对于已停售的实例规格,非I/O优化实例变配到I/O优化实例时,云服务器磁盘设备名和软件授权码会发生变化。Linux
* 实例的普通云盘(cloud)会被识别为xvda或者xvdb等,高效云盘(cloud_efficiency)和SSD云盘(cloud_ssd)
* 会被识别为vda或者vdb等。
*/
request.setAllowMigrateAcrossZone(false);
request.setAsync(true);
request.setInstanceType(value);
try {
return client.getAcsResponse(request);
} catch (ClientException e) {
System.out.println("ErrCode:" + e.getErrCode());
System.out.println("ErrMsg:" + e.getErrMsg());
System.out.println("RequestId:" + e.getRequestId());
throw new RuntimeException();
}
}
/**
* DescribeResourcesModification 查询升级和降配实例规格或者系统盘时,某一可用区的可用资源信息
*/
private static List<DescribeResourcesModificationResponse.AvailableZone> DescribeResourcesModification(IAcsClient client) {
DescribeResourcesModificationRequest request = new DescribeResourcesModificationRequest();
//
request.setDestinationResource("InstanceType");
request.setResourceId(instancenId);
try {
DescribeResourcesModificationResponse response = client.getAcsResponse(request);
return response.getAvailableZones();
} catch (ClientException e) {
System.out.println("ErrCode:" + e.getErrCode());
System.out.println("ErrMsg:" + e.getErrMsg());
System.out.println("RequestId:" + e.getRequestId());
throw new RuntimeException();
}
}
/**
* Initialization 初始化公共请求参数
*/
private static IAcsClient Initialization() {
// 初始化请求参数
DefaultProfile profile = DefaultProfile.getProfile(
"<your-region-id>", // 您的可用区ID
"<your-access-key-id>", // 您的AccessKey ID
"<your-access-key-secret>"); // 您的AccessKey Secret
return new DefaultAcsClient(profile);
}
}
执行结果
正确的返回结果类似如下:
--------------------Available resource information for instance rules--------------------
[
{
"regionId": "cn-hangzhou-dg-a01",
"zoneId": "cn-hangzhou-h",
"status": "Available",
"statusCategory": "WithStock",
"availableResources": [
{
"type": "InstanceType",
"supportedResources": [
{
"value": "ecs.hfc5.large",
"status": "Available",
"statusCategory": "WithStock"
},
{
"value": "ecs.t5-c1m1.large",
"status": "Available",
"statusCategory": "WithStock"
},
{
"value": "ecs.ic5.3xlarge",
"status": "Available",
"statusCategory": "WithStock"
},
{
"value": "ecs.c5.large",
"status": "Available",
"statusCategory": "WithStock"
},
{
"value": "ecs.t5-c1m1.xlarge",
"status": "Available",
"statusCategory": "WithStock"
}
]
}
]
}
]
--------------------Instance specification changes successfully--------------------
{"requestId":"BAC795D9-D8F1-4E76-9F69-75EA47B5FD4B"}