この記事の内容は、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 では自動更新機能も提供しています。が発売されました。自動更新および引き落とし日は、サーバーの有効期限が切れる 9 日前の 08:00:00 です。前日に自動控除が失敗した場合は、控除が完了するか、9 日間でリソースのロックが期限切れになるまで、翌日から自動控除が定期的に実行され続けます。アカウント残高またはクレジット限度額が十分であることを確認するだけで済みます。
#自動更新設定のクエリOpenAPI を介して自動更新のクエリと設定を行うことができます。この API は年間および毎月のサブスクリプション インスタンスのみをサポートしており、従量課金制インスタンスを実行するとエラーが報告されます。インスタンスの自動更新ステータスのクエリでは、一度に最大 100 個の年間および月次サブスクリプション インスタンスのクエリをサポートしており、複数のインスタンス ID をカンマで接続します。 DescribeInstanceAutoRenewAttribut の入力パラメータはインスタンス ID です。
InstanceId: 最大 100 個の年間および月次サブスクリプション インスタンスのクエリをサポートしており、複数のインスタンス ID はカンマで接続されます。 python # インスタンスが更新されているかどうかを確認します def description_auto_renew(instance_ids, Expected_auto_renew=True): description_request = DescribeInstanceAutoRenewAttributeRequest() description_request.set_InstanceId(instance_ids) response_detail = _send_request(request=describe_request) failed_instance_ids = '' if response_detailは None ではありません: 属性 = response_detail.get('InstanceRenewAttributes').get('InstanceRenewAttribute') 属性の場合: 属性内の項目の場合: auto_renew_status = item.get('AutoRenewEnabled') if auto_renew_status != Expected_auto_renew: failed_instance_ids = item.get ('InstanceId') ',' description_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それ以外の場合は false を返します。 クラウド サーバーの自動更新の設定とキャンセル
自動更新を設定するには 3 つの入力パラメータがあります: InstanceId: 最も多くのインスタンスをサポートします。100 個の年間および月間サブスクリプション インスタンスをクエリするには、複数のインスタンス ID をカンマで接続します。
期間: 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')
以上がAPI を介して更新クエリと更新管理を直接実行する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。