云服务器 ECS 使用OpenAPI管理ECS:使用OpenAPI续费

使用OpenAPI续费

除了通过 ECS控制台 或 售卖页 进行云服务器续费外,阿里云还支持直接通过 API 进行续费查询和续费管理。

本文主要涉及如下关键功能:

  • 按照过期时间查询云服务器
  • 续费实例
  • 查询云服务器自动续费时间
  • 设置云服务器自动续费时间

对于包年包月的云服务器,生命周期非常重要。如果云服务器资源不能按时续费,将可能导致服务器被锁定甚至被释放,从而影响业务持续性。API 帮助您及时了解和检查资源的到期时间,并完成续费充值功能。

本篇需关注如下 API:

  • 查询实例列表
  • 续费实例

查询指定范围内到期的云服务器

查询实例列表的 API,通过过滤参数,您可以查询一定时间范围内到期的实例信息。通过设置过滤参数 ExpiredStartTime 和 ExpiredEndTime(时间参数 按照 ISO8601 标准表示,并需要使用 UTC 时间。 格式为:yyyy-MM-ddTHH:mmZ。) ,可以方便地查询该时间范围内到期的实例列表。如果需要通过安全组进行过滤,只需加上安全组 ID 即可。

INSTANCE_EXPIRED_START_TIME_IN_UTC_STRING = '2017-01-22T00:00Z'
INSTANCE_EXPIRE_END_TIME_IN_UTC_STRING = '2017-01-28T00:00Z'
def describe_need_renew_instance(page_size=100, page_number=1, instance_id=None,
                                 check_need_renew=True, security_group_id=None):
    request = DescribeInstancesRequest()
    if check_need_renew is True:
        request.set_Filter3Key("ExpiredStartTime")
        request.set_Filter3Value(INSTANCE_EXPIRED_START_TIME_IN_UTC_STRING)
        request.set_Filter4Key("ExpiredEndTime")
        request.set_Filter4Value(INSTANCE_EXPIRE_END_TIME_IN_UTC_STRING)
    if instance_id is not None:
        request.set_InstanceIds(json.dumps([instance_id]))
    if security_group_id:
        request.set_SecurityGroupId(security_group_id)
    request.set_PageNumber(page_number)
    request.set_PageSize(page_size)
    return _send_request(request)

续费云服务器

续费实例只支持包年包月的服务器类型,不支持按量付费的服务器,同时要求用户必须支持账号的余额支付或信用支付。执行 API 的时候将执行同步的扣费和订单生成。因此,执行 API 的时候必须保证您的账号有足够的资金支持自动扣费。

def _renew_instance_action(instance_id, period='1'):
    request = RenewInstanceRequest()
    request.set_Period(period)
    request.set_InstanceId(instance_id)
    response = _send_request(request)
    logging.info('renew %s ready, output is %s ', instance_id, response)

续费实例将会自动完成扣费。在完成续费后,您可以根据InstanceId查询实例的资源到期时间。由于 API 为异步任务,查询资源到期时间可能需要延迟 10 秒才会变化。

开启云服务器自动续费

为了减少您的资源到期维护成本,针对包年包月的 ECS 实例,阿里云还推出了自动续费功能。 自动续费扣款日为服务器到期前第 7 天的 08:00:00。如果前一日执行自动扣费失败,将会继续下一日定时执行,直到完成扣费或者 7 天后到期资源锁定。您只需要保证自己的账号余额或者信用额度充足即可。

查询自动续费设置

您可以通过 OpenAPI 来查询和设置自动续费。该 API 仅支持包年包月的实例,按量付费的实例执行将会报错。查询实例的自动续费状态支持一次最多查询 100 个包年包月的实例,多个实例 ID 以逗号连接。

DescribeInstanceAutoRenewAttribut 的入参为实例 ID.

InstanceId:支持最多查询 100 个包年包月的实例,多个实例 ID 以逗号连接。

python # check the instances is renew or not def describe_auto_renew(instance_ids, expected_auto_renew=True): describe_request = DescribeInstanceAutoRenewAttributeRequest() describe_request.set_InstanceId(instance_ids) response_detail = _send_request(request=describe_request) failed_instance_ids = '' if response_detail is not None: attributes = response_detail.get('InstanceRenewAttributes').get('InstanceRenewAttribute') if attributes: for item in attributes: auto_renew_status = item.get('AutoRenewEnabled') if auto_renew_status != expected_auto_renew: failed_instance_ids += item.get('InstanceId') + ',' describe_auto_renew('i-1111,i-2222')

