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

简介: 创建实例总碰到没有资源,没有权限,产品限制等原因导致失败,到底哪些资源是可以使用的呢?我们说说针对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.

相关实践学习
2分钟自动化部署人生模拟器
本场景将带你借助云效流水线Flow实现人生模拟器小游戏的自动化部署
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情:&nbsp;https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
存储 编解码 缓存
阿里云服务器实例规格选择参考:根据业务场景选择云服务器实例规格
在阿里云服务器的购买过程中,云服务器实例规格是很多用户最难选择的一个选项,因为阿里云有着多达几十种不同的实例规格,为此,阿里云官方在云服务器购买页面新推出了一个场景化选型推荐,用户可通过自己的上云场景结合场景化选型里面的业务场景和细分场景来选择适合自己的阿里云服务器实例规格,在很大程度上解决了新手用户在选择阿里云服务器实例规格上的困局。
119 11
阿里云服务器实例规格选择参考:根据业务场景选择云服务器实例规格
|
4月前
|
存储 安全 数据库
阿里云服务器计算型、通用型、内存型主要实例规格性能特点和适用场景汇总
阿里云服务器ECS计算型、通用型、内存型规格族属于独享型云服务器,在高负载不会出现计算资源争夺现象,因为每一个vCPU都对应一个Intel ® Xeon ®处理器核心的超线程,具有性能稳定且资源独享的特点。本文为大家整理汇总了阿里云服务器ECS计算型、通用型、内存型主要实例规格族具体实例规格有哪些,各个实例规格的性能特点和主要适用场景。
阿里云服务器计算型、通用型、内存型主要实例规格性能特点和适用场景汇总
|
6天前
|
弹性计算
阿里云2核16G服务器多少钱一年?亲测价格查询1个月和1小时收费标准
阿里云2核16G服务器提供多种ECS实例规格,内存型r8i实例1年6折优惠价为1901元,按月收费334.19元,按小时收费0.696221元。更多规格及详细报价请访问阿里云ECS页面。
39 9
|
6天前
|
弹性计算 异构计算
2024年阿里云GPU服务器多少钱1小时?亲测价格查询方法
2024年阿里云GPU服务器每小时收费因实例规格不同而异。可通过阿里云GPU服务器页面选择“按量付费”查看具体价格。例如,NVIDIA A100的gn7e实例为34.742元/小时,NVIDIA A10的gn7i实例为12.710156元/小时。更多详情请访问阿里云官网。
39 2
|
8天前
|
人工智能 安全 Linux
|
10天前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
174 1
|
7天前
|
弹性计算 应用服务中间件 异构计算
阿里云服务器多少钱一小时?在哪查询1小时价格表?
阿里云服务器按量付费模式下,2核2G配置的ECS经济型e实例每小时费用为0.094元。不同配置的实例价格各异,如2核4G配置的ECS经济型e实例每小时0.225元,4核8G配置的ECS通用算力型u1实例每小时0.702元。用户可通过阿里云官网查询具体价格。包年包月模式下,2核2G3M服务器99元/年,更加经济实惠。
|
17天前
|
机器学习/深度学习 人工智能 边缘计算
高算力服务器的应用场景
【10月更文挑战第18天】高算力服务器作为现代信息社会不可或缺的计算资源,正广泛应用于各行各业。从人工智能到科学研究,从智能交通到数字孪生,它为复杂的计算任务提供了不可替代的支持。
25 0
|
2月前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
111 5
|
26天前
|
存储 监控 Linux
充分利用服务器的磁盘资源,提高系统的稳定性和可维护性
充分利用服务器的磁盘资源,提高系统的稳定性和可维护性
32 0

相关产品

  • 云服务器 ECS