ecs 实例续费
本文主要涉及如下关键功能:
按照过期时间查询云服务器
续费实例
查询云服务器自动续费时间
设置云服务器自动续费时间
对于包年包月的云服务器,生命周期非常重要。如果云服务器资源不能按时续费,将可能导致服务器被锁定甚至被释放,从而影响业务持续性。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 实例,阿里云还推出了自动续费功能。 自动续费扣款日为服务器到期前第 9 天的 08:00:00。如果前一日执行自动扣费失败,将会继续下一日定时执行,直到完成扣费或者 9 天后到期资源锁定。您只需要保证自己的账号余额或者信用额度充足即可。
查询自动续费设置
您可以通过 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 checkimport jsonimport loggingfrom aliyunsdkcore import clientfrom aliyunsdkecs.request.v20140526.describeinstanceautorenewattributerequest import \ describeinstanceautorenewattributerequestfrom aliyunsdkecs.request.v20140526.describeinstancesrequest import describeinstancesrequestfrom aliyunsdkecs.request.v20140526.modifyinstanceautorenewattributerequest import \ modifyinstanceautorenewattributerequestfrom aliyunsdkecs.request.v20140526.renewinstancerequest import renewinstancerequestlogging.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 notdef 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')
以上就是怎么直接通过 api 进行续费查询和续费管理的详细内容。
