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

本文涉及的产品
云服务器 ECS,每月免费额度200元 3个月
云服务器ECS,u1 2核4GB 1个月
简介: 创建实例总碰到没有资源,没有权限,产品限制等原因导致失败,到底哪些资源是可以使用的呢?我们说说针对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。

使用场景事例

事例使用的公共方法在后面给出。

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

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

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

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

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

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

公共请求及结果处理


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

过滤条件导致资源空

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.

相关实践学习
一小时快速掌握 SQL 语法
本实验带您学习SQL的基础语法,快速入门SQL。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情:&nbsp;https://www.aliyun.com/product/ecs
目录
相关文章
|
4天前
|
存储 机器学习/深度学习 弹性计算
【阿里云弹性计算】阿里云ECS实例选择指南:理解不同实例系列的适用场景
【5月更文挑战第24天】阿里云ECS实例系列包括计算优化型、内存优化型、存储优化型、GPU加速型和通用型,适用于不同场景。计算优化型适合计算密集型任务,内存优化型适用于内存数据库,存储优化型针对高I/O需求,GPU加速型用于图形处理和深度学习,通用型则平衡各类需求。选择时需考虑应用类型、性能需求、成本效益和可扩展性。提供的示例代码展示了如何使用阿里云CLI创建通用型实例。本文旨在帮助用户根据业务需求选择最适合的ECS实例。
21 1
|
6天前
|
弹性计算 数据挖掘 应用服务中间件
阿里云服务器通用算力型U1实例解析,实例性能、适用场景及常见问题参考
在阿里云服务器的所有实例规格中,通用算力型u1实例主打的是高性价比,通用算力型U1实例云服务器自推出以来,就受到了广大用户的关注,也是目前阿里云的活动中比较热门的云服务器实例,这个实例规格的性能要好于经济型e等共享型实例,价格又比计算型c7、通用型g7等其他企业级实例要低一些。本文将深入解析通用算力型U1实例的特点、适用场景以及价格优势,帮助用户更好地了解该云服务器实例。
阿里云服务器通用算力型U1实例解析,实例性能、适用场景及常见问题参考
|
6天前
|
存储 弹性计算 监控
【阿里云弹性计算】阿里云 ECS 性能优化秘籍:提升应用响应速度与资源利用率
【5月更文挑战第22天】阿里云ECS优化涉及实例规格选择、OS与应用配置、网络配置、存储优化及数据库连接池管理。合理挑选CPU和内存,关闭无关服务,利用EIP和负载均衡优化网络,选择合适存储类型,并通过监控工具进行性能分析和压力测试,以提升响应速度,优化资源利用率,降低成本,增强企业竞争力。示例展示了Java数据库连接池配置优化。通过持续探索和实践,可最大化发挥ECS潜力。
84 7
|
7天前
|
网络协议 数据格式 Python
Python进阶---HTTP协议和Web服务器
Python进阶---HTTP协议和Web服务器
19 4
|
7天前
|
存储 弹性计算 Linux
阿里云服务器购买常见三种购买方式及适用场景、图文教程及注意事项参考
阿里云服务器的购买方式主要有快速购买、自定义购买和活动购买这三种常见的方式。每种购买方式都有自己的适合场景,也有很多需要注意的地方,下面是这些购买方式的具体图文教程及注意事项,适合初次购买阿里云服务器的用户参考,从而选择适合自己的购买方式。
阿里云服务器购买常见三种购买方式及适用场景、图文教程及注意事项参考
|
7天前
|
存储 安全 物联网
裸金属服务器适合哪些场景使用,有哪些优势
裸金属架构虚拟系统无需安装操作系统或虚拟化软件,而是通过虚拟化技术直接将硬件资源分配给应用,这种架构消除了传统虚拟化技术中的操作系统层,使虚拟机能够直接访问物理硬件资源,实现了更高的性能和更低的延迟,从而提供接近物理机的性能和效率。
|
8天前
|
运维 Linux 程序员
最全查看Linux系统状态脚本_linux查询所有服务器信息的脚本,墙都不扶就服你
最全查看Linux系统状态脚本_linux查询所有服务器信息的脚本,墙都不扶就服你
最全查看Linux系统状态脚本_linux查询所有服务器信息的脚本,墙都不扶就服你
|
9天前
|
关系型数据库 MySQL Linux
查询服务器中有没有mysql - 蓝易云
同样,如果MySQL已经安装,这个命令将会显示MySQL的版本信息。如果没有安装,系统将会显示一个错误消息。
62 0
|
11天前
|
存储 安全 数据库
阿里云服务器计算型、通用型、内存型主要实例规格特点、适用场景及最新价格参考
在阿里云服务器的实例规格中,有共享型也有企业型,一般用户选择较多的企业级实例规格有计算型、通用型、内存型,每一种实例规格又有多个实例规格族可选,不同的云服务器实例规格在架构、计算、存储、网络、安全等方面有着不同,因此,其适用场景也有所不同。本文来详细介绍一下阿里云服务器计算型、通用型、内存型主要实例计算、存储等性能及其适用场景,以供参考。
阿里云服务器计算型、通用型、内存型主要实例规格特点、适用场景及最新价格参考
|
13天前
|
存储 缓存 安全
阿里云服务器实例规格选型参考,根据上云场景选择适合自己的实例规格
对于很多新手用户来说,在初次选择阿里云服务器实例规格的时候,面对众多实例规格往往不知道如何选择,因为云服务器实例规格不同,价格也不一样,本文通过一些常见的选型场景推荐,便于大家在选择云服务器实例规格时做个参考。
阿里云服务器实例规格选型参考,根据上云场景选择适合自己的实例规格

相关产品

  • 云服务器 ECS