本文通过阿里云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()