使用OpenApi完成云服务器ECS续费管理

本文涉及的产品
轻量应用服务器 2vCPU 4GiB,适用于搭建容器环境
轻量应用服务器 2vCPU 4GiB,适用于搭建Web应用/小程序
轻量应用服务器 2vCPU 1GiB,适用于搭建电商独立站
简介: 在除了可以在ECS控制台或者售卖页进行云服务器续费之外,阿里云 对于包年包月的云服务器的生命周期是非常重要的,如果云服务器资源不能按时的续费将可能导致服务器被锁定。所以我们需要API方便的知道和检查资源的到期时间。

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

本文将涉及到几个关键功能

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

对于包年包月的云服务器的生命周期是非常重要的,如果云服务器资源不能按时的续费将可能导致服务器被锁定甚至释放影响您的业务持续性。所以我们需要API方便的知道和检查资源的到期时间。同时可以方便的完成续费充值。

本篇您需要关注几个API

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

通过查询实例列表的API通过下面的过滤参数您可以查询在一定时间范围内到期的实例信息。通过设置过滤参数的ExpiredStartTimeExpiredEndTime,时间参数为 按照 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)
AI 代码解读

续费云服务器

续费实例只支持包年包月的服务器类型,不支持按量付费的服务器,同时要求用户必须支持账号的余额支付或信用支付。在执行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)
AI 代码解读

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

开启云服务器自动续费

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

查询自动续费设置

我们也提供了OpenApi来查询和设置自动续费,该API也仅支持包年包月的实例,按量付费的实例执行将会报错。
查询实例的自动续费状态支持一次最多查询100个包年包月的实例,多个实例id以逗号连接。

DescribeInstanceAutoRenewAttribut的入参为实例Id

  • InstanceId: 支持最多查询100个包年包月的实例,多个实例id以逗号连接。
# 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')
AI 代码解读

返回的内容如下

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

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

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

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

  • InstanceId: 支持最多查询100个包年包月的实例,多个实例id以逗号连接。
  • Duration:支持 1,2,3,6,12,单位为月
  • AutoRenew:true/false, true为开启自动续费,false为取消自动续费
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)
AI 代码解读

执行成功返回Response如下:

{"RequestId":"7DAC9984-AAB4-43EF-8FC7-7D74C57BE46D"}
AI 代码解读

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

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

完整的代码如下

请选择相应的操作完成您的任务。

