进阶接口:查询ECS变配的可用资源实践

本文涉及的产品
云服务器 ECS,每月免费额度200元 3个月
云服务器ECS,u1 2核4GB 1个月
简介: 升级或者降配云服务ECS配置时,在指定条件下有哪些资源是可用的?如何更好的选择所需的资源?ECS实例可以升级及降配的规格是哪些,利用API DescribeResourcesModification 查询ECS变配时哪些规格可用的。

  • 接口名称(查询变更ECS实例时的可用规格资源列表)

DescribeResourcesModification

  • 背景:

升级或者降配云服务ECS配置时,在指定条件下有哪些资源是可用的?如何更好的选择所需的资源?介绍如何利用查DescribeResourcesModification接口查询变更ECS实例时的可用规格资源列表

  • 针对变配场景做相应的查询

场景1. ecs可以升级实例规格列表
场景2. ecs可以升级系统盘类型列表

除了您现在看到的这文章,您还可以前往:

API文档:DescribeResourcesModification


下文以Python为示例,其他的版本SDK都需要大于4.6.3即可。

安装ECS Python SDK

首先确保您已经具备Python的Runtime,本文中使用的Python版本为2.7+。

pip install aliyun-python-sdk-ecs
如果提示您没有权限,请切换sudo 继续执行。

sudo pip install aliyun-python-sdk-ecs
本文使用的sdk版本为4.6.3, 如果您使用是旧版本的sdk,需要你更新下。

使用场景事例

# your access key Id
ak_id = "YOU_ACCESS_KEY_ID"

# your access key secret
ak_secret = "YOU_ACCESS_SECRET"

region_id = "cn-hangzhou"

# 选择的资源id
resource_id = "i-xxxx"

#目标资源 可选值: InstanceType| SystemDisk
destination_instance_type ='InstanceType'
destination_system_disk ='SystemDisk'

#更改配置的操作类型 Upgrade | Downgrade
operation_type = 'Upgrade'

# 目标实例规格 DescribeInstanceTypes 获得最新的规格列表。当参数 DestinationResource 取值为 SystemDisk,必须同时指定该参数 InstanceType。
instance_type = "ecs.n1.large"

#慎用这个参数
#  跨系列更改配置 默认值:False , 有校值: True | False
#参数 MigrateAcrossZone 取值为 True 时,
# MigrateAcrossZone = true, 如果实例为经典网络 系列 I 变配到非 I/O 优化实例变配到 I/O 优化实例 :
# 1. 实例内网 IP 地址、磁盘识别名称和软件授权码会发生变化。
# 2. Linux 实例的普通云盘(cloud)会被识别为 xvda 或者 xvdb 等,高效云盘(cloud_efficiency) 和 SSD 云盘(cloud_ssd)会被识别为 vda 或者 vdb 等。
# MigrateAcrossZone = true,如果实例为经典网络  不是 系列 I 变配到非 I/O 优化实例变配到 I/O 优化实例 :
# 1. 实例内网 IP 地址可能会发生变化。
# MigrateAcrossZone = true, 如果实例为VPC 系列 I 变配到非 I/O 优化实例变配到 I/O 优化实例 :
# 1. 磁盘识别名称和软件授权码会发生变化。
# 2. Linux 实例的普通云盘(cloud)会被识别为 xvda 或者 xvdb 等,高效云盘(cloud_efficiency) 和 SSD 云盘(cloud_ssd)会被识别为 vda 或者 vdb 等。
#
migrate_across_zone = False

clt = client.AcsClient(ak_id, ak_secret, region_id)

def _execute_request(request):
    response = _send_request(request)
    if response is None:
        print 'response is None'
        return
    if response.get('Code') is None:
        availableZones = response.get('AvailableZones').get('AvailableZone')
        if availableZones is None:
            print 'availableZones is None'
            return
        for availableZone in availableZones:
            zoneId = availableZone.get('ZoneId')
            values = []
            availableResources = availableZone.get('AvailableResources').get('AvailableResource')
            if availableResources is None:
                print 'availableResources is None'
                return
            for availableResource in availableResources:
                supportedResources = availableResource.get('SupportedResources').get('SupportedResource')
                if supportedResources is None:
                    print 'supportedResource is None'
                    return
                for supportedResource in supportedResources:
                    status = supportedResource.get('Status')
                    if status == "Available":
                        value = supportedResource.get('Value')
                        values.append(value)
            print "ecs in zone %s resource value list is %s"%(zoneId, values)

