进阶接口:查询ECS新购可用的资源实践

本文涉及的产品
轻量应用服务器 2vCPU 4GiB,适用于搭建Web应用/小程序
轻量应用服务器 4vCPU 16GiB,适用于搭建游戏自建服
轻量应用服务器 2vCPU 4GiB,适用于网站搭建
简介: 云服务器ECS到底哪些资源是可以使用并创建成功的呢?针对这个问题,我们来说说如何高效查询可用的资源列表。

  • 在某一地域有哪些可用区
  • 在某一可用区有哪些可用网络类型
  • 在某一可用区有哪些可用IO优化资源
  • 在某一可用区有哪些可用实例规格
  • 在某一可用区有哪些可用系统盘类型
  • 在某一可用区有哪些可用数据盘类型
  • 进阶实践——联合查询

背景

ECS服务器有哪些资源是可售卖的?如何更好的选择所需的资源?怎么查询可用的目标资源列表?怎么通过API(像ECS售卖页面一样)玩转可用资源的花样选择?

说明

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

除了您现在看到的这文章,您还可以前往:
针对ECS创建场景查询可用资源


事例

sdk使用

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

    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;
    }

查询之前先确认所需资源的付费类型

image.png

查询可用区资源

    public void doDescribeAvailableZones() {
        DescribeAvailableResourceRequest describe = new DescribeAvailableResourceRequest();
        describe.setDestinationResource("Zone");
        describe.setRegionId("cn-hangzhou");
        // InstanceChargeType 默认为PostPaid
        // PrePaid:预付费,即 包年包月 ;
        // PostPaid:后付费,即 按量付费
        describe.setInstanceChargeType("PostPaid");
        // 当参数 InstanceChargeType 取值为 PostPaid 时,参数 SpotStrategy 才有效。
        // NoSpot:正常按量付费实例 ;
        // SpotWithPriceLimit:设置上限价格的竞价实例 ;
        // SpotAsPriceGo:系统自动出价,最高按量付费价格
        describe.setSpotStrategy("NoSpot");
        DescribeAvailableResourceResponse response = doAction(describe);
        if (null != response && CollectionUtils.isNotEmpty(response.getAvailableZones())) {
            List<AvailableZone> availableZones = response.getAvailableZones();
            List<String> list = new ArrayList<String>(availableZones.size());
            for (AvailableZone availableZone : availableZones) {
                if (availableZone.getStatus().equals("Available")) {
                    list.add(availableZone.getZoneId());
                }
            }
        }
    }

返回结果

{
    "availableZones": [
        {
            "availableResources": [],
            "regionId": "cn-hangzhou",
            "status": "Available",
            "zoneId": "cn-hangzhou-e"
        },
        {
            "availableResources": [],
            "regionId": "cn-hangzhou",
            "status": "Available",
            "zoneId": "cn-hangzhou-b"
        },
        {
            "availableResources": [],
            "regionId": "cn-hangzhou",
            "status": "Available",
            "zoneId": "cn-hangzhou-d"
        }
    ],
    "requestId": "0789B955-A173-4513-ADE4-80B7B4A4C921"
}

查询可用网络类型资源

    public void doDescribeAvailableNetworks() {
        DescribeAvailableResourceRequest describe = new DescribeAvailableResourceRequest();
        describe.setDestinationResource("Network");
        describe.setRegionId("cn-hangzhou");
        //不传就是查所有可用区
        describe.setZoneId("cn-hangzhou-e");
        // InstanceChargeType 默认为PostPaid
        // PrePaid:预付费,即 包年包月 ;
        // PostPaid:后付费,即 按量付费
        describe.setInstanceChargeType("PostPaid");
        // 当参数 InstanceChargeType 取值为 PostPaid 时,参数 SpotStrategy 才有效。
        // NoSpot:正常按量付费实例 ;
        // SpotWithPriceLimit:设置上限价格的竞价实例 ;
        // SpotAsPriceGo:系统自动出价,最高按量付费价格
        describe.setSpotStrategy("NoSpot");
        doAction(describe);
    }

返回结果

{
    "availableZones": [
        {
            "availableResources": [
                {
                    "supportedResources": [
                        {
                            "status": "Available",
                            "value": "classic"
                        },
                        {
                            "status": "Available",
                            "value": "vpc"
                        }
                    ],
                    "type": "Network"
                }
            ],
            "regionId": "cn-hangzhou",
            "status": "Available",
            "zoneId": "cn-hangzhou-e"
        }
    ],
    "requestId": "7A56347F-8D2E-440A-884B-1EF66654C7A8"
}