#  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')
AI 代码解读
相关实践学习
快速体验PolarDB开源数据库
本实验环境已内置PostgreSQL数据库以及PolarDB开源数据库:PolarDB PostgreSQL版和PolarDB分布式版,支持一键拉起使用,方便各位开发者学习使用。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
祝犁
+关注
目录
打赏
0
0
0
2
354
分享
相关文章
阿里云服务器ecs和轻量应用服务器的区别——如何选择比较好?
阿里云ECS与轻量应用服务器对比:ECS适合企业专业场景,功能强大、配置灵活;轻量应用服务器基于ECS简化而来,面向个人开发者,适用于低访问量网站或学习测试,操作简单、成本低。两者在适用人群、使用场景、计费方式、网络带宽等方面各有差异,用户可根据需求选择。如需简易管理与低成本,选轻量应用服务器;追求高性能与复杂业务支持,则云服务器ECS更优。
阿里云服务器99元和199元与轻量应用服务器38元各自性能、适用场景与选择参考
2025年,阿里云推出了多款低价特惠云服务器,其中轻量应用云服务器2核2G 200M带宽 40G ESSD云盘38元1年,云服务器ECS 2核2G 3M带宽 40G ESSD Entry盘活动价99元1年,而2核4G 5M带宽 80G ESSD Entry盘则仅售199元1年。对于还未使用过阿里云轻量应用服务器和云服务器的用户来说,并不是很清楚他们各自有性能怎么样,主要使用场景有哪些,本文来做个简单介绍与对比,以供参考和选择。
阿里云服务器租用费用价格表:2025最新轻量+ECS+GPU优惠1年、1个月和1小时报价单
阿里云服务器租用费用价格表涵盖2025年最新轻量应用服务器、ECS云服务器及GPU服务器优惠报价。轻量应用服务器2核2G配置,一年仅68元(秒杀38元),适合个人开发者;ECS云服务器提供多种规格,如2核2G经济型99元/年、2核4G企业专享199元/年。高性能实例如4核16G游戏服务器70元/月,8核32G为160元/月。GPU服务器方面,T4计算卡4核15G配置低至1878.4元/月。此外,阿里云支持按小时计费,灵活满足不同需求。续费优惠政策明确,长周期享更高折扣,具体以官方页面为准。
ECS与VPS技术角力:从算力成本到免备案雷区,企业服务器选型合规指南
在数字化浪潮中,服务器选择至关重要。ECS(云服务器)和VPS(虚拟专用服务器)是热门选项。ECS基于云计算,提供高可用性和弹性伸缩,适合大型项目;VPS通过分割物理服务器实现资源独立,成本较低,适合小型应用。两者在网络、存储及计算性能上各有优劣,需根据需求选择。国内并不存在合法的免备案服务器,建议严格遵守法规,确保网站合法运营。
42 3
阿里云虚拟主机、轻量应用服务器、云服务器、云·速成美站、云·原生建站区别及选择参考
在选择阿里云产品完整自己网站搭建的时候,面对云虚拟主机、轻量应用服务器、云服务器ECS、云·速成美站和云·原生建站等多种选择,很多用户不是很清楚他们之间的区别。每种产品都有其独特的优势和适用场景,如何根据自己的需求和技术背景选择最适合的建站产品,成为了用户关注的焦点。本文将详细比较阿里云这五种建站产品的优势和劣势,以及它们的适用人群,以供选择参考。
在阿里云ECS云服务器上安装、配置及高效使用Docker与Docker Compose
本文介绍了在阿里云ECS上使用Ubuntu系统安装和配置Docker及Docker Compose的详细步骤。通过这些工具,可以快速部署、弹性扩展和高效管理容器化应用,满足开发和运维需求。内容涵盖Docker的安装、镜像源配置、创建Web程序镜像以及使用Docker Compose部署WordPress等实际操作,并分享了使用体验,展示了阿里云实例的高性能和稳定性。
251 4
阿里云 ECS 服务器面板如何选择?
阿里云ECS服务器面板是管理云服务器的工具,如同手机的控制中心。它简化了复杂操作,提供一键建站、监控状态、安全管理等功能。常用面板有宝塔(适合个人和小团队)、Websoft9(阿里云官方合作,开机即用)和cPanel(适合企业级需求)。新手使用面板可避免技术坑、节省时间和成本。选择时,根据需求和使用习惯决定:深度用户选Websoft9,极客选宝塔,企业选cPanel。
85 1
阿里云服务器租用价格参考:云服务器各收费项目收费标准与活动价格
阿里云服务器收费项目有实例价格、预留实例券、专有宿主机、块存储价格、存储容量单位包、带宽价格和快照服务价格,收费模式有包年包月和按量付费模式。本文为大家汇总了2025年阿里云服务器各个收费项目的最新收费标准与云服务器的最新活动价格,以供参考和了解。
云服务器和一般服务器有什么区别?
云服务器结合了独立服务器的性能与灵活性,具备更低的成本和高度定制化的特点。它提供独立的操作系统、磁盘空间及资源,支持快速扩展和降级配置,确保安全性和隐私性。相比共享主机(适合轻量级应用)和独立服务器(适合高性能需求),云服务器更适合个人用户、中小型企业和开发人员,兼具成本效益与灵活性。
40 3
服务器数据恢复—云服务器上mysql数据库数据恢复案例
某ECS网站服务器,linux操作系统+mysql数据库。mysql数据库采用innodb作为默认存储引擎。 在执行数据库版本更新测试时,操作人员误误将在本来应该在测试库执行的sql脚本在生产库上执行,导致生产库上部分表被truncate,还有部分表中少量数据被delete。
81 25

热门文章

最新文章

相关产品

  • 云服务器 ECS