详情页标题前

阿里云ECS云服务器查询可用的变配资源-云淘科技

详情页1

本文通过阿里云ECS Python SDK调用DescribeResourcesModification查询变更ECS实例配置时的可用规格资源列表,使用的Python语言为2.7版本。适用于作为升降配ECS实例规格操作的准备工作。

前提条件

请确保您已获取了AccessKey和资源所属的地域ID。更多详情,请参见地域和可用区和创建AccessKey。

背景信息

升级或者降配云服务ECS配置时,一般通过ModifyInstanceSpec或ModifyPrepayInstanceSpec接口实现。为避免频繁报错,您可以在以下资源变配场景中通过DescribeResourcesModification接口查询变更ECS实例时的可用规格资源列表:

  • 查询升级实例规格时的资源列表。

  • 查询升级系统盘类型列表。

调用DescribeResourcesModification时,可以设置MigrateAcrossZone=true查询跨系列更改实例配置的资源列表。跨系列更改实例配置会引起经典网络类型实例发生私网IP地址变化。如果您使用的是已停售的实例规格,请慎重从非I/O优化实例升级到I/O优化实例。根据实例网络类型的不同,将对实例信息造成以下影响:

变化项

非I/O优化系列I实例跨规格变配(经典网络)

非I/O优化系列I实例跨规格变配(专有网络VPC)

其他系列实例规格变配(经典网络)

其他系列实例规格变配(专有网络VPC)

私网IP地址

发生变化

保持不变

发生变化

保持不变

磁盘设备名(仅Linux系统)

普通云盘cloud

变更为xvda或者xvdb等

保持不变

高效云盘cloud_efficiency

变更为vda或者vdb等

软件授权码

发生变化

安装Python SDK

以Linux操作系统安装Python SDK为例。

  • 具有root权限的用户请执行:

    pip install aliyun-python-sdk-ecs
  • 普通用户请执行:

    sudo pip install aliyun-python-sdk-ecs

说明

请确保您使用的Python SDK不低于4.6.3版本。更多详情,请前往GitHub Repo Alibaba Cloud获取最新版本ECS SDK。

使用场景示例

#  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
import os

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')

# 请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
# 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取 AccessKey 的方式进行调用,仅供参考,建议使用更安全的 STS 方式
ak_id = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']
ak_secret = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']

# 资源所在的地域ID。
region_id = "cn-hangzhou"

# 选择的资源ID,如实例ID。
resource_id = "i-bp1187lghfcy8nnz****"

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

# 更改配置的操作类型,可选值:Upgrade | Downgrade | RenewDowngrade | RenewModify。
operation_type = 'Upgrade'

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

"""
请慎用MigrateAcrossZone参数。MigrateAcrossZone(Boolean)可以实现跨系列更改配置,默认值:False。
当参数MigrateAcrossZone取值为True时,一旦您根据返回信息升级了云服务器,请留意以下注意事项:
经典网络类型实例:
1. 对于系列I实例,从非I/O优化实例升级到I/O优化实例时,实例私网IP地址、磁盘设备名和软件授权码会发生变化。对于Linux实例,普通云盘(cloud)会被识别为xvda或者xvdb等,高效云盘(cloud_efficiency)和SSD云盘(cloud_ssd)会被识别为vda或者vdb等。
2. 对于其他系列实例,实例的私网IP地址会发生变化。
专有网络VPC类型实例:对于系列I实例,从非I/O优化实例升级到I/O优化实例时,磁盘设备名和软件授权码会发生变化。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 describe_resource_instance_type():
    request = build_request()
    request.set_DestinationResource(destination_instance_type)
    _execute_request(request)

# 查询升级系统盘规格或类型的资源列表。
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

# 发起API请求。
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:查询升级实例规格的资源列表

# 查询可用的实例规格变配列表
def describe_resource_instance_type():
    request = build_request()
    request.set_DestinationResource(destination_instance_type)
    _execute_request(request)

场景2:查询升级系统盘规格或类型的资源列表

# 查询可用的系统盘变更配置列表
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
import os

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')

# 请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
# 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取 AccessKey 的方式进行调用,仅供参考,建议使用更安全的 STS 方式
ak_id = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']
ak_secret = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']

# 资源所在的地域ID。
region_id = "cn-hangzhou"

# 选择的资源ID,如实例ID。
resource_id = "i-bp1187lghfcy8nnz****"

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

# 更改配置的操作类型,可选值:Upgrade | Downgrade | RenewDowngrade | RenewModify。
operation_type = 'Upgrade'

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

"""
请慎用MigrateAcrossZone参数。MigrateAcrossZone(Boolean)可以实现跨系列更改配置,默认值:False。
当参数MigrateAcrossZone取值为True时,一旦您根据返回信息升级了云服务器,请留意以下注意事项:
经典网络类型实例:
1. 对于系列I实例,从非I/O优化实例升级到I/O优化实例时,实例私网IP地址、磁盘设备名和软件授权码会发生变化。对于Linux实例,普通云盘(cloud)会被识别为xvda或者xvdb等,高效云盘(cloud_efficiency)和SSD云盘(cloud_ssd)会被识别为vda或者vdb等。
2. 对于其他系列实例,实例的私网IP地址会发生变化。
专有网络VPC类型实例:对于系列I实例,从非I/O优化实例升级到I/O优化实例时,磁盘设备名和软件授权码会发生变化。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 describe_resource_instance_type():
    request = build_request()
    request.set_DestinationResource(destination_instance_type)
    _execute_request(request)