返回内容如下:

{"InstanceRenewAttributes":{"InstanceRenewAttribute":[{"Duration":0,"InstanceId":"i-1111","AutoRenewEnabled":false},{"Duration":0,"InstanceId":"i-2222","AutoRenewEnabled":false}]},"RequestId":"71FBB7A5-C793-4A0D-B17E-D6B426EA746A"}

如果设置自动续费,则返回的属性AutoRenewEnabled为 true,否则返回 false。

设置和取消云服务器的自动续费

设置自动续费有三个入参:

  • InstanceId: 支持最多查询100个包年包月的实例,多个实例 ID 以逗号连接。
  • Duration:支持 1、2、3、6、12,单位为月。
  • AutoRenew:true/false, true为开启自动续费,false为取消自动续费。
python def setting_instance_auto_renew(instance_ids, auto_renew = True): logging.info('execute enable auto renew ' + instance_ids) request = ModifyInstanceAutoRenewAttributeRequest(); request.set_Duration(1); request.set_AutoRenew(auto_renew); request.set_InstanceId(instance_ids) _send_request(request)

执行成功返回 Response 如下:

python {"RequestId":"7DAC9984-AAB4-43EF-8FC7-7D74C57BE46D"}

续费成功后,您可以再执行一次查询。如果续费成功将返回续费时长以及是否开启自动续费。

python {"InstanceRenewAttributes":{"InstanceRenewAttribute":[{"Duration":1,"InstanceId":"i-1111","AutoRenewEnabled":true},{"Duration":1,"InstanceId":"i-2222","AutoRenewEnabled":true}]},"RequestId":"7F4D14B0-D0D2-48C7-B310-B1DF713D4331"}

完整的代码如下:

#  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 check
import json
import logging
from aliyunsdkcore import client
from aliyunsdkecs.request.v20140526.DescribeInstanceAutoRenewAttributeRequest import \
    DescribeInstanceAutoRenewAttributeRequest
from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest
from aliyunsdkecs.request.v20140526.ModifyInstanceAutoRenewAttributeRequest import \
    ModifyInstanceAutoRenewAttributeRequest
from aliyunsdkecs.request.v20140526.RenewInstanceRequest import RenewInstanceRequest
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')
# data format in UTC, only support passed the value for minute, seconds is not support.
INSTANCE_EXPIRED_START_TIME_IN_UTC_STRING = '2017-01-22T00:00Z'
INSTANCE_EXPIRE_END_TIME_IN_UTC_STRING = '2017-01-28T00:00Z'
def renew_job(page_size=100, page_number=1, check_need_renew=True, security_group_id=None):
    response = describe_need_renew_instance(page_size=page_size, page_number=page_number,
                                            check_need_renew=check_need_renew,
                                            security_group_id=security_group_id)
    response_list = response.get('Instances').get('Instance')
    logging.info("%s instances need to renew", str(response.get('TotalCount')))
    if response_list > 0:
        instance_ids = ''
        for item in response_list:
            instance_id = item.get('InstanceId')
            instance_ids += instance_id + ','
            renew_instance(instance_id=instance_id)
        logging.info("%s execute renew action ready", instance_ids)
def describe_need_renew_instance(page_size=100, page_number=1, instance_id=None,
                                 check_need_renew=True, security_group_id=None):
    request = DescribeInstancesRequest()
    if check_need_renew is True:
        request.set_Filter3Key("ExpiredStartTime")
        request.set_Filter3Value(INSTANCE_EXPIRED_START_TIME_IN_UTC_STRING)
        request.set_Filter4Key("ExpiredEndTime")
        request.set_Filter4Value(INSTANCE_EXPIRE_END_TIME_IN_UTC_STRING)
    if instance_id is not None:
        request.set_InstanceIds(json.dumps([instance_id]))
    if security_group_id:
        request.set_SecurityGroupId(security_group_id)
    request.set_PageNumber(page_number)
    request.set_PageSize(page_size)
    return _send_request(request)
