- 接口名称(查询变更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()