# 查询升级系统盘规格或类型的资源列表。
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

# 发起API请求。
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()

腾讯云1折,限时活动,即将结束: 马上收藏
同尘科技为腾讯云授权服务中心。
购买腾讯云产品享受折上折,更有现金返利。同意关联立享优惠

转转请注明出处:https://www.yunxiaoer.com/153213.html

(0)
上一篇 2023年12月9日
下一篇 2023年12月9日
详情页2

相关推荐

  • 阿里云RDS数据库自动续费-云淘科技

    开通自动续费可以免去您定期手动续费的烦恼,且不会因忘记续费而导致业务中断。 包年包月实例有到期时间,如果到期未续费,会导致业务中断甚至数据丢失,具体影响请参见欠费或到期的影响。 说明 按量付费实例没有到期时间,不涉及续费操作。 注意事项 自动续费:首次扣款时间为实例到期前第9天的08:00。若未扣款成功,系统将在接下来的2天每天尝试扣款,即最多尝试扣款3次,…

    2023年12月9日
  • 阿里云日志服务SLS如何模糊查询日志?-云淘科技

    本文介绍不同方式的模糊查询。 通过查询语法进行模糊查询 在日志服务查询语法中,星号(*)代表多个任意字符的词,问号(?)代表单个字符的词。例如:abc*代表查询以abc开头的词。ab?d代表查询以ab开头、d结尾且中间包含单个字符的词, 详情请参见查询语法。 说明 这种模糊查询的结果是不精确的,首先查询到命中的100个词,然后再查询这100个词命中的日志。所…

    阿里云日志服务SLS 2023年12月10日
  • 阿里云RDS数据库查询账单-云淘科技

    本文介绍如何查看在使用RDS实例过程中产生的费用明细,例如存储空间、SQL审计、实例备份、性能监控的费用。 消费类型说明 账单中存在两种消费类型,下表列出两种消费类型包含的具体费用。 消费类型 具体费用 后付费 按量付费实例本身(规格和存储)的费用。 包年包月或按量付费实例的额外费用,如SQL审计、备份(超出免费备份空间的部分)等。 预付费 包年包月实例本身…

    2023年12月9日
  • 信息流广告,信息流部分建议宽度830px,只针对默认列表样式,顺序随机
  • 阿里云负载均衡DisableDeletionProtection – 关闭删除保护-云淘科技

    关闭指定负载均衡实例的删除保护。 调试 您可以在OpenAPI Explorer中直接运行该接口,免去您计算签名的困扰。运行成功后,OpenAPI Explorer可以自动生成SDK代码示例。 调试调试授权信息下表是API对应的授权信息,可以在RAM权限策略语句的Action元素中使用,用来给RAM用户或RAM角色授予调用此API的权限。具体说明如下: 操作…

    阿里云负载均衡 2023年12月10日
  • 阿里云ECS云服务器计费FAQ-云淘科技

    本章节汇总了ECS计费的常见问题。 账号问题 为什么我不能购买按量付费实例? 没有通过支付宝实名认证能不能购买按量付费ECS实例? 按量付费实例怎么开具发票? 如果我的账号余额不足,系统会提醒我吗?什么时候提示? 账号余额不足时,按量付费实例上的数据会受影响吗? 是否支持5天内无理由退款? 是否支持百倍赔偿? 购买ECS实例后第一时间提出了退款,为什么还是扣…

    2023年12月9日

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
本站为广大会员提供阿里云、腾讯云、华为云、百度云等一线大厂的购买,续费优惠,保证底价,买贵退差。