文档

查询抢占式实例库存

更新时间:

在新建抢占式实例前,您可以根据实际需要查询抢占式实例库存情况(支持按地域、实例规格或内存大小等维度进行查询),避免因库存不足导致实例创建失败。本文以Alibaba Cloud SDK for Java为例,为您介绍查询某一地域下有库存的抢占式实例规格的方法。

前提条件

  • 已准备阿里云账号以及对应的访问密钥(AccessKey)。

    使用Alibaba Cloud SDK for Java时需要设置阿里云账号的AccessKey信息。AccessKey的获取方式,请参见创建AccessKey

  • 已在开发环境中安装Java SDK。

    您需要在Maven项目中添加以下依赖。具体操作,请参见安装Java SDK

     <dependencies>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-ecs</artifactId>
            <version>4.23.10</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.0.8</version>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
             <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>20.0</version>
        </dependency>
    </dependencies>

代码示例

本文操作示例主要以代码形式体现,具体代码如下:

import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSON;

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.ecs.model.v20140526.DescribeAvailableResourceRequest;
import com.aliyuncs.ecs.model.v20140526.DescribeAvailableResourceResponse;
import com.aliyuncs.ecs.model.v20140526.DescribeAvailableResourceResponse.AvailableZone;
import com.aliyuncs.ecs.model.v20140526.DescribeAvailableResourceResponse.AvailableZone.AvailableResource;
import com.aliyuncs.ecs.model.v20140526.DescribeAvailableResourceResponse.AvailableZone.AvailableResource.SupportedResource;
import com.aliyuncs.ecs.model.v20140526.DescribeZonesRequest;
import com.aliyuncs.ecs.model.v20140526.DescribeZonesResponse;
import com.aliyuncs.ecs.model.v20140526.DescribeZonesResponse.Zone;
import com.aliyuncs.profile.DefaultProfile;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;

public class QuerySpotAvailableResource {

    private static IAcsClient client;

    /**请将regionId修改为您想要查询的regionId*/
    private static String regionId = "cn-hangzhou";


    public static void main(String[] args) {
        client = Initialization();
        /**请将instanceType修改为您想要查询的实例规格*/
        String instanceType = "ecs.n2.3xlarge";
        /**请将cores修改为您想要查询的内核数*/
        Integer cores = 4;
        /**请将memory修改为您想要查询的实例规格的内存大小,单位为GiB*/
        Float memory = 8f;
        //指定地域,查询该地域下所有可用区有库存的抢占式实例规格
        describeRegionAvailableResource();
        //指定规格,查询该地域是否有库存
        describeInstanceTypeAvailableResource(instanceType);
        //指定内核数目内存大小,查询当前地域所有可用区中符合条件的有库存的实例规格
        describeCoresMemoryAvailableResource(cores, memory);
    }


    public static void describeRegionAvailableResource(){
        try {
            Map<String, List<String>> spotAvailableResource= Maps.newHashMap();
            List<String> zones = describeZones();
            zones.stream().forEach(zone->{
                List<String> instanceTypes = describeAvailableResource(zone, null, 0, 0f);
                if (CollectionUtils.isNotEmpty(instanceTypes)) {
                    spotAvailableResource.put(zone, instanceTypes);
                }
            });
            System.out.println(spotAvailableResource);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void describeInstanceTypeAvailableResource(String instanceType){
        List<String> list = Lists.newArrayList();
        try {
            List<String> zones = describeZones();
            zones.stream().forEach(zone->{
                List<String> instanceTypes = describeAvailableResource(zone, instanceType, 0, 0f);
                if (CollectionUtils.isNotEmpty(instanceTypes)){
                    list.add(zone);
                }
            });
            if (CollectionUtils.isNotEmpty(list)){
                System.out.println("有库存的可用区: " + JSON.toJSONString(list));
            }else {
                System.out.println("当前地域无库存");
            }
        } catch (Exception e){
            e.printStackTrace();
        }
    }


    public static void describeCoresMemoryAvailableResource(Integer cores, Float memory) {
        Map<String, List<String>> spotAvailableResource= Maps.newHashMap();
        try {
            List<String> zones = describeZones();
            zones.stream().forEach(zone -> {
                List<String> instanceTypes = describeAvailableResource(zone, null, cores, memory);
                if (CollectionUtils.isNotEmpty(instanceTypes)) {
                    spotAvailableResource.put(zone, instanceTypes);
                }
            });
            System.out.println(spotAvailableResource);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    public static List<String> describeZones() throws Exception {
        DescribeZonesRequest request = new DescribeZonesRequest();
        request.setSysRegionId(regionId);
        request.setSpotStrategy("SpotAsPriceGo");
        DescribeZonesResponse response = client.getAcsResponse(request);
        List<Zone> zones = response.getZones();
        List<String> zoneList = Lists.newArrayList();
        zones.stream().forEach(zone -> {
            zoneList.add(zone.getZoneId());
        });
        return zoneList;
    }
    public static List<String> describeAvailableResource(String zoneId, String instanceType, Integer cores, Float memory) {
        DescribeAvailableResourceRequest request = new DescribeAvailableResourceRequest();
        request.setSysRegionId(regionId);
        request.setZoneId(zoneId);
        request.setDestinationResource("InstanceType");
        request.setSpotStrategy("SpotAsPriceGo");
        if (StringUtils.isNotBlank(instanceType)){
            request.setInstanceType(instanceType);
        }
        if (0 != cores){
            request.setCores(cores);
        }
        if (0 != memory){
            request.setMemory(memory);
        }
        List<String> instanceTypes = Lists.newArrayList();
        try {
            DescribeAvailableResourceResponse response = client.getAcsResponse(request);
            List<AvailableZone> availableZones = response.getAvailableZones();
            availableZones.stream().forEach(availableZone -> {
                List<AvailableResource> availableResources = availableZone.getAvailableResources();
                availableResources.stream().forEach(availableResource -> {
                    List<SupportedResource> supportedResources = availableResource.getSupportedResources();
                    supportedResources.stream().forEach(supportedResource -> {
                        if ("Available".equals(supportedResource.getStatus()) && "WithStock".equals(supportedResource.getStatusCategory())){
                            instanceTypes.add(supportedResource.getValue());
                        }
                    });
                });
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
        return instanceTypes;
    }

    private static IAcsClient Initialization() {
        // 初始化请求参数
        DefaultProfile profile = DefaultProfile.getProfile(
            regionId,                          // 您的地域ID
            "<your-access-key-id>",         // 您的AccessKey ID
            "<your-access-key-secret>");   // 您的AccessKey Secret

        return new DefaultAcsClient(profile);
    }
}
            

查询结果的返回示例,如下图所示,表示在杭州地域下符合需求的有库存的实例规格有ecs.i2.xlarge、ecs.d1-c8d3.8xlarge等。实例规格返回示例

相关文档

  • 如果您只需要查询某一地域下可以购买的抢占式实例的实例规格,请参见查询库存

  • 如果您需要创建抢占式实例,请参见创建抢占式实例

  • 本页导读 (1)
文档反馈