ECSコンソールまたはインスタンス購入ページでElastic Compute Service (ECS) インスタンスを更新できます。 Alibaba Cloudが提供するAPI操作を呼び出して、ECSインスタンスを更新し、インスタンスの有効期限を照会することもできます。
背景情報
サブスクリプションECSインスタンスのライフサイクルは重要です。 インスタンスの有効期限が切れる前にECSインスタンスの更新に失敗した場合、インスタンスはロックされるか、リリースされる可能性があります。 これはサービスの継続性に影響します。 API操作を使用して、インスタンスの有効期限を照会し、できるだけ早い機会にインスタンスを更新できます。
このトピックでは、ECSインスタンスを更新する方法について説明します。 このトピックでは、サンプルコードとサンプルコードの説明を提供します。 詳細については、このトピックの次のセクションを参照してください。
サンプルコード
# 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 4.4.3, you can use command 'pip show aliyun-python-sdk-ecs' to check
import json
import logging
import os
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
# Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variables are configured in the code runtime environment.
# If the project code is leaked, the AccessKey pair may be leaked and the security of all resources in your account may be compromised. The following sample code shows how to use environment variables to obtain an AccessKey pair and use the AccessKey pair to call API operations. We recommend that you use Security Token Service (STS) tokens, which provide higher security.
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(os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'], os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'], '<region-Id>')
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)
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)
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, 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!")
# Query instances that expire within a specified time range.
describe_need_renew_instance()
# Renew the instances. Renewal fees are automatically deducted from your account.
# renew_instance('i-bp1aet7s13lfpjop****')
# Query the auto-renewal status of the instances.
# describe_instance_auto_renew_setting('i-bp1aet7s13lfpjop****,i-bp13uh1twnfv7vp8****')
# Configure auto-renewal for the instances.
# setting_instance_auto_renew('i-bp1aet7s13lfpjop****,i-bp13uh1twnfv7vp8****')
指定された期間内に期限切れになるインスタンスの照会
DescribeInstances操作を呼び出して、ExpiredStartTimeおよびExpiredEndTimeで指定された期間内に有効期限が切れるインスタンスを照会できます。 開始時刻と終了時刻は、yyyy-MM-ddThh:mmZ形式のISO 8601標準に準拠しており、UTCである必要があります。 セキュリティグループでインスタンスをフィルタリングする場合は、セキュリティグループのIDを指定します。
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)
ECSインスタンスの更新
更新できるのはサブスクリプションECSインスタンスのみです。 アカウントが残高支払いまたはクレジット支払いをサポートしていることを確認してください。 関連するAPIを呼び出してECSインスタンスを更新すると、アカウントから更新料金が差し引かれ、注文が作成されます。 アカウントに料金の自動控除をサポートするのに十分な資金があることを確認してください。
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インスタンスの自動更新の有効化
Alibaba Cloudは、メンテナンスコストの削減に役立つサブスクリプションECSインスタンスの自動更新を提供しています。 更新料金は、インスタンスの有効期限が切れる9日前の08:00:00にアカウントから自動的に差し引かれます。 最初の控除が失敗した場合、Alibaba Cloudは料金が控除されるまで翌日に料金の控除を試みます。 9日後に支払いが完了しない場合、インスタンスはロックされます。 アカウントに十分な残高またはクレジットがあることを確認してください。
自動更新設定のクエリ
API操作を呼び出して、自動更新を照会および設定できます。 API操作はサブスクリプションECSインスタンスのみをサポートします。 従量課金インスタンスでAPI操作を呼び出すと、エラーが返されます。 一度に最大100のサブスクリプションECSインスタンスの自動更新ステータスを照会できます。 インスタンスIDはコンマ (,) で区切ります。
DescribeInstanceAutoRenewAttribute操作の入力パラメーターには、InstanceIdが含まれます。
InstanceId: インスタンスのID。 一度に最大100のサブスクリプションインスタンスIDを指定できます。 インスタンスIDはコンマ (,) で区切ります。
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') + ',' describe_instance_auto_renew_setting('i-bp1aet7s13lfpjop****,i-bp13uh1twnfv7vp8****')
レスポンス例:
{"InstanceRenewAttributes":{"InstanceRenewAttribute":[{"Duration":0,"InstanceId":"i-1111","AutoRenewEnabled":false},{"Duration":0,"InstanceId":"i-2222","AutoRenewEnabled":false}]},"RequestId":"71FBB7A5-C793-4A0D-B17E-D6Bxxxxxxxxx"}
自動更新が設定されている場合、AutoRenewEnabledの値trueが返されます。 それ以外の場合、値falseが返されます。
ECSインスタンスの自動更新の有効化と無効化
自動更新を有効にするには、次の入力パラメーターを設定します。
InstanceId: インスタンスのID。 一度に最大100のサブスクリプションインスタンスIDを指定できます。 インスタンスIDはコンマ (,) で区切ります。
期間: ECSインスタンスの期間。 有効な値: 1、2、3、6、および12。 単位:month 。
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)
操作が成功すると、次のレスポンスが返されます。
{"RequestId":"7DAC9984-AAB4-43EF-8FC7-7D7xxxxxxxxx"}
自動更新を有効にすると、自動更新ステータスを再度照会できます。 システムは、次のコードで自動更新期間とステータスを返します。
{"InstanceRenewAttributes":{"InstanceRenewAttribute":[{"Duration":1,"InstanceId":"i-1111","AutoRenewEnabled":true},{"Duration":1,"InstanceId":"i-2222","AutoRenewEnabled":true}]},"RequestId":"7F4D14B0-D0D2-48C7-B310-B1DF713D4331"}