查询可用IO优化资源

没有指定付费类型,InstanceChargeType默认就是PostPaid,SpotStrategy默认为NoSpot

    public void doDescribeAvailableIoOptimizeds() {
        DescribeAvailableResourceRequest describe = new DescribeAvailableResourceRequest();
        describe.setDestinationResource("IoOptimized");
        describe.setRegionId("cn-hangzhou");
        //不传就是查所有可用区
        describe.setZoneId("cn-hangzhou-b");
        //不是必填值,根据自己需要的网络类型过滤更准确
        //describe.setNetworkCategory("Classic");
        doAction(describe);
    }

返回结果

{
    "availableZones": [
        {
            "availableResources": [
                {
                    "supportedResources": [
                        {
                            "status": "Available",
                            "value": "none"
                        },
                        {
                            "status": "Available",
                            "value": "optimized"
                        }
                    ],
                    "type": "IoOptimized"
                }
            ],
            "regionId": "cn-hangzhou",
            "status": "Available",
            "zoneId": "cn-hangzhou-b"
        }
    ],
    "requestId": "AA6CF750-E6D8-4696-BA0E-D3B7F66D127F"
}

image.png
过滤条件导致没有可用资源时返回
image.png

查询可用实例规格资源

若参数 DestinationResource 取值为 InstanceType,则必须传入参数 IoOptimized

    public void doDescribeAvailableInstanceTypes() {
        DescribeAvailableResourceRequest describe = new DescribeAvailableResourceRequest();
        describe.setDestinationResource("InstanceType");
        describe.setRegionId("cn-hangzhou");
        //不传就是查所有可用区
        describe.setZoneId("cn-hangzhou-d");
        // InstanceChargeType 默认为PostPaid
        // PrePaid:预付费,即 包年包月 ;
        // PostPaid:后付费,即 按量付费
        describe.setInstanceChargeType("PostPaid");
        // 当参数 InstanceChargeType 取值为 PostPaid 时,参数 SpotStrategy 才有效。
        // NoSpot:正常按量付费实例 ;
        // SpotWithPriceLimit:设置上限价格的竞价实例 ;
        // SpotAsPriceGo:系统自动出价,最高按量付费价格
        describe.setSpotStrategy("NoSpot");
        //必填值 none:非 I/O 优化实例 ; optimized:I/O 优化实例
        describe.setIoOptimized("optimized");

        //不是必填值,根据自己需要的网络类型过滤更准确 Vpc:专有网络 ; Classic:经典网络
        describe.setNetworkCategory("Vpc");
        doAction(describe);
    }

返回结果 statusSoldOut为实例规格售罄

{
    "availableZones": [
        {
            "availableResources": [
                {
                    "supportedResources": [
                        {
                            "status": "Available",
                            "value": "ecs.gn4-c8g1.4xlarge"
                        },
                        {
                            "status": "Available",
                            "value": "ecs.gn4-c4g1.2xlarge"
                        },
                        {
                            "status": "Available",
                            "value": "ecs.gn4.8xlarge"
                        },
                        {
                            "status": "SoldOut",
                            "value": "ecs.gn4.14xlarge"
                        },
                        {
                            "status": "Available",
                            "value": "ecs.gn4-c4g1.xlarge"
                        },
                        {
                            "status": "Available",
                            "value": "ecs.gn4-c8g1.2xlarge"
                        }
                    ],
                    "type": "InstanceType"
                }
            ],
            "regionId": "cn-hangzhou",
            "status": "Available",
            "zoneId": "cn-hangzhou-d"
        }
    ],
    "requestId": "888B31FC-269B-4024-BFDA-263C57C67B31"
}

IoOptimized没有传入,则报错:
Code: Invalid.Param
Message: The input parameter DestinationResource that is mandatory for processing this request is not supplied.

查询可用系统盘资源

