本文通过阿里云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权限的用户请执行: 1
pip install aliyun-python-sdk-ecs
- 普通用户请执行: 1
sudo pip install aliyun-python-sdk-ecs
说明 请确保您使用的Python SDK不低于4.6.3版本。更多详情,请前往
GitHub Repo Alibaba Cloud获取最新版本ECS SDK。
使用场景示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | # 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' ) # 您的AccessKeyId。 ak_id = "YOUR_ACCESS_KEY_ID" # 您的AccessKeySeret。 ak_secret = "YOUR_ACCESS_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:查询升级实例规格的资源列表
1 2 3 4 5 | # 查询可用的实例规格变配列表 def describe_resource_instance_type(): request = build_request() request.set_DestinationResource(destination_instance_type) _execute_request(request) |
场景2:查询升级系统盘规格或类型的资源列表
1 2 3 4 5 6 | # 查询可用的系统盘变更配置列表 def describe_resource_system_disk(): request = build_request() request.set_DestinationResource(destination_system_disk) request.set_InstanceType(instance_type) _execute_request(request) |
完整代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | # 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' ) # 您的AccessKeyId。 ak_id = "YOUR_ACCESS_KEY_ID" # 您的AccessKeySeret。 ak_secret = "YOUR_ACCESS_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() |