# check the instances is renew or not
def describe_instance_auto_renew_setting(instance_ids, expected_auto_renew=True):
    describe_request = DescribeInstanceAutoRenewAttributeRequest()
    describe_request.set_InstanceId(instance_ids)
    response_detail = _send_request(request=describe_request)
    failed_instance_ids = ''
    if response_detail is not None:
        attributes = response_detail.get('InstanceRenewAttributes').get('InstanceRenewAttribute')
        if attributes:
            for item in attributes:
                auto_renew_status = item.get('AutoRenewEnabled')
                if auto_renew_status != expected_auto_renew:
                    failed_instance_ids += item.get('InstanceId') + ','
    if len(failed_instance_ids) > 0:
        logging.error("instance %s auto renew not match expect %s.", failed_instance_ids,
                      expected_auto_renew)
def setting_instance_auto_renew(instance_ids, auto_renew=True):
    logging.info('execute enable auto renew ' + instance_ids)
    request = ModifyInstanceAutoRenewAttributeRequest();
    request.set_Duration(1);
    request.set_AutoRenew(auto_renew);
    request.set_InstanceId(instance_ids)
    _send_request(request)
    describe_instance_auto_renew_setting(instance_ids, auto_renew)
# if using the instance id can be found means the instance is not renew successfully.
def check_instance_need_renew(instance_id):
    response = describe_need_renew_instance(instance_id=instance_id)
    if response is not None:
        return response.get('TotalCount') == 1
    return False
# 续费一个实例一个月
def renew_instance(instance_id, period='1'):
    need_renew = check_instance_need_renew(instance_id)
    if need_renew:
        _renew_instance_action(instance_id=instance_id, period=period)
        # describe_need_renew_instance(instance_id=instance_id, check_need_renew=False)
def _renew_instance_action(instance_id, period='1'):
    request = RenewInstanceRequest()
    request.set_Period(period)
    request.set_InstanceId(instance_id)
    response = _send_request(request)
    logging.info('renew %s ready, output is %s ', instance_id, response)
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("Renew ECS Instance by OpenApi!")
    # 查询在指定的时间范围内是否有需要续费的实例。
    describe_need_renew_instance()
    # 续费一个实例, 直接执行扣费
    renew_instance('i-1111')
    # 查询实例自动续费的状态
    # describe_instance_auto_renew_setting('i-1111,i-2222')
    # 设置实例自动续费
    # setting_instance_auto_renew('i-1111,i-2222')

原文链接

时间: 2024-11-02 17:36:11

云服务器 ECS 使用OpenAPI管理ECS:使用OpenAPI续费的相关文章

云服务器 ECS 使用OpenAPI管理ECS:使用OpenAPI弹性创建ECS实例

使用OpenAPI弹性创建ECS实例 除了可以在ECS控制台或售卖页创建 ECS 外,您还可以使用 OpenAPI 代码来弹性地创建和管理ECS.本页面使用 Python 为例进行说明. 创建 ECS 时需关注以下 API: 创建ECS实例 查询实例列表 启动ECS实例 分配公网IP地址 前提条件 开通按量付费产品,您的账户余额不得少于 100 元,更多的需求参见 ECS使用须知.您需要在阿里云的费用中心确保自己的余额充足. 创建按量云服务器 创建云服务器时的必选属性: SecurityGrou

云服务器 ECS 使用OpenAPI管理ECS:使用OpenAPI弹性管理ECS实例

使用OpenAPI弹性管理ECS实例 您除了可以通过 ECS 管理控制台 创建或管理 ECS 实例外,您也能通过 OpenAPI 管理或定制开发 ECS 实例. 阿里云提供了 SDK 来包装 OpenAPI,将云服务器 ECS 的管理集成到已有系统中.本文基于 Python 的开发来说明如何通过 OpenAPI 管理 ECS 实例.如果您没有 Python 开发经验,也能通过本文完成云服务的开发. 获取 RAM 子账号 AK 密钥 使用 OpenAPI 管理 ECS 实例,您需要能访问 ECS

云服务器 ECS 使用OpenAPI管理ECS:使用OpenAPI弹性释放ECS实例

