进阶玩法:针对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.

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情:&nbsp;https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
存储 安全 数据库
阿里云服务器计算型、通用型、内存型主要实例规格性能特点和适用场景汇总
阿里云服务器ECS计算型、通用型、内存型规格族属于独享型云服务器,在高负载不会出现计算资源争夺现象,因为每一个vCPU都对应一个Intel ® Xeon ®处理器核心的超线程,具有性能稳定且资源独享的特点。本文为大家整理汇总了阿里云服务器ECS计算型、通用型、内存型主要实例规格族具体实例规格有哪些,各个实例规格的性能特点和主要适用场景。
阿里云服务器计算型、通用型、内存型主要实例规格性能特点和适用场景汇总
|
2天前
|
弹性计算 监控 安全
重装系统后,无法通过云监控查看ecs资源占用怎么解决
如果您在重装系统后无法通过云监控查看ECS资源占用,可以按以下步骤排查:1. 确认云监控插件状态是否“运行中”,若不是则需重新安装;2. 通过自动安装流程安装插件,并确认状态变回“运行中”;3. 检查ECS网络配置,确保能访问外部网络;4. 验证监控功能是否正常显示数据;5. 可选设置报警规则。如问题仍存,请检查防火墙或安全组设置。通过上述步骤,您应能重新启用云监控。
11 1
|
22天前
|
运维 Linux Apache
【一键变身超人!】Puppet 自动化运维神器 —— 让你的服务器听话如婴儿,轻松管理资源不是梦!
【8月更文挑战第9天】随着云计算与容器化技术的发展,自动化运维已成为现代IT基础设施的核心部分。Puppet是一款强大的自动化工具,用于配置管理,确保系统保持预期状态。通过易于理解的配置文件定义资源及其依赖关系,Puppet实现了“基础设施即代码”的理念。本文简要介绍了Puppet的安装配置方法及示例,包括Puppet Agent与Master的安装、基本配置步骤和一个简单的Apache HTTP Server管理示例,展示了Puppet在实际应用中的强大功能与灵活性。
28 9
|
19天前
|
弹性计算 Kubernetes 开发者
利用容器化服务实现游戏服务器的动态资源配置
【8月更文第12天】在游戏行业中,用户基数的变化往往呈现出明显的波动性,特别是在推广活动期间,用户基数会显著增加,而在非推广期则会有所下降。为了应对这种变化,游戏开发者需要一种能够根据用户基数动态调整服务器资源的解决方案,以确保用户体验的同时最大限度地节省成本。容器化服务因其灵活的资源管理和成本控制能力,成为了理想的解决方案。
27 2
|
2月前
|
Oracle NoSQL 固态存储
阿里云服务器ESSD Entry云盘与ESSD云盘选择指南:性能与场景解析
在我们选择阿里云服务器的时候,有部分云服务器同时支持ESSD Entry云盘和ESSD云盘,选择不同的云盘,价格也有所差异,有的用户还不清楚他们之间的区别,因此不知道选择哪种更好更能满足自己场景的需求,本文为大家介绍一下阿里云服务器ESSD Entry云盘和ESSD云盘的区别及选择参考。
阿里云服务器ESSD Entry云盘与ESSD云盘选择指南:性能与场景解析
|
2月前
|
存储 人工智能 数据可视化
阿里云服务器的十二种典型应用场景
阿里云还提供了数据可视化服务DataV,帮助用户通过图形化的界面轻松搭建专业水准的可视化应用。用户可以利用DataV进行数据监控、调度和会展演示等工作,提高数据分析和决策的效率。
|
2月前
|
弹性计算 异构计算
阿里云服务器租用多少钱一年?在哪查询价格表?
阿里云服务器包括ECS、轻量应用服务器和GPU实例,价格因配置而异。例如,ECS经济型2核2G年付99元,轻量应用服务器2核4G年付298元。要查看最新价格和具体配置,可访问阿里云官方网站的ECS页面
|
2月前
|
存储 分布式计算 视频直播
阿里云服务器的十二种典型应用场景:解锁云计算的无限可能
场景概述: 区块链技术在金融、供应链管理等领域有着广泛的应用。阿里云提供了区块链服务BaaS,支持联盟链的快速部署和管理。
|
3月前
|
存储 缓存 运维
云计算中的服务器选型与配置:技术深度解析
【6月更文挑战第29天】云计算服务器选型与配置深度解析:关注业务需求、技术要求及成本效益。重点包括CPU、内存、存储和网络配置的优化,结合负载均衡、缓存、虚拟化和自动化运维策略,以提升性能和效率,确保云服务的稳定与高效。
Request请求转发和重定向的资源路径问题,目录到底加不加,取决于浏览器用,还是服务器用,规避项目目录发生修改,导致重定向失败
Request请求转发和重定向的资源路径问题,目录到底加不加,取决于浏览器用,还是服务器用,规避项目目录发生修改,导致重定向失败

相关产品

  • 云服务器 ECS
  • 下一篇
    云函数