千家信息网

OpenAPI 代码如何弹性地创建和管理ECS

发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,OpenAPI 代码如何弹性地创建和管理ECS?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。弹性创建 ECS 实例创建 ECS 时需关注
千家信息网最后更新 2025年12月03日OpenAPI 代码如何弹性地创建和管理ECS

OpenAPI 代码如何弹性地创建和管理ECS?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

弹性创建 ECS 实例

创建 ECS 时需关注以下 API:

创建ECS实例

查询实例列表

启动ECS实例

分配公网IP地址

前提条件

开通按量付费产品,您的账户余额不得少于 100 元,更多的需求参见 ECS使用须知。您需要在阿里云的费用中心确保自己的余额充足。

创建按量云服务器

创建云服务器时的必选属性:

SecurityGroupId:安全组 ID。安全组通过防火墙规则实现对一组实例的配置,保护实例的网络出入请求。在设置安全组出入规则时,建议按需开放而不要默认开放所有的出入规则。您也可以通过 ECS 控制台创建安全组。

InstanceType:实例规格。参考 ECS 售卖页的选项,界面上 1 核 2GB n1.small则入参为 ecs.n1.small。

ImageId:镜像 ID。参考ECS控制台的镜像列表,您可以过滤系统公共镜像或者自定义镜像。

更多参数设置请参考创建 ECS 实例。

创建云服务器

如下面的代码所示,创建一台经典网络的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。详情请参考:分配公网 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()

看完上述内容,你们掌握 OpenAPI 代码如何弹性地创建和管理ECS的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

实例 服务 服务器 状态 代码 公网 参考 更多 查询 安全 参数 按量 资源 镜像 分配 弹性 余额 内容 只有 可以通过 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 汇智凌云的软件开发者 河南安卓软件开发大概多少钱 材料安全数据表数据库 医保网络安全新理念 在软件开发中 经典的模型 网络安全保卫支队好吗 大专网络技术实习 软件开发外包公司泄源码 健全网络安全信息汇集 小白网络技术教程 北大网络安全专业排名 网络安全二八原则 八七会议记录软件开发 网络安全的威胁都有哪些 服务器的线路主要有哪几种 小学网络安全周宣传课件 成都安卓软件开发价格表 软件开发经理岗位职责怎么写 网络安全属于专业硕士吗 深圳酒店软件开发报价 云南省电信服务器是哪种服务器 应用下载失败服务器无响应 网络安全和信息化安全汇报 网络安全有多重要主题团课 软件开发定制在哪里找 服务器接地线用多大平方电线 网络安全就学防火墙有什么用 数据库重量用什么类型 代理服务器c 西部数据服务器哪个牌子好
0