>  기사  >  운영 및 유지보수  >  API를 통해 직접 갱신 조회 및 갱신 관리를 수행하는 방법

API를 통해 직접 갱신 조회 및 갱신 관리를 수행하는 방법

坏嘻嘻
坏嘻嘻원래의
2018-09-28 17:11:563756검색

이 글의 내용은 API를 통해 직접 갱신 쿼리 및 갱신 관리를 수행하는 방법에 대한 내용입니다. 필요한 친구들이 참고할 수 있기를 바랍니다.

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초가 걸릴 수 있습니다.

클라우드 서버 자동 갱신 활성화

리소스 만료 유지 관리 비용을 줄이기 위해 Alibaba Cloud는 연간 및 월간 ECS 인스턴스에 대한 자동 갱신 기능도 출시했습니다. 자동 갱신 및 차감 일자는 서버 만료 전 9일 08시입니다. 전날 자동 차감이 실패하면 차감이 완료되거나 9일 후 리소스 잠금이 만료될 때까지 다음 날 정기적으로 계속 실행됩니다. 계정 잔액이나 신용 한도가 충분한지 확인하기만 하면 됩니다.

자동 갱신 설정 조회

OpenAPI를 통해 자동 갱신을 조회하고 설정할 수 있습니다. 이 API는 연간 및 월간 구독 인스턴스만 지원하며, 종량제 인스턴스를 실행할 때 오류가 보고됩니다. 인스턴스의 자동 갱신 상태를 쿼리하면 한 번에 최대 100개의 연간 및 월간 구독 인스턴스를 쿼리할 수 있습니다. 여러 인스턴스 ID는 쉼표로 연결됩니다.

DescribeInstanceAutoRenewAttribut의 입력 매개변수는 인스턴스 ID입니다.

InstanceId: 최대 100개의 연간 및 월별 인스턴스 쿼리를 지원합니다. 여러 인스턴스 ID가 쉼표로 연결됩니다.

python # 인스턴스가 갱신되었는지 확인 def explain_auto_renew(instance_ids, Expect_auto_renew=True): explain_request = DescriptionInstanceAutoRenewAttributeRequest() explain_request.set_InstanceId(instance_ids) response_detail = _send_request(request=describe_request) failed_instance_ids = '' response_detail이 None이 아닌 경우: 속성 = response_detail.get('InstanceRenewAttributes').get('InstanceRenewAttribute') if 속성: 속성의 항목: auto_renew_status = item.get('AutoRenewEnabled') if auto_renew_status != Expect_auto_renew: failed_instance_ids += item.get('InstanceId) ') + ',' explain_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가 쉼표로 연결됩니다.

기간: 1, 2, 3, 6, 12를 지원하며 단위는 월입니다.

자동 갱신: 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')

위 내용은 API를 통해 직접 갱신 조회 및 갱신 관리를 수행하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.