进阶玩法:针对ECS新购选型场景查询可用资源

本文涉及的产品
轻量应用服务器 2vCPU 1GiB,适用于搭建电商独立站
轻量应用服务器 2vCPU 4GiB,适用于网站搭建
轻量应用服务器 4vCPU 16GiB,适用于搭建游戏自建服
简介: 创建实例总碰到没有资源,没有权限,产品限制等原因导致失败,到底哪些资源是可以使用的呢?我们说说针对ECS选型场景,如何查询ECS实例可用资源列表。

  • 接口名称(查询某一可用区的资源列表)

DescribeAvailableResource

  • 背景:

选购云服务ECS时,在指定条件下有哪些资源是可用的?如何更好的选择所需的资源?针对用户的ECS购买选型,介绍如何利用DescribeAvailableResource接口查询可用资源

  • 针对选型场景做相应的查询

场景1. 用户在杭州地域下,包年包月(包含按周)ecs实例可以售卖实例规格列表
场景2. 用户在杭州地域下,按量ecs实例可以售卖实例规格列表
场景3. 用户在杭州地域下,Spot实例可以售卖实例规格列表
场景4. 用户选购包年包月ecs.gn4.8xlarge规格的实例,在杭州地域下那个可用区可售卖
场景5. 用户在杭州可用区E下,带vpc网络包年包月实例可以售卖实例规格列表

除了您现在看到的这文章,您还可以前往:

DescribeAvailableResource接口文档
查询ECS可用的资源接口实践

aliyun-java-sdk-ecs版本在4.6.3及以上。


接口要点概述

您可以通过DescribeAvailableResource指定不同目标资源( DestinationResource )查询不同类型的资源列表,再指定其他条件细化资源条件。目标资源( DestinationResource) 的各个可选取值有不同的逻辑与(&&)要求。在下列顺序列表中,排在越后面的参数其逻辑与(&&)苛刻程度越高。
顺序:(Zone)> IoOptimized > InstanceType > SystemDisk > DataDisk
取值示例:
若参数 DestinationResource 取值为 SystemDisk,则必须传入参数 IoOptimized 和 InstanceType。
若参数 DestinationResource 取值为 InstanceType,则必须传入参数 IoOptimized。
若参数 DestinationResource 取值为 DataDisk,则必须传入参数 IoOptimized、InstanceType 和 SystemDiskCategory。

使用场景事例

事例使用的公共方法在后面给出。
AI 代码解读

