博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用OpenApi弹性创建云服务器ECS
阅读量:6328 次
发布时间:2019-06-22

本文共 9179 字,大约阅读时间需要 30 分钟。

除了可以在或者创建ECS之外,您可以使用OpenApi代码来弹性的创建和管理ECS。这里使用Python来作例子。

开通按量付费产品,您的账户余额不得少于100元,更多的需求参见,您需要在确保自己的余额充足。

创建ECS的有下面几个API需要关注:

按量的云服务器创建

创建一台云服务器有很多关键参数,下面几个是必选属性:

  • SecurityGroupId: 安全组Id,安全组通过安全组防火墙规则配置实现对一组实例的防火墙配置。保护您的实例的网络出入请求。在设置安全组的出入规则的时候建议按需开放而不要默认开放所有的出入规则。您也可以通过ECS控制台创建安全组进行创建。
  • InstanceType: 实例规格, 参考ECS的选项,界面上1核2GB n1.small则入参为 ecs.n1.small
  • ImageId: 镜像Id, 参考的镜像列表,您可以过滤系统公共镜像或者自定义镜像
  • 更多参数参考来进行设置。
创建一台云服务器

创建一台云服务器也比较简单。如下面的代码就创建一台经典网络的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;

这样就完成了资源的创建。

分配公网IP

如果在创建云服务器的过程中,您指定了公网带宽,如果想要公网的访问权限还需要调用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/

你可能感兴趣的文章
60 Permutation Sequence
查看>>
主流的RPC框架有哪些
查看>>
Hive学习之路 (七)Hive的DDL操作
查看>>
[转]mysql使用关键字作为列名的处理方式
查看>>
awesome go library 库,推荐使用的golang库
查看>>
树形展示形式的论坛
查看>>
jdbcTemplate 调用存储过程。 入参 array 返回 cursor
查看>>
C++中的stack类、QT中的QStack类
查看>>
Linux常用基本命令[cp]
查看>>
CSS 相对|绝对(relative/absolute)定位系列(一)
查看>>
关于 Nginx 配置 WebSocket 400 问题
查看>>
Glide和Govendor安装和使用
查看>>
Java全角、半角字符的关系以及转换
查看>>
Dubbo和Zookeeper
查看>>
前端项目课程3 jquery1.8.3到1.11.1有了哪些新改变
查看>>
UOJ#179. 线性规划(线性规划)
查看>>
整合spring cloud云架构 - SSO单点登录之OAuth2.0登录认证(1)
查看>>
Isolation Forest原理总结
查看>>
windows的服务中的登录身份本地系统账户、本地服务账户和网络服务账户修改
查看>>
JAVA中循环删除list中元素的方法总结
查看>>