使用OpenAPI弹性释放ECS实例 云服务器 ECS 的一个重要特性就是按需创建资源.您可以在业务高峰期按需弹性地进行自定义资源创建,完成业务计算时释放资源.本篇将提供若干 Tips 帮助您更加便捷地完成云服务器的释放以及弹性设置. 本文将涉及到几个重要功能和相关API: 释放按量付费的云服务器 设置按量付费实例的自动释放时间 停止服务器 查询实例列表 释放后,实例所使用的物理资源将被回收,包括磁盘及快照,相关数据将全部丢失且永久不可恢复.如果您还想继续使用相关的数据,建议您释放云服务器之前一

阿里云双11活动撸福利攻略云产品篇 包年新购5折,续费8折

一年一度的阿里双11活动预热早已来袭,点火炬.淘宝站队.抓黄金猫等应接不暇. 作为阿里巴巴旗下的云服务,2017年阿里云双11活动已于1024程序员日启动. 小编将根据不同活动给大家播报如何撸阿里云双11优惠. 购买产品前领取幸运券,价格更低呦. 阿里云幸运券获取链接>>https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=leys3nb3&utm_source=leys3nb3 2017阿

使用OpenApi弹性创建云服务器ECS

除了可以在ECS控制台或者售卖页创建ECS之外,您可以使用OpenApi代码来弹性的创建和管理ECS.这里使用Python来作例子. 开通按量付费产品,您的账户余额不得少于100元,更多的需求参见ECS 使用须知,您需要在阿里云的费用中心确保自己的余额充足. 创建ECS的有下面几个API需要关注: 创建ECS实例 查询实例列表 启动ECS实例 分配公网 IP 地址 按量的云服务器创建 创建一台云服务器有很多关键参数,下面几个是必选属性: SecurityGroupId: 安全组Id,安全组通过安

云服务器 ECS 学习笔记

云服务器 ECS 云服务器 Elastic Compute Service(ECS)是阿里云提供的一种基础云计算服务 阿里云专有网络: 在阿里云专有网络之上,可以产生更多的业务可能性. 阿里云专有网络更加稳定和安全. 纵向的弹性,即单个服务器的配置变更 对于阿里云的弹性而言,是计算的弹性.存储的弹性.网络的弹性以及您对于业务架构重新规划的弹性 实例规格族,根据业务场景可分为: 面向通用计算场景的实例规格族 面向内存优化场景的实例规格族 面向计算优化场景的实例规格族 面向存储优化场景的实例规格族

阿里云ECS服务器升级配置、提前续费、重装系统常见应用记录

如今阿里云在IDC圈中的影响力和产品的范围广度已经严重影响到很多主机商的利益,照着这样的趋势发展,不断的增加产品种类以及各种周边的服务延伸,很多国内的个人主机商.企业类的主机商肯定需要调整原有的营销和产品模式.但是对于大部分用户来说,增加的竞争会使得我们降低成本,比如如今选择虚拟主机.VPS服务器等相对来说价格还是比较便宜.   老蒋手中有两台当初阿里云ECS服务器512MB内存方案配置,不过目前最低的配置方案是1GB内存方案,相对来说老配置方案比较难得且需要保留的,但是觉得两台机器有点浪费.老

阿里云服务器是什么

什么是云服务器 ECS 云服务器 ECS (Elastic Compute Service) 是处理能力可弹性伸缩的计算服务,它的管理方式比物理服务器更简单高效.无需提前采购投入,您可以根据业务的需要,随时创建实例.扩容磁盘.或释放任意多台云服务器实例. 云服务器 ECS 实例(以下简称 ECS 实例)是一个虚拟的计算环境,包含 CPU.内存等最基础的计算组件,是云服务器呈献给每个用户的实际操作实体.ECS 实例是云服务器最为核心的概念,其他的资源,比如磁盘.IP.镜像.快照等,只有与 ECS

你所不知道的21个云服务器应用实践———云计算综合入门指南

摘要:如今,基于互联网的服务和交互已经越来越深入我们的生活,"云计算"也成为了不折不扣的高频词汇.并以其快捷.按需调用网络资源的优势为我们的日常生活带来了诸多便利和改变.之前,我们基于云服务器的多种利用方法制作了"云计算的1024种玩法"的零基础入门专题,现在,我们对这一专题进行扩展和整合,制作出了这份云计算综合入门指南.   它分为两个部分,分别是云计算基础和云计算实践.在基础篇中,我们能学习到关于云服务器远程控制搭建,数据管理使用,以及建站环境扩展等工具性内容: