本文通过阿里云ECS Java SDK调用DescribeAvailableResource查询云服务器ECS实例的可用规格资源列表以及上架可用区。适用于新建ECS实例前的准备工作。
前提条件
您使用的aliyun-java-sdk-ecs版本必须大于等于4.6.3。
背景信息
创建一台ECS实例前,您可以调用DescribeAvailableResource查看指定地域或者可用区内的实例资源供给情况。详情请参见DescribeAvailableResource。本文主要从地域、可用区、计费方式以及实例规格族等方法出发设置对象参数,您也可以自行设置I/O优化、系统盘以及数据盘等参数筛选查询结果。
查询指定地域下包年包月ECS实例
以中国杭州地域为例,查询您可以购买的包年包月计费方式的实例规格列表。
/**
* 假设目标地域为中国杭州,查询包年包月(包含按周)计费方式上架的实例规格列表
* 目标地域:cn-hangzhou
* 任意可用区中:不设置zoneId
* 包年包月(包含按周):InstanceChargeType取值为PrePaid,不设置SpotStrategy或者设置为NoSpot
*
* 说明:若参数DestinationResource取值为InstanceType,则必须传入参数IoOptimized
* 步骤:
* 1. 查询可用I/O优化资源
* 2. 查询可用实例规格资源
* 返回结果:
* 按ZoneId返回实例规格资源列表
* 没有可用实例规格资源,返回null或者空Map
*/
public Map<String,Set<String>> doDescribeScene1() {
DescribeAvailableResourceRequest describe = new DescribeAvailableResourceRequest();
describe.setRegionId("cn-hangzhou");
describe.setInstanceChargeType("PrePaid");
// 1. 查询可用I/O优化资源
describe.setDestinationResource(IoOptimized);
Map<String, Set<String>> ioOptimizeds = doActionAndProcessResponse(describe);
if (null == ioOptimizeds) {
return null;
}
// 设置实例规格资源列表allTypes,key等于zoneId,values等于实例规格列表
Map<String,Set<String>> allTypes = new HashMap<String, Set<String>>();
for (String zoneId : ioOptimizeds.keySet()) {
describe.setZoneId(zoneId);
describe.setDestinationResource(InstanceType);
for(String iopts : ioOptimizeds.get(zoneId)){
describe.setIoOptimized(iopts);
}
Set<String> allTypesInZoneId = allTypes.get(zoneId);
Map<String, Set<String>> types = doActionAndProcessResponse(describe);
Set<String> typesInZoneId = types.get(zoneId);
if(null != allTypesInZoneId){
allTypesInZoneId.addAll(typesInZoneId);
}else{
allTypes.put(zoneId, typesInZoneId);
}
}
return allTypes;
}
查询指定地域下按量付费ECS实例
以中国杭州地域为例,查询您可以购买的按量付费计费方式的实例规格列表。
/**
* 假设目标地域为中国杭州,查询按量付费计费方式上架的实例规格列表
* 目标地域:cn-hangzhou
* 任意可用区中:不设置zoneId
* 按量付费:不设置InstanceChargeType或者设置为PostPaid,不设置SpotStrategy或者设置为NoSpot
*
* 说明:若参数DestinationResource取值为InstanceType,则必须传入参数IoOptimized
* 步骤:
* 1. 查询可用I/O优化资源
* 2. 查询可用实例规格资源
* 返回结果:
* 按ZoneId返回实例规格资源列表
* 没有可用实例规格资源,返回null或者空Map
*/
public Map<String,Set<String>> doDescribeScene2() {
DescribeAvailableResourceRequest describe = new DescribeAvailableResourceRequest();
describe.setRegionId("cn-hangzhou");
describe.setInstanceChargeType("PostPaid");
// 1.查询可用I/O优化资源
describe.setDestinationResource(IoOptimized);
Map<String, Set<String>> ioOptimizeds = doActionAndProcessResponse(describe);
if (null == ioOptimizeds) {
return null;
}
// 设置实例规格资源列表allTypes,key等于zoneId,values等于实例规格列表
Map<String,Set<String>> allTypes = new HashMap<String, Set<String>>();
for (String zoneId : ioOptimizeds.keySet()) {
describe.setZoneId(zoneId);
describe.setDestinationResource(InstanceType);
for(String iopts : ioOptimizeds.get(zoneId)){
describe.setIoOptimized(iopts);
}
Set<String> allTypesInZoneId = allTypes.get(zoneId);
Map<String, Set<String>> types = doActionAndProcessResponse(describe);
Set<String> typesInZoneId = types.get(zoneId);
if(null != allTypesInZoneId){
allTypesInZoneId.addAll(typesInZoneId);
}else{
allTypes.put(zoneId, typesInZoneId);
}
}
return allTypes;
}
查询指定地域下抢占式实例的规格列表
以中国杭州地域为例,查询您可以购买的抢占式实例的实例规格列表。
/**
* 假设目标地域为中国杭州,查询上架的抢占式实例的规格列表
* 目标地域:cn-hangzhou
* 任意可用区中:不设置zoneId
* 按量付费:不设置InstanceChargeType或者设置为PostPaid,SpotStrategy设置为SpotWithPriceLimit或者SpotAsPriceGo
* 说明:若参数DestinationResource取值为InstanceType,则必须传入参数IoOptimized
* 步骤:
* 1. 查询可用I/O优化资源
* 2. 查询可用实例规格资源
* 返回结果:
* 按ZoneId返回实例规格资源列表
* 没有可用实例规格资源,返回null或者空Map
*/
public Map<String,Set<String>> doDescribeScene3() {
DescribeAvailableResourceRequest describe = new DescribeAvailableResourceRequest();
describe.setRegionId("cn-hangzhou");
describe.setInstanceChargeType("PostPaid");
describe.setSpotStrategy("SpotWithPriceLimit");
// describe.setSpotStrategy("SpotAsPriceGo");
// 1.查询可用I/O优化资源
describe.setDestinationResource(IoOptimized);
Map<String, Set<String>> ioOptimizeds = doActionAndProcessResponse(describe);
if (null == ioOptimizeds) {
return null;
}
// 设置实例规格资源列表allTypes,key等于zoneId,values等于实例规格列表
Map<String,Set<String>> allTypes = new HashMap<String, Set<String>>();
for (String zoneId : ioOptimizeds.keySet()) {
describe.setZoneId(zoneId);
describe.setDestinationResource(InstanceType);
for(String iopts : ioOptimizeds.get(zoneId)){
describe.setIoOptimized(iopts);
}
Set<String> allTypesInZoneId = allTypes.get(zoneId);
Map<String, Set<String>> types = doActionAndProcessResponse(describe);
Set<String> typesInZoneId = types.get(zoneId);
if(null != allTypesInZoneId){
allTypesInZoneId.addAll(typesInZoneId);
}else{
allTypes.put(zoneId, typesInZoneId);
}
}
return allTypes;
}
查询指定实例规格的上架可用区
以中国杭州地域为例,查询您可以购买的包年包月计费方式的指定实例规格的供货可用区。
/**
* 假设目标地域为中国杭州,查询采用包年包月计费方式的ecs.gn4.8xlarge实例规格有供货的可用区
* 目标地域:cn-hangzhou
* 任意可用区中:不设置zoneId
* 目标规格:ecs.gn4.8xlarge
* 包年包月(包含按周):InstanceChargeType设置为PrePaid,不设置SpotStrategy或者设置为NoSpot
*
* 说明:若参数DestinationResource取值为InstanceType,则必须传入参数IoOptimized
* 步骤:
* 1. 查询可用I/O优化资源
* 2. 查询可用实例规格资源
* 返回结果:
* 支持售卖的可用区列表
* 没有支持售卖的可用区,返回null或者空
*/
public List<String> doDescribeScene4() {
DescribeAvailableResourceRequest describe = new DescribeAvailableResourceRequest();
describe.setRegionId("cn-hangzhou");
describe.setInstanceChargeType("PrePaid");
describe.setInstanceType("ecs.gn4.8xlarge");
// 1.查询可用io优化资源
describe.setDestinationResource(IoOptimized);
Map<String, Set<String>> ioOptimizeds = doActionAndProcessResponse(describe);
if (null == ioOptimizeds) {
return null;
}
// 支持该规格的可用区(zones)
List<String> zones = new ArrayList<String>(ioOptimizeds.size());
for (String zoneId : ioOptimizeds.keySet()) {
describe.setZoneId(zoneId);
describe.setDestinationResource(InstanceType);
for(String iopts : ioOptimizeds.get(zoneId)){
describe.setIoOptimized(iopts);
}
Map<String, Set<String>> typesMap = doActionAndProcessResponse(describe);
Set<String> types = typesMap.get(zoneId);
if(CollectionUtils.isNotEmpty(types)){
if(types.contains("ecs.gn4.8xlarge")){
zones.add(zoneId);
}
}
}
if(CollectionUtils.isNotEmpty(zones)){
return zones;
}
return null;
}
查询指定可用区下包年包月VPC类型实例规格
以中国杭州地域为例,查询采用包年包月计费方式时,您可以购买的指定网络类型的实例规格的供货可用区。
/**
* 假设目标地域为中国杭州,目标可用区为E,查询采用包年包月计费方式时,支持专有网络VPC的实例规格列表
* 目标地域:cn-hangzhou
* 任意可用区中:cn-hangzhou-e
* 目标网络:专有网络vpc
* 包年包月(包含按周):InstanceChargeType传PrePaid,不设置SpotStrategy或者设置为NoSpot
*
* 说明:若参数DestinationResource取值为InstanceType,则必须传入参数IoOptimized
* 步骤:
* 1. 查询可用I/O优化资源
* 2. 查询可用实例规格资源
* 返回结果:
* 支持售卖的实例规格列表
* 没有可以售卖的实例规格,返回null或者空
*/
public List<String> doDescribeScene5() {
DescribeAvailableResourceRequest describe = new DescribeAvailableResourceRequest();
describe.setRegionId("cn-hangzhou");
describe.setZoneId("cn-hangzhou-e");
describe.setInstanceChargeType("PrePaid");
describe.setNetworkCategory("Vpc");
// 查询可用I/O优化资源
describe.setDestinationResource(IoOptimized);
Map<String, Set<String>> ioOptimizedMap = doActionAndProcessResponse(describe);
if (null == ioOptimizedMap) {
return null;
}
Set<String> ioOptimizeds = ioOptimizedMap.get("cn-hangzhou-e");
if(CollectionUtils.isEmpty(ioOptimizeds)) {
return null;
}
// 支持该规格的规格
Set<String> types = new HashSet<String>();
describe.setDestinationResource(InstanceType);
for(String iopts : ioOptimizeds){
describe.setIoOptimized(iopts);
Map<String, Set<String>> typesMap = doActionAndProcessResponse(describe);
Set<String> typesInMap = typesMap.get("cn-hangzhou-e");
if(CollectionUtils.isNotEmpty(typesInMap)){
types.addAll(typesInMap);
}
}
if(CollectionUtils.isNotEmpty(types)){
return new ArrayList<String>(types);
}
return null;
}