def build_request():
    request = DescribeResourcesModificationRequest()
    request.set_ResourceId(resource_id)
    request.set_MigrateAcrossZone(migrate_across_zone)
    request.set_OperationType(operation_type)
    return request

# send open api request
def _send_request(request):
    request.set_accept_format('json')
    try:
        response_str = clt.do_action(request)
        logging.info(response_str)
        response_detail = json.loads(response_str)
        return response_detail
    except Exception as e:
        logging.error(e)

场景1. ecs可以升级实例规格列表

# describe instanceType resource.
def describe_resource_instance_type():
    request = build_request()
    request.set_DestinationResource(destination_instance_type)
    _execute_request(request)

场景2. ecs可以升级系统盘类型列表

# describe systemDisk resource.  
def describe_resource_system_disk():
    request = build_request()
    request.set_DestinationResource(destination_system_disk)
    request.set_InstanceType(instance_type)
    _execute_request(request)

完整代码

#  coding=utf-8

# if the python sdk is not install using 'sudo pip install aliyun-python-sdk-ecs'
# if the python sdk is install using 'sudo pip install --upgrade aliyun-python-sdk-ecs'
# make sure the sdk version is 4.6.3, you can use command 'pip show aliyun-python-sdk-ecs' to check

import json
import logging

from aliyunsdkcore import client
from aliyunsdkecs.request.v20140526.DescribeResourcesModificationRequest import DescribeResourcesModificationRequest

logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                    datefmt='%a, %d %b %Y %H:%M:%S')

# your access key Id
ak_id = "YOU_ACCESS_KEY_ID"

# your access key secret
ak_secret = "YOU_ACCESS_SECRET"

region_id = "cn-hangzhou"

# 选择的资源id
resource_id = "i-xxxx"

#目标资源 可选值: InstanceType| SystemDisk
destination_instance_type ='InstanceType'
destination_system_disk ='SystemDisk'

#更改配置的操作类型 Upgrade | Downgrade
operation_type = 'Upgrade'

# 目标实例规格 DescribeInstanceTypes 获得最新的规格列表。当参数 DestinationResource 取值为 SystemDisk,必须同时指定该参数 InstanceType。
instance_type = "ecs.n1.large"

#慎用这个参数
#  跨系列更改配置 默认值:False , 有校值: True | False
#参数 MigrateAcrossZone 取值为 True 时,
# MigrateAcrossZone = true, 如果实例为经典网络 系列 I 变配到非 I/O 优化实例变配到 I/O 优化实例 :
# 1. 实例内网 IP 地址、磁盘识别名称和软件授权码会发生变化。
# 2. Linux 实例的普通云盘(cloud)会被识别为 xvda 或者 xvdb 等,高效云盘(cloud_efficiency) 和 SSD 云盘(cloud_ssd)会被识别为 vda 或者 vdb 等。
# MigrateAcrossZone = true,如果实例为经典网络  不是 系列 I 变配到非 I/O 优化实例变配到 I/O 优化实例 :
# 1. 实例内网 IP 地址可能会发生变化。
# MigrateAcrossZone = true, 如果实例为VPC 系列 I 变配到非 I/O 优化实例变配到 I/O 优化实例 :
# 1. 磁盘识别名称和软件授权码会发生变化。
# 2. Linux 实例的普通云盘(cloud)会被识别为 xvda 或者 xvdb 等,高效云盘(cloud_efficiency) 和 SSD 云盘(cloud_ssd)会被识别为 vda 或者 vdb 等。
#
migrate_across_zone = False

clt = client.AcsClient(ak_id, ak_secret, region_id)

# describe instanceType resource.
def describe_resource_instance_type():
    request = build_request()
    request.set_DestinationResource(destination_instance_type)
    _execute_request(request)