若参数 DestinationResource 取值为 SystemDisk,则必须传入参数 IoOptimizedInstanceType

    public void doDescribeAvailableSystemDisks() {

        DescribeAvailableResourceRequest describe = new DescribeAvailableResourceRequest();
        describe.setDestinationResource("SystemDisk");
        describe.setRegionId("cn-hangzhou");
        //不传就是查所有可用区
        describe.setZoneId("cn-hangzhou-d");
        // InstanceChargeType 默认为PostPaid
        // PrePaid:预付费,即 包年包月 ;
        // PostPaid:后付费,即 按量付费
        describe.setInstanceChargeType("PostPaid");
        // 当参数 InstanceChargeType 取值为 PostPaid 时,参数 SpotStrategy 才有效。
        // NoSpot:正常按量付费实例 ;
        // SpotWithPriceLimit:设置上限价格的竞价实例 ;
        // SpotAsPriceGo:系统自动出价,最高按量付费价格
        describe.setSpotStrategy("NoSpot");
        //必填值 none:非 I/O 优化实例 ; optimized:I/O 优化实例
        describe.setIoOptimized("optimized");
        //必填值 实例规格
        describe.setInstanceType("ecs.gn4-c8g1.2xlarge");

        //不是必填值,根据自己需要的网络类型过滤更准确 Vpc:专有网络 ; Classic:经典网络
        describe.setNetworkCategory("Vpc");
        doAction(describe);

    }

返回结果

{
    "availableZones": [
        {
            "availableResources": [
                {
                    "supportedResources": [
                        {
                            "max": 500,
                            "min": 20,
                            "status": "Available",
                            "unit": "GB",
                            "value": "cloud_efficiency"
                        },
                        {
                            "max": 500,
                            "min": 20,
                            "status": "Available",
                            "unit": "GB",
                            "value": "cloud_ssd"
                        }
                    ],
                    "type": "SystemDisk"
                }
            ],
            "regionId": "cn-hangzhou",
            "status": "Available",
            "zoneId": "cn-hangzhou-d"
        }
    ],
    "requestId": "4063AA6A-01E1-46F0-9DB8-A74AF5FE98E6"
}

查询可用数据盘资源

若参数 DestinationResource 取值为 DataDisk,则必须传入参数 IoOptimizedInstanceTypeSystemDiskCategory
延用上面的代码

    public void doDescribeAvailableDataDisks() {

        DescribeAvailableResourceRequest describe = new DescribeAvailableResourceRequest();
        describe.setDestinationResource("DataDisk");
        describe.setRegionId("cn-hangzhou");
        //不传就是查所有可用区
        describe.setZoneId("cn-hangzhou-d");
        // InstanceChargeType 默认为PostPaid
        // PrePaid:预付费,即 包年包月 ;
        // PostPaid:后付费,即 按量付费
        describe.setInstanceChargeType("PostPaid");
        // 当参数 InstanceChargeType 取值为 PostPaid 时,参数 SpotStrategy 才有效。
        // NoSpot:正常按量付费实例 ;
        // SpotWithPriceLimit:设置上限价格的竞价实例 ;
        // SpotAsPriceGo:系统自动出价,最高按量付费价格
        describe.setSpotStrategy("NoSpot");
        //必填值 none:非 I/O 优化实例 ; optimized:I/O 优化实例
        describe.setIoOptimized("optimized");
        //必填值 实例规格
        describe.setInstanceType("ecs.gn4-c8g1.2xlarge");
        //必填值 系统盘类型
        describe.setSystemDiskCategory("cloud_ssd");

        //不是必填值,根据自己需要的网络类型过滤更准确 Vpc:专有网络 ; Classic:经典网络
        describe.setNetworkCategory("Vpc");
        doAction(describe);

    }

返回结果

{
    "availableZones": [
        {
            "availableResources": [
                {
                    "supportedResources": [
                        {
                            "max": 32768,
                            "min": 20,
                            "status": "Available",
                            "unit": "GB",
                            "value": "cloud_ssd"
                        },
                        {
                            "max": 2000,
                            "min": 5,
                            "status": "Available",
                            "unit": "GB",
                            "value": "cloud"
                        },
                        {
                            "max": 32768,
                            "min": 20,
                            "status": "Available",
                            "unit": "GB",
                            "value": "cloud_efficiency"
                        }
                    ],
                    "type": "DataDisk"
                }
            ],
            "regionId": "cn-hangzhou",
            "status": "Available",
            "zoneId": "cn-hangzhou-d"
        }
    ],
    "requestId": "8A43A1D2-0065-4050-AA40-C614FF94A336"
}

进阶实践——联合查询

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

    public DescribeAvailableResourceRequest doCommonRequest(DescribeAvailableResourceRequest describe) {
        if (null == describe) {
            describe = new DescribeAvailableResourceRequest();
        }
        describe.setRegionId("cn-hangzhou");
        // InstanceChargeType 默认为PostPaid
        // PrePaid:预付费,即 包年包月 ;
        // PostPaid:后付费,即 按量付费
        describe.setInstanceChargeType("PostPaid");
        // 当参数 InstanceChargeType 取值为 PostPaid 时,参数 SpotStrategy 才有效。
        // NoSpot:正常按量付费实例 ;
        // SpotWithPriceLimit:设置上限价格的竞价实例 ;
        // SpotAsPriceGo:系统自动出价,最高按量付费价格
        describe.setSpotStrategy("NoSpot");
        return describe;
    }

    public List<String> getResources(String destinationResource, DescribeAvailableResourceRequest describe) {
        describe = doCommonRequest(describe);
        if(!ZONE.equals(destinationResource)) {
            List<String> zones =  getResources(ZONE,describe);
            //取所需的可用区,这里取第一个值; 不传就是查所有可用区
            describe.setZoneId(zones.get(0));
        }
        if(!ZONE.equals(destinationResource) && !NETWORK.equals(destinationResource)){
            List<String> networks =  getResources(NETWORK,describe);
            //不是必填值,根据自己需要的网络类型过滤更准确 Vpc:专有网络 ; Classic:经典网络
            describe.setNetworkCategory(networks.get(0));
        }
        if (INSTANCETYPE.equals(destinationResource)) {
            List<String> ioOpts = getResources(IOOPTIMIED, describe);
            //取所需的IO优化资源,这里取第一个值
            describe.setIoOptimized(ioOpts.get(0));
        }
        if (SYSTEMDISK.equals(destinationResource)) {
            List<String> types = getResources(INSTANCETYPE, describe);
            //取所需的实例规格资源,这里取第一个值
            describe.setInstanceType(types.get(0));
        }
        if (DATADISK.equals(destinationResource)) {
            List<String> systemDisks = getResources(SYSTEMDISK, describe);
            //取所需的系统盘资源,这里取第一个值
            describe.setSystemDiskCategory(systemDisks.get(0));
        }
        describe.setDestinationResource(destinationResource);
        return getResponse(describe, destinationResource);
    }

    public List<String> getResponse(DescribeAvailableResourceRequest describe, String destinationResource) {
        DescribeAvailableResourceResponse response = doAction(describe);
        if (null != response && CollectionUtils.isNotEmpty(response.getAvailableZones())) {
            List<String> zones = new ArrayList<String>();
            for (AvailableZone availableZone : response.getAvailableZones()) {
                if(ZONE.equals(destinationResource)){
                    if (availableZone.getStatus().equals("Available")) {
                        zones.add(availableZone.getZoneId());
                    }
                }
                if (CollectionUtils.isNotEmpty(availableZone.getAvailableResources())) {
                    for (AvailableResource resource : availableZone.getAvailableResources()) {
                        if (resource.getType().equals(destinationResource)) {
                            if (CollectionUtils.isNotEmpty(resource.getSupportedResources())) {
                                List<String> types = new ArrayList<String>();
                                for (SupportedResource supportResource : resource.getSupportedResources()) {
                                    //只取可用资源,SoldOut为售罄
                                    if (supportResource.getStatus().equals("Available")) {
                                        types.add(supportResource.getValue());
                                    }
                                }
                                return types;
                            }
                        }
                    }
                }
            }
            if(CollectionUtils.isNotEmpty(zones)){
                return zones;
            }
        }
        return null;
    }

    //查询所需目标类型资源的值
    public void doDescribeResources(String destinationResource) {
        List<String> values = getResources(destinationResource, null);
    }
相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情:&nbsp;https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
缓存 人工智能 架构师
释放数据潜力:利用 MCP 资源让大模型读懂你的服务器
MCP(Model Control Protocol)资源系统是将服务器数据暴露给客户端的核心机制,支持文本和二进制两种类型资源。资源通过唯一URI标识,客户端可通过资源列表或模板发现资源,并使用`resources/read`接口读取内容。MCP还支持资源实时更新通知及订阅机制,确保动态数据的及时性。实现时需遵循最佳实践,如清晰命名、设置MIME类型和缓存策略,同时注重安全性,包括访问控制、路径清理和速率限制等。提供的示例代码展示了如何用JavaScript和Python实现资源支持。
221 80
|
1月前
|
弹性计算 异构计算
阿里云服务器多少钱一小时?在哪查询1小时价格表?
阿里云服务器按量付费模式下,1小时费用因实例规格而异。例如,2核2G的ECS经济型e实例为0.094元/小时,而更高配置的GPU服务器可达211.68元/小时。用户可通过阿里云ECS页面“立即购买”并选择“按量付费”,查看不同配置的实时价格。此外,包年包月模式通常更划算,如轻量应用服务器2核2G仅需99元/年,但不支持按量付费。更多详情可访问阿里云官网查询。
150 71
|
26天前
|
Go API 定位技术
MCP 实战:用 Go 语言开发一个查询 IP 信息的 MCP 服务器
随着 MCP 的快速普及和广泛应用,MCP 服务器也层出不穷。大多数开发者使用的 MCP 服务器开发库是官方提供的 typescript-sdk,而作为 Go 开发者,我们也可以借助优秀的第三方库去开发 MCP 服务器,例如 ThinkInAIXYZ/go-mcp。 本文将详细介绍如何在 Go 语言中使用 go-mcp 库来开发一个查询 IP 信息的 MCP 服务器。
90 0
|
2月前
|
自然语言处理 安全 开发工具
分享一个纯净无广、原版操作系统、开发人员工具、服务器等资源免费下载的网站
分享一个纯净无广、原版操作系统、开发人员工具、服务器等资源免费下载的网站
136 4
|
2月前
|
弹性计算 异构计算
阿里云服务器多少钱一小时?在哪查询1小时价格表?
阿里云服务器按量付费,1小时起计费。如2核2G的ECS经济型e实例仅0.094元/小时。不同配置价格各异,例如GPU计算型gn6v(64核256G)高达211.68元/小时。查询价格可访问阿里云ECS页面定制配置。包年包月更划算,2核2G服务器低至99元/年
115 4
|
3月前
|
弹性计算 运维 Kubernetes
使用ACK Edge统一管理多地域的ECS资源
使用ACK Edge统一管理多地域的ECS资源
|
1月前
|
存储 缓存 弹性计算
阿里云经济型e实例云服务器评测:企业官网搭建的性价比之选
阿里云服务器经济型e实例可以用来搭建企业网站吗?云服务器作为搭建企业官网的基础设施,其性能、稳定性、成本等因素直接影响着官网的运营效果。阿里云经济型e实例云服务器作为一款性价比较高的产品,备受用户关注。许多企业在选择云服务器搭建官网时,都会将其纳入考虑范围。本文将详细探讨阿里云经济型e实例云服务器的特点、性能表现、稳定性与可靠性,以及成本考量,最终解答是否适合用它来搭建企业官网。
|
2月前
|
存储 缓存 网络协议
阿里云特惠云服务器99元与199元配置与性能和适用场景解析:高性价比之选
2025年,阿里云长效特惠活动继续推出两款极具吸引力的特惠云服务器套餐:99元1年的经济型e实例2核2G云服务器和199元1年的通用算力型u1实例2核4G云服务器。这两款云服务器不仅价格亲民,而且性能稳定可靠,为入门级用户和普通企业级用户提供了理想的选择。本文将对这两款云服务器进行深度剖析,包括配置介绍、实例规格、使用场景、性能表现以及购买策略等方面,帮助用户更好地了解这两款云服务器,以供参考和选择。
|
2月前
|
域名解析 人工智能 弹性计算
DeepSeek服务器繁忙解决方法:使用阿里云一键部署DeepSeek个人网站!
通过阿里云一键部署DeepSeek个人网站,解决服务器繁忙问题。学生用户可领取300元代金券实现0成本部署,普通用户则可用99元/年的服务器。教程涵盖从选择套餐、设置密码到获取百炼API-KEY的全流程,助您快速搭建专属大模型主页,体验DeepSeek、Qwen-max、Llama等多款模型,无需代码,最快5分钟完成部署。支持绑定个人域名,共享亲友使用,日均成本仅约1元。
197 10
|
1月前
|
安全 Linux
阿里云linux服务器使用脚本通过安全组屏蔽异常海外访问ip
公网网站可能会遭受黑客攻击导致访问异常,使用此脚本可以屏蔽掉异常IP 恢复访问。也可自行设置定时任务定期检测屏蔽。
168 28

相关产品

  • 云服务器 ECS