详解通过API管理或定制开发ECS实例
弹性管理ECS实例
获取RAM子账号AK密钥
使用API管理ECS实例,您需要能访问ECS资源的API密钥(AccessKeyID和AccessKeySecret)。为了保证云服务的安全,您需要创建一个能访问ECS资源的RAM用户,获取该用户的AccessKey密钥,并使用这个RAM用户和API管理ECS实例。
以下是获取RAM用户AccessKey密钥的操作步骤:
创建RAM用户并获取AccessKey密钥。
直接给RAM用户授权,授予RAM用户管理云服务器服务(ECS)的权限。
安装ECSPythonSDK
首先确保您已经具备Python的Runtime,本文中使用的Python版本为2.7+。
pipinstallaliyun-python-sdk-ecs
如果提示您没有权限,请切换sudo继续执行。
sudopipinstallaliyun-python-sdk-ecs
本文使用的SDK版本为2.1.2。
HelloAlibabaCloud
创建文件hello_ecs_api.py。为了使用SDK,首先实例化AcsClient对象,这里需要RAM用户的AccessKeyID和AccessKeySecret。
AccessKeyID和AccessKeySecret是RAM用户访问阿里云ECS服务API的密钥,具有该账户完全的权限,请妥善保管。
fromaliyunsdkcoreimportclient fromaliyunsdkecs.request.v20140526.DescribeInstancesRequestimportDescribeInstancesRequest fromaliyunsdkecs.request.v20140526.DescribeRegionsRequestimportDescribeRegionsRequest clt=client.AcsClient('YourAccessKeyId','YourAccessKeySecrect','cn-beijing')
完成实例化后可以进行第一个应用的开发。查询当前账号支持的地域列表。具体的文档参见查询可用地域列表。
defhello_aliyun_regions(): request=DescribeRegionsRequest() response=_send_request(request) region_list=response.get('Regions').get('Region') assertresponseisnotNone assertregion_listisnotNone result=map(_print_region_id,region_list) logging.info("regionlist:%s",result) def_print_region_id(item): region_id=item.get("RegionId") returnregion_id 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) returnresponse_detail exceptExceptionase: logging.error(e) hello_aliyun_regions()
在命令行运行pythonhello_ecs_api.py会得到当前支持的Region列表。类似的输出如下:
[u'cn-shenzhen',u'ap-southeast-1',u'cn-qingdao',u'cn-beijing',u'cn-shanghai', u'us-east-1',u'cn-hongkong',u'me-east-1',u'ap-southeast-2',u'cn-hangzhou',u'eu-central-1', u'ap-northeast-1',u'us-west-1']
查询当前的Region下的ECS实例列表
查询实例列表和查询Region列表非常类似,替换入参对象为DescribeInstancesRequest即可,更多的查询参数参考查询实例列表。
deflist_instances(): request=DescribeInstancesRequest() response=_send_request(request) ifresponseisnotNone: instance_list=response.get('Instances').get('Instance') result=map(_print_instance_id,instance_list) logging.info("currentregionincludeinstance%s",result) def_print_instance_id(item): instance_id=item.get('InstanceId'); returninstance_id
输出结果为如下:
currentregionincludeinstance[u'i-****',u'i-****'']
更多的API参考ECSAPI概览,您可以尝试作一个查询磁盘列表,将实例的参数替换为DescribeDisksRequest。
完整代码示例
以上操作完整的代码示例如下所示。
#coding=utf-8 #ifthepythonsdkisnotinstallusing'sudopipinstallaliyun-python-sdk-ecs' #ifthepythonsdkisinstallusing'sudopipinstall--upgradealiyun-python-sdk-ecs' #makesurethesdkversionis2.1.2,youcanusecommand'pipshowaliyun-python-sdk-ecs'tocheck importjson importlogging fromaliyunsdkcoreimportclient fromaliyunsdkecs.request.v20140526.DescribeInstancesRequestimportDescribeInstancesRequest fromaliyunsdkecs.request.v20140526.DescribeRegionsRequestimportDescribeRegionsRequest #configurationthelogoutputformatter,ifyouwanttosavetheoutputtofile, #append",filename='ecs_invoke.log'"afterdatefmt. 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') clt=client.AcsClient('YourAccessKeyId','YourAccessKeySecrect','cn-beijing') #sampleapitolistaliyunopenapi. defhello_aliyun_regions(): request=DescribeRegionsRequest() response=_send_request(request) ifresponseisnotNone: region_list=response.get('Regions').get('Region') assertresponseisnotNone assertregion_listisnotNone result=map(_print_region_id,region_list) logging.info("regionlist:%s",result) #outputtheinstanceownedincurrentregion. deflist_instances(): request=DescribeInstancesRequest() response=_send_request(request) ifresponseisnotNone: instance_list=response.get('Instances').get('Instance') result=map(_print_instance_id,instance_list) logging.info("currentregionincludeinstance%s",result) def_print_instance_id(item): instance_id=item.get('InstanceId'); returninstance_id def_print_region_id(item): region_id=item.get("RegionId") returnregion_id #sendopenapirequest 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) returnresponse_detail exceptExceptionase: logging.error(e) if__name__=='__main__': logging.info("HelloAliyunOpenApi!") hello_aliyun_regions() list_instances()