# describe systemDisk resource.
def describe_resource_system_disk():
    request = build_request()
    request.set_DestinationResource(destination_system_disk)
    request.set_InstanceType(instance_type)
    _execute_request(request)

def _execute_request(request):
    response = _send_request(request)
    if response is None:
        print 'response is None'
        return
    if response.get('Code') is None:
        availableZones = response.get('AvailableZones').get('AvailableZone')
        if availableZones is None:
            print 'availableZones is None'
            return
        for availableZone in availableZones:
            zoneId = availableZone.get('ZoneId')
            values = []
            availableResources = availableZone.get('AvailableResources').get('AvailableResource')
            if availableResources is None:
                print 'availableResources is None'
                return
            for availableResource in availableResources:
                supportedResources = availableResource.get('SupportedResources').get('SupportedResource')
                if supportedResources is None:
                    print 'supportedResource is None'
                    return
                for supportedResource in supportedResources:
                    status = supportedResource.get('Status')
                    if status == "Available":
                        value = supportedResource.get('Value')
                        values.append(value)
             print "ecs in zone %s resource value list is %s"%(zoneId, values)

def build_request():
    request = DescribeResourcesModificationRequest()
    request.set_ResourceId(resource_id)
    request.set_MigrateAcrossZone(migrate_across_zone)
    request.set_OperationType(operation_type)
    return request

# send open api request
def _send_request(request):
    request.set_accept_format('json')
    try:
        response_str = clt.do_action(request)
        logging.info(response_str)
        response_detail = json.loads(response_str)
        return response_detail
    except Exception as e:
        logging.error(e)


if __name__ == '__main__':
    print "hello ecs describe resources"
    # describe_resource_instance_type()
    # describe_resource_system_disk()
相关实践学习
一小时快速掌握 SQL 语法
本实验带您学习SQL的基础语法,快速入门SQL。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2天前
|
弹性计算 前端开发 持续交付
云效产品使用常见问题之导入ECS主机到资源池找不到导入的入口如何解决
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
2天前
|
Java Linux
Springboot 解决linux服务器下获取不到项目Resources下资源
Springboot 解决linux服务器下获取不到项目Resources下资源
|
2天前
|
弹性计算 前端开发 JavaScript
高校学生在家实践ECS弹性云服务器
简单谈谈我这几周使用ECS弹性云服务器的体验感
|
2天前
|
前端开发
vue3 使用 mock 模拟服务器接口
vue3 使用 mock 模拟服务器接口
18 1
|
2天前
|
弹性计算 前端开发 JavaScript
高校学生在家实践ECS弹性云服务器
简单谈谈我这几周使用ECS弹性云服务器的体验感
|
2天前
|
监控 云计算 开发者
探索云计算中的无服务器架构:从概念到实践
无服务器架构作为云计算领域的新兴技术,正在以其高效、灵活的特性吸引着越来越多的开发者和企业。本文将深入探讨无服务器架构的概念及其在云计算中的应用,通过实际案例展示如何利用无服务器架构构建可靠、可扩展的应用系统。
|
2天前
|
弹性计算 前端开发 JavaScript
高校学生在家实践ECS弹性云服务器
简单谈谈我这几周使用ECS弹性云服务器的体验感
|
2天前
|
小程序 开发者
体验版小程序为何无法访问云端服务器后端接口(请求失败...(已完美解决附加图片))?
体验版小程序为何无法访问云端服务器后端接口(请求失败...(已完美解决附加图片))?
25 0
|
2天前
|
Linux 数据安全/隐私保护
Linux基础与服务器架构综合小实践
【4月更文挑战第9天】Linux基础与服务器架构综合小实践
1270 8
|
2天前
|
弹性计算 运维 监控
解密阿里云弹性计算:探索云服务器ECS的核心功能
阿里云ECS是核心计算服务,提供弹性云服务器资源,支持实例按需配置、集群管理和监控,集成安全防护,确保服务稳定、安全,助力高效业务运营。
68 0

相关产品

  • 云服务器 ECS