场景1. 用户在杭州地域下,包年包月(包含按周)ecs实例可以售卖实例规格列表

    /**
     *  场景1. 用户在杭州地域下,包年包月(包含按周)ecs实例可以售卖实例规格列表
     *  目标地域 : cn-hangzhou
     *  任意可用区中: zoneId不传
     *  包年包月(包含按周):InstanceChargeType PrePaid
     *       SpotStrategy 不传或者NoSpot
     *
     *  说明 : 若参数 DestinationResource 取值为 InstanceType,则必须传入参数 IoOptimized
     *  步骤
     *  1.查询可用io优化资源
     *  2.查询可用实例规格资源
     *  返回结果:
     *     按ZoneId返回实例规格资源列表
     *     没有可用实例规格资源,返回null或者空Map
     */
    public Map<String,Set<String>> doDescribeScene1() {
        DescribeAvailableResourceRequest describe = new DescribeAvailableResourceRequest();
        describe.setRegionId("cn-hangzhou");
        describe.setInstanceChargeType("PrePaid");
        // 1.查询可用io优化资源
        describe.setDestinationResource(IOOPTIMIED);
        Map<String, Set<String>> ioOptimizeds = doActionAndProcessResponse(describe);
        if (null == ioOptimizeds) {
            // 没有io优化资源,查询不到对应的规格资源
            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;
    }
AI 代码解读

场景2. 用户在杭州地域下,按量ecs实例可以售卖实例规格列表

   /**
     *  场景2. 用户在杭州地域下,按量ecs实例可以售卖实例规格列表
     *  目标地域 : cn-hangzhou
     *  任意可用区中: zoneId不传
     *  包年包月(包含按周):InstanceChargeType 不传或者PostPaid
     *       SpotStrategy 不传或者NoSpot
     *
     *  说明 : 若参数 DestinationResource 取值为 InstanceType,则必须传入参数 IoOptimized
     *  步骤
     *  1.查询可用io优化资源
     *  2.查询可用实例规格资源
     *  返回结果:
     *     按ZoneId返回实例规格资源列表
     *     没有可用实例规格资源,返回null或者空Map
     */
    public Map<String,Set<String>> doDescribeScene2() {
        DescribeAvailableResourceRequest describe = new DescribeAvailableResourceRequest();
        describe.setRegionId("cn-hangzhou");
        describe.setInstanceChargeType("PostPaid");
        // 1.查询可用io优化资源
        describe.setDestinationResource(IOOPTIMIED);
        Map<String, Set<String>> ioOptimizeds = doActionAndProcessResponse(describe);
        if (null == ioOptimizeds) {
            // 没有io优化资源,查询不到对应的规格资源
            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;
    }
AI 代码解读

场景3. 用户在杭州地域下,Spot实例可以售卖实例规格列表

    /**
     *  场景3. 用户在杭州地域下,Spot实例可以售卖实例规格列表
     *  目标地域 : cn-hangzhou
     *  任意可用区中: zoneId不传
     *  包年包月(包含按周):InstanceChargeType 不传或者PostPaid
     *       SpotStrategy 传SpotWithPriceLimit 或者 SpotAsPriceGo
     *
     *  说明 : 若参数 DestinationResource 取值为 InstanceType,则必须传入参数 IoOptimized
     *  步骤
     *  1.查询可用io优化资源
     *  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.查询可用io优化资源
        describe.setDestinationResource(IOOPTIMIED);
        Map<String, Set<String>> ioOptimizeds = doActionAndProcessResponse(describe);
        if (null == ioOptimizeds) {
            // 没有io优化资源,查询不到对应的规格资源
            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;
    }
AI 代码解读

场景4. 用户选购包年包月ecs.gn4.8xlarge规格的实例,在杭州地域下那个可用区可售卖

   /**
     *  场景4. 用户选购包年包月ecs.gn4.8xlarge规格的实例,在杭州地域下那个可用区可售卖
     *  目标地域 : cn-hangzhou
     *  任意可用区中: zoneId不传
     *  目标规格: ecs.gn4.8xlarge
     *  包年包月(包含按周):InstanceChargeType 传PrePaid
     *       SpotStrategy 不传或者NoSpot
     *
     *  说明 : 若参数 DestinationResource 取值为 InstanceType,则必须传入参数 IoOptimized
     *  步骤
     *  1.查询可用io优化资源
     *  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) {
            // 没有io优化资源,查询不到对应的规格资源
            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;
    }
AI 代码解读

场景5. 用户在杭州可用区E下,带vpc网络包年包月实例可以售卖实例规格列表

    /**
     *  场景5. 用户在杭州可用区E下,带vpc网络包年包月实例可以售卖实例规格列表
     *  目标地域 : cn-hangzhou
     *  任意可用区中: cn-hangzhou-e
     *  目标网络:vpc
     *  包年包月(包含按周):InstanceChargeType 传PrePaid
     *       SpotStrategy 不传或者NoSpot
     *
     *  说明 : 若参数 DestinationResource 取值为 InstanceType,则必须传入参数 IoOptimized
     *  步骤
     *  1.查询可用io优化资源
     *  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");
        // 1.查询可用io优化资源
        describe.setDestinationResource(IOOPTIMIED);
        Map<String, Set<String>> ioOptimizedMap = doActionAndProcessResponse(describe);
        if (null == ioOptimizedMap) {
            // 没有io优化资源,查询不到对应的规格资源
            return null;
        }
        Set<String> ioOptimizeds = ioOptimizedMap.get("cn-hangzhou-e");
        // 没有io优化资源,查询不到对应的规格资源
        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;
    }
AI 代码解读

sdk使用

    public DescribeAvailableResourceResponse doAction(DescribeAvailableResourceRequest describe) {
        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", product_accessKey, product_accessSecret);
        IAcsClient client = new DefaultAcsClient(profile);
        try {
            DescribeAvailableResourceResponse response = client.getAcsResponse(describe);
            System.out.println(JSON.toJSONString(response));
            return response;

        } catch (ClientException e) {
            e.printStackTrace();
        }
        return null;
    }
AI 代码解读

公共请求及结果处理


    private final static String IOOPTIMIED = "IoOptimized";
    private final static String INSTANCETYPE = "InstanceType";
    private final static String SYSTEMDISK = "SystemDisk";
    private final static String DATADISK = "DataDisk";
    private final static String ZONE = "Zone";
    private final static String NETWORK = "Network";

    // 发起请求并处理结果
    private Map<String,Set<String>> doActionAndProcessResponse(DescribeAvailableResourceRequest describe) {
        DescribeAvailableResourceResponse response = doAction(describe);
        Map<String,Set<String>> result = new HashMap<String, Set<String>>();
        if (null != response && CollectionUtils.isNotEmpty(response.getAvailableZones())) {
            for (AvailableZone availableZone : response.getAvailableZones()) {
                String zoneId = availableZone.getZoneId();
                Set<String> values = result.get(zoneId);
                if(CollectionUtils.isEmpty(values)){
                    values = new HashSet<String>();
                }
                if (CollectionUtils.isNotEmpty(availableZone.getAvailableResources())) {
                    for (AvailableResource resource : availableZone.getAvailableResources()) {
                        if (CollectionUtils.isNotEmpty(resource.getSupportedResources())) {
                            for (SupportedResource supportResource : resource.getSupportedResources()) {
                                //只取可用资源
                                if (supportResource.getStatus().equals("Available")) {
                                    values.add(supportResource.getValue());
                                }
                            }
                        }
                    }
                }else{
                    if (availableZone.getStatus().equals("Available")) {
                        values.add(availableZone.getZoneId());
                    }
                }
            }

            if (result.size() != 0) {
                return result;
            }
        }
        return null;
    }
AI 代码解读

过滤条件导致资源空

image.png
过滤条件导致没有可用资源时返回
image.png
再次强调:
若参数 DestinationResource 取值为 SystemDisk,则必须传入参数 IoOptimized 和 InstanceType。
若参数 DestinationResource 取值为 InstanceType,则必须传入参数 IoOptimized。
若参数 DestinationResource 取值为 DataDisk,则必须传入参数 IoOptimized、InstanceType 和 SystemDiskCategory
IoOptimized等必传参数没有传入时,则报错:
Code: Invalid.Param
Message: The input parameter DestinationResource that is mandatory for processing this request is not supplied.

相关实践学习
快速体验PolarDB开源数据库
本实验环境已内置PostgreSQL数据库以及PolarDB开源数据库:PolarDB PostgreSQL版和PolarDB分布式版,支持一键拉起使用,方便各位开发者学习使用。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情:&nbsp;https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
1
225
分享
相关文章
2025年阿里云GPU服务器租用价格、选型策略与应用场景详解
随着AI与高性能计算需求的增长,阿里云提供了多种GPU实例,如NVIDIA V100、A10、T4等,适配不同场景。2025年重点实例中,V100实例GN6v单月3830元起,适合大规模训练;A10实例GN7i单月3213.99元起,适用于混合负载。计费模式有按量付费和包年包月,后者成本更低。针对AI训练、图形渲染及轻量级推理等场景,推荐不同配置以优化成本和性能。阿里云还提供抢占式实例、ESSD云盘等资源优化策略,支持eRDMA网络加速和倚天ARM架构,助力企业在2025年实现智能计算的效率与成本最优平衡。 (该简介为原文内容的高度概括,符合要求的字符限制。)
ECS与VPS技术角力:从算力成本到免备案雷区,企业服务器选型合规指南
在数字化浪潮中,服务器选择至关重要。ECS(云服务器)和VPS(虚拟专用服务器)是热门选项。ECS基于云计算,提供高可用性和弹性伸缩,适合大型项目;VPS通过分割物理服务器实现资源独立,成本较低,适合小型应用。两者在网络、存储及计算性能上各有优劣,需根据需求选择。国内并不存在合法的免备案服务器,建议严格遵守法规,确保网站合法运营。
23 2
2025年NVIDIA RTX 4090云服务器租赁价格与选型指南
本文探讨了在主流云服务商尚未提供RTX 4090实例的背景下,如何选择高性能GPU服务器。分析了市场现状、替代方案性能,并推荐阿里云的GN7i(NVIDIA A10)、GN6v(NVIDIA V100)等实例,提供了成本优化策略与选型建议,确保用户在AI训练、图形渲染等场景中实现效率和成本的最佳平衡。
2025年NVIDIA RTX 4090服务器租赁价格与选型详解
随着AI训练、深度学习与图形渲染需求激增,NVIDIA RTX 4090显卡成为算力租赁市场的热门选择。本文从价格体系、配置适配、成本优化三方面解析4090服务器租赁策略,涵盖短租长租价格差异、主流平台对比、硬件配置建议及成本优化方案,助您精准匹配业务需求。此外,还介绍了阿里云高性能GPU实例作为替代方案,提供稳定性和生态集成优势。
阿里云服务器实例选择参考:根据业务场景选择云服务器实例规格
对于初次接触阿里云服务器的用户来说,面对众多实例规格往往不知道如何选择,因为云服务器实例规格不同,价格也不一样,往往会感到无从下手。本文旨在通过详细解析阿里云服务器的不同实例规格及其适用场景,为用户提供一份实用的选型指南,以供参考。
2025年阿里云企业高性能云服务器租用价格与选型详解
随着企业数字化转型,阿里云于2025年推出多款高性能云服务器实例,涵盖计算、通用和内存密集型场景。文章分析了企业选择云服务器的核心要点,包括明确业务需求(如计算密集型任务推荐计算型实例)、性能与架构升级(如第八代实例性能提升20%),以及第九代实例支持AI等高算力需求。同时提供了配置价格参考和成本优化策略,助力企业实现效率与成本的最优平衡。
深度学习在资源利用率优化中的应用:让服务器更聪明
深度学习在资源利用率优化中的应用:让服务器更聪明
107 6
2025年阿里云GPU服务器的租赁价格与选型指南
随着AI、深度学习等领域的发展,GPU服务器成为企业及科研机构的核心算力选择。阿里云提供多种GPU实例类型(如NVIDIA V100、A100等),涵盖计算型、共享型和弹性裸金属等,满足不同场景需求。本文详解2025年阿里云GPU服务器的核心配置、价格策略及适用场景,帮助用户优化选型与成本控制,实现高效智能计算。
2025年阿里云弹性裸金属服务器架构解析与资源配置方案
🚀 核心特性与技术创新:提供100%物理机性能输出,支持NVIDIA A100/V100 GPU直通,无虚拟化层损耗。网络与存储优化,400万PPS吞吐量,ESSD云盘IOPS达100万,RDMA延迟<5μs。全球部署覆盖华北、华东、华南及海外节点,支持跨地域负载均衡。典型应用场景包括AI训练、科学计算等,支持分布式训练和并行计算框架。弹性裸金属服务器+OSS存储+高速网络综合部署,满足高性能计算需求。
新手小白购买阿里云服务器省钱策略、配置选型与注意事项
针对初次使用阿里云服务器的用户,本文提供系统化的指导方案以优化成本并满足业务需求。首先介绍配置选型,包括实例类型(通用型、计算型、内存型)与基础配置建议;其次阐述省钱策略,如企业认证、合理选择计费模式及批量购买;最后提醒注意事项,涵盖带宽存储规划、地域网络优化及安全管理。新手可通过明确需求、选择配置、优化购买和持续监控四步快速上手,实现高效稳定的云端部署。 注:推荐配置基于2025年阿里云产品体系,具体信息请参考官网。

相关产品

  • 云服务器 ECS
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等