Maison  >  Article  >  Opération et maintenance  >  Comment effectuer des requêtes de renouvellement et gérer les renouvellements directement via l'API

Comment effectuer des requêtes de renouvellement et gérer les renouvellements directement via l'API

坏嘻嘻
坏嘻嘻original
2018-09-28 17:11:563730parcourir

Le contenu de cet article explique comment effectuer une requête de renouvellement et une gestion de renouvellement directement via l'API. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Renouvellement de l'instance ECS

Cet article concerne principalement les fonctions clés suivantes :

Interroger le serveur cloud en fonction du délai d'expiration

Instance de renouvellement

Interroger l'heure de renouvellement automatique du serveur cloud

Définir l'heure de renouvellement automatique du serveur cloud

Pour les serveurs cloud annuels et mensuels, le cycle de vie Très important. Si les ressources du serveur cloud ne peuvent pas être renouvelées à temps, le serveur peut être verrouillé, voire libéré, affectant ainsi la continuité des activités. L'API vous aide à comprendre et à vérifier le délai d'expiration des ressources en temps opportun et à compléter la fonction de renouvellement et de recharge.

Cet article requiert une attention particulière à l'API suivante :

Liste des instances de requête

Instance de renouvellement

Interrogez les serveurs cloud expirés dans la plage spécifiée

API pour interroger la liste d'instances En filtrant les paramètres, vous pouvez interroger les informations d'instance qui ont expiré dans un certain délai. plage horaire. En définissant les paramètres de filtrage ExpiredStartTime et ExpiredEndTime (le paramètre time est exprimé conformément à la norme ISO8601 et doit utiliser l'heure UTC. Le format est : aaaa-MM-jjTHH:mmZ.), vous pouvez facilement interroger la liste des instances qui expirer dans ce délai. Si vous devez filtrer par groupe de sécurité, ajoutez simplement l'ID du groupe de sécurité.

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)

Serveur cloud de renouvellement

Les instances de renouvellement prennent uniquement en charge les types de serveurs annuels et mensuels et ne prennent pas en charge le paiement à l'utilisation. Les serveurs go sont tenus de prendre en charge le paiement du solde du compte ou le paiement par crédit. Des déductions synchrones et la génération d'ordres seront effectuées lors de l'exécution de l'API. Par conséquent, lors de l’exécution de l’API, vous devez vous assurer que votre compte dispose de suffisamment de fonds pour prendre en charge les déductions automatiques.

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)

Les instances de renouvellement seront déduites automatiquement. Une fois le renouvellement terminé, vous pouvez interroger le délai d'expiration des ressources de l'instance en fonction de l'InstanceId. L'API étant une tâche asynchrone, le délai d'expiration des ressources de requête peut prendre 10 secondes pour changer.

Activer le renouvellement automatique du serveur cloud

Afin de réduire les coûts de maintenance à l'expiration de vos ressources, Alibaba Cloud propose également des instances ECS d'abonnement annuel et mensuel. La fonction de renouvellement automatique a été lancée. La date de renouvellement automatique et de déduction est 08:00:00 le 9ème jour avant l'expiration du serveur. Si la déduction automatique échoue la veille, elle continuera à être exécutée régulièrement le jour suivant jusqu'à ce que la déduction soit terminée ou que le blocage des ressources expire dans 9 jours. Il vous suffit de vous assurer que le solde de votre compte ou votre limite de crédit est suffisant.

Interroger les paramètres de renouvellement automatique

Vous pouvez interroger et définir le renouvellement automatique via OpenAPI. Cette API ne prend en charge que les instances d'abonnement annuel et mensuel, et une erreur sera signalée lors de l'exécution des instances de paiement à l'utilisation. L'interrogation de l'état de renouvellement automatique d'une instance prend en charge l'interrogation de jusqu'à 100 instances d'abonnement annuel et mensuel à la fois. Plusieurs ID d'instance sont reliés par des virgules.

Le paramètre d'entrée de DescribeInstanceAutoRenewAttribut est l'ID d'instance

InstanceId : prend en charge l'interrogation de jusqu'à 100 instances annuelles et mensuelles. Plusieurs ID d'instance sont connectés par des virgules.

python # vérifie que les instances sont renouvelées ou non def décrire_auto_renew(instance_ids, Expected_auto_renew=True) : décrire_request = DescribeInstanceAutoRenewAttributeRequest() décrire_request.set_InstanceId(instance_ids) réponse_detail = _send_request(request=describe_request) failed_instance_ids = '' si réponse_detail n'est pas Aucun : attributs = réponse_detail.get('InstanceRenewAttributes').get('InstanceRenewAttribute') if attributs : pour l'élément dans les attributs : auto_renew_status = item.get('AutoRenewEnabled') if auto_renew_status != Expected_auto_renew : failed_instance_ids += item. get('InstanceId') + ','scribe_auto_renew('i-1111,i-2222')

Le contenu renvoyé est le suivant :

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

Si le renouvellement automatique est défini, l'attribut renvoyé AutoRenewEnabled est vrai, sinon il renvoie faux.

Définir et annuler le renouvellement automatique des serveurs cloud

Il existe trois paramètres d'entrée pour définir le renouvellement automatique :

InstanceId : prend en charge le plus Pour interroger 100 instances d'abonnement annuel et mensuel, plusieurs ID d'instance sont connectés par des virgules.

Durée : prend en charge 1, 2, 3, 6, 12, l'unité est le mois.

AutoRenew : vrai/faux, vrai signifie activer le renouvellement automatique, faux signifie annuler le renouvellement automatique.

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')

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn