本文共 9179 字,大约阅读时间需要 30 分钟。
除了可以在或者创建ECS之外,您可以使用OpenApi代码来弹性的创建和管理ECS。这里使用Python来作例子。
开通按量付费产品,您的账户余额不得少于100元,更多的需求参见,您需要在确保自己的余额充足。
创建ECS的有下面几个API需要关注:
创建一台云服务器有很多关键参数,下面几个是必选属性:
创建一台云服务器也比较简单。如下面的代码就创建一台经典网络的ECS,使用的系统盘是ssd 盘参数为cloud_ssd
,选择的是io优化实例optimized
。代码如下:
# create one after pay ecs instance.def create_after_pay_instance(image_id, instance_type, security_group_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_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;
创建成功会返回相应的实例id,失败的话也会有对应的ErrorCode,创建实例的参数较多,您可以参考ecs的售卖页面进行调整。
{"InstanceId":"i-***","RequestId":"006C1303-BAC5-48E5-BCDF-7FD5C2E6395D"}
对于云服务器的状态操作, 请参考云服务器。
只有Stopped
状态的实例可以执行Start操作。也只有Running
状态的ECS可以执行Stop
操作。查询云服务器的状态可以通过查询实例列表传入InstanceId进行过滤, 在DescribeInstancesRequest
的时候可以通过传入一个JSON数组格式的String就可以查询这个资源的状态。对于查询单个实例的状态建议使用DescribeInstances
而不要使用DescribeInstanceAttribute
, 因为前者比后者返回更多的属性和内容。
下面的代码会检查实例的状态,只有实例的状态符合入参才会返回实例的详情
# 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;
创建成功后的ECS默认状态是Stopped
,如果要启动ECS为Running
状态, 只需要发送启动指令即可。
def start_instance(instance_id): request = StartInstanceRequest() request.set_InstanceId(instance_id) _send_request(request)
停止云服务器也是非常的简单,只需要传入instanceId即可。
def stop_instance(instance_id): request = StopInstanceRequest() request.set_InstanceId(instance_id) _send_request(request)
服务器的启动和停止都是一个异步的操作,所以我们可以通过脚本在创建时候检测云服务器符合状态的时候执行相应的操作。
在创建资源之后得到实例id,首先判断实例是否处于Stopped
的状态,如果处于Stopped
状态,我们下发Start
服务器的指令,然后等待服务器的状态变成 Running
状态。
def check_instance_running(instance_id): detail = get_instance_detail_by_id(instance_id=instance_id, status=INSTANCE_RUNNING) index = 0 while detail is None and index < 60: detail = get_instance_detail_by_id(instance_id=instance_id); time.sleep(10) if detail and detail.get('Status') == 'Stopped': logging.info("instance %s is stopped now.") start_instance(instance_id=instance_id) logging.info("start instance %s job submit.") detail = get_instance_detail_by_id(instance_id=instance_id, status=INSTANCE_RUNNING) while detail is None and index < 60: detail = get_instance_detail_by_id(instance_id=instance_id, status=INSTANCE_RUNNING); time.sleep(10) logging.info("instance %s is running now.", instance_id) return instance_id;
这样就完成了资源的创建。
如果在创建云服务器的过程中,您指定了公网带宽,如果想要公网的访问权限还需要调用API来分配公网IP。可以参考这个文档来完成。
除了创建按量服务的云服务器,我们的API还支持创建包年包月的服务器。包年包月的创建和官网的创建流程不同,使用的是自动扣费的模式,也就是说您需要在创建服务器之前确保账号有足够的余额或者信用额度,在创建的时候将会直接扣费无需确认。
和按量付费的ECS相比我们只需要指定付费类型和时长即可,下面的时长为1个月。
request.set_Period(1) request.set_InstanceChargeType('PrePaid')
创建包年包月实例的整体的代码如下
# create one prepay ecs instance.def create_prepay_instance(image_id, instance_type, security_group_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_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;
完整的代码如下,您可以按照自己的资源参数进行设置。
# 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 2.1.2, you can use command 'pip show aliyun-python-sdk-ecs' to checkimport jsonimport loggingimport timefrom aliyunsdkcore import clientfrom aliyunsdkecs.request.v20140526.CreateInstanceRequest import CreateInstanceRequestfrom aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequestfrom 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('Your Access Key Id', 'Your Access Key Secrect', 'cn-beijing')IMAGE_ID = 'ubuntu1404_64_40G_cloudinit_20160727.raw'INSTANCE_TYPE = 'ecs.s2.large' # 2c4g generation 1SECURITY_GROUP_ID = 'sg-****'INSTANCE_RUNNING = 'Running'def create_instance_action(): instance_id = create_after_pay_instance(image_id=IMAGE_ID, instance_type=INSTANCE_TYPE, security_group_id=SECURITY_GROUP_ID) check_instance_running(instance_id=instance_id)def create_prepay_instance_action(): instance_id = create_prepay_instance(image_id=IMAGE_ID, instance_type=INSTANCE_TYPE, security_group_id=SECURITY_GROUP_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): request = CreateInstanceRequest(); request.set_ImageId(image_id) request.set_SecurityGroupId(security_group_id) request.set_InstanceType(instance_type) request.set_IoOptimized('optimized') 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): request = CreateInstanceRequest(); request.set_ImageId(image_id) request.set_SecurityGroupId(security_group_id) request.set_InstanceType(instance_type) request.set_IoOptimized('optimized') 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_id, status=INSTANCE_RUNNING) index = 0 while detail is None and index < 60: detail = get_instance_detail_by_id(instance_id=instance_id); time.sleep(10) if detail and detail.get('Status') == 'Stopped': logging.info("instance %s is stopped now.") start_instance(instance_id=instance_id) logging.info("start instance %s job submit.") detail = get_instance_detail_by_id(instance_id=instance_id, status=INSTANCE_RUNNING) while detail is None and index < 60: detail = get_instance_detail_by_id(instance_id=instance_id, status=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 requestdef _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()
转载地址:http://ebzoa.baihongyu.com/