本文通过阿里云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(IOOPTIMIED);
        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(IOOPTIMIED);
        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(IOOPTIMIED);
        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(IOOPTIMIED);
        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(IOOPTIMIED);
        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;
    }

后续步骤

批量创建ECS实例