本文以Python SDK为例,为您演示如何通过CreateInstance等阿里云API弹性地创建和管理ECS实例。
背景信息
本文提供了创建ECS实例的完整代码示例,并提供了代码示例解析,详情请参见:
更多代码示例请参见阿里云代码示例库(CodeSample)。
完整代码
本文的完整代码如下所示,您可以自行根据实际情况修改和设置参数取值。
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 | # 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.4 . 3 , you can use command 'pip show aliyun-python-sdk-ecs' to check import json import logging import time from aliyunsdkcore import client from aliyunsdkecs.request.v20140526.CreateInstanceRequest import CreateInstanceRequest from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest from aliyunsdkecs.request.v20140526.StartInstanceRequest import StartInstanceRequest # configuration the log output formatter, if you want to save the output to file, # append ",filename='ecs_invoke.log'" after datefmt. 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( '<accessKeyId>' , '<accessSecret>' , '<region-Id>' ) IMAGE_ID = 'ubuntu_18_04_64_20G_alibase_20190624.vhd' INSTANCE_TYPE = 'ecs.g6.large' SECURITY_GROUP_ID = 'sg-bp1i4c0xgqxadew2****' INSTANCE_RUNNING = 'Running' VSWITCH_ID = 'vsw-bp1ddbrxdlrcbim46****' def create_instance_action(): instance_id = create_after_pay_instance(IMAGE_ID, INSTANCE_TYPE, SECURITY_GROUP_ID, VSWITCH_ID) check_instance_running(instance_id) # def create_prepay_instance_action(): # instance_id = create_prepay_instance(IMAGE_ID, INSTANCE_TYPE, SECURITY_GROUP_ID, VSWITCH_ID) # check_instance_running(instance_id=instance_id) # create one after pay ecs instance. def create_after_pay_instance(image_id, instance_type, security_group_id, vsw_vswitch_id): request = CreateInstanceRequest() request.set_ImageId(image_id) request.set_SecurityGroupId(security_group_id) request.set_InstanceType(instance_type) request.set_IoOptimized( 'optimized' ) request.set_VSwitchId(vsw_vswitch_id) request.set_SystemDiskCategory( 'cloud_ssd' ) response = _send_request(request) instance_id = response.get( 'InstanceId' ) logging.info( "instance %s created task submit successfully." , instance_id) return instance_id # create one prepay ecs instance. def create_prepay_instance(image_id, instance_type, security_group_id, vsw_vswitch_id): request = CreateInstanceRequest() request.set_ImageId(image_id) request.set_SecurityGroupId(security_group_id) request.set_InstanceType(instance_type) request.set_IoOptimized( 'optimized' ) request.set_VSwitchId(vsw_vswitch_id) request.set_SystemDiskCategory( 'cloud_ssd' ) request.set_Period( 1 ) request.set_InstanceChargeType( 'PrePaid' ) response = _send_request(request) instance_id = response.get( 'InstanceId' ) logging.info( "instance %s created task submit successfully." , instance_id) return instance_id def check_instance_running(instance_id): detail = get_instance_detail_by_id(instance_id, INSTANCE_RUNNING) index = 0 while detail is None and index < 60 : detail = get_instance_detail_by_id(instance_id) time.sleep( 10 ) if detail and detail.get( 'Status' ) == 'Stopped' : logging.info( "instance %s is stopped now." ) start_instance(instance_id) logging.info( "start instance %s job submit." ) detail = get_instance_detail_by_id(instance_id, INSTANCE_RUNNING) while detail is None and index < 60 : detail = get_instance_detail_by_id(instance_id, INSTANCE_RUNNING) time.sleep( 10 ) logging.info( "instance %s is running now." , instance_id) return instance_id def start_instance(instance_id): request = StartInstanceRequest() request.set_InstanceId(instance_id) _send_request(request) # output the instance owned in current region. def get_instance_detail_by_id(instance_id, status= 'Stopped' ): logging.info( "Check instance %s status is %s" , instance_id, status) request = DescribeInstancesRequest() request.set_InstanceIds(json.dumps([instance_id])) response = _send_request(request) instance_detail = None if response is not None: instance_list = response.get( 'Instances' ).get( 'Instance' ) for item in instance_list: if item.get( 'Status' ) == status: instance_detail = item break return instance_detail # 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__' : logging.info( "Create ECS by OpenApi!" ) create_instance_action() # create_prepay_instance_action() |
创建按量付费ECS实例
前提条件:开通按量付费ECS资源时,您的阿里云账户余额(即现金余额)和代金券的总值不得小于100.00元人民币。您可以在阿里云用户中心完成账号充值。
必选属性:
- SecurityGroupId:安全组ID。安全组相当于虚拟防火墙,通过安全组规则控制和保护实例的网络出入请求。建议按需开放和设置安全组出入规则时,不要默认开放所有的出入规则。更多详情,请参见CreateSecurityGroup。
- InstanceType:实例规格。例如,选择2核8GiB g6.large则入参为ecs.g6.large。更多详情,请参见实例规格族汇总。
- ImageId:镜像ID。您可以使用公共镜像或者自定义镜像。更多详情,请参见DescribeImages。
- VSwitchId:交换机ID。创建一台VPC类型的ECS实例需要指定交换机ID。更多详情,请参见DescribeVSwitches。
创建实例时自动检测并启动ECS实例
ECS实例的启动和停止都是异步操作,您可以在脚本创建并同时检测ECS实例符合状态时执行相应操作。以下示例代码的逻辑是:
- 得到实例ID后,自动检测实例是否处于Stopped的状态。
- 如果是Stopped,发起StartInstance指令。
- 等待ECS实例进入Running状态。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | def check_instance_running(instance_id): detail = get_instance_detail_by_id(instance_id, INSTANCE_RUNNING) index = 0 while detail is None and index < 60 : detail = get_instance_detail_by_id(instance_id) time.sleep( 10 ) if detail and detail.get( 'Status' ) == 'Stopped' : logging.info( "instance %s is stopped now." ) start_instance(instance_id) logging.info( "start instance %s job submit." ) detail = get_instance_detail_by_id(instance_id, INSTANCE_RUNNING) while detail is None and index < 60 : detail = get_instance_detail_by_id(instance_id, INSTANCE_RUNNING) time.sleep( 10 ) logging.info( "instance %s is running now." , instance_id) return instance_id |
分配公网IP
如果在创建ECS实例的过程中,指定了公网带宽,若需要公网的访问权限请调用API来分配公网IP。更多详情,请参见AllocatePublicIpAddress。
创建包年包月ECS实例
前提条件:通过API创建包年包月ECS实例的流程与ECS控制台创建流程不同,API流程使用的是自动扣费的模式。请在创建ECS实例之前确保账号支付方式有足够的余额或者信用额度,在创建ECS实例时实行直接扣费。
与创建按量付费ECS实例相比,您需要指定计费方式和计费时长。以下示例的时长为一个月。
1 2 | request.set_Period( 1 ) request.set_InstanceChargeType(‘PrePaid’) |
创建包年包月实例的示例代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # create one prepay ecs instance. def create_prepay_instance(image_id, instance_type, security_group_id, vsw_vswitch_id): request = CreateInstanceRequest() request.set_ImageId(image_id) request.set_SecurityGroupId(security_group_id) request.set_InstanceType(instance_type) request.set_IoOptimized( 'optimized' ) request.set_VSwitchId(vsw_vswitch_id) request.set_SystemDiskCategory( 'cloud_ssd' ) request.set_Period( 1 ) request.set_InstanceChargeType( 'PrePaid' ) response = _send_request(request) instance_id = response.get( 'InstanceId' ) logging.info( "instance %s created task submit successfully." , instance_id) return instance_id |