ECS インスタンスのメンテナンスは、ECS インスタンスを最良の状態に保ち、トラブルシューティングの効率を保証することを目的としています。 しかし、手動によるメンテナンスには膨大な時間と労力がかかります。 この問題に対処するために、 Cloud Assistantを使用して、日常のメンテナンス作業の自動化とバッチ処理を行うことができます。 ここでは、ECS インスタンスで Cloud Assistant コマンドを呼び出して、ECS インスタンスを自動的に維持する方法を説明します。
このタスクについて
Cloud Assistant は、次の3つのコマンドタイプをサポートします。
コマンドタイプ | パラメーター | 説明 |
---|---|---|
シェルスクリプト | RunShellScript | 実行中の Linux インスタンス上で実行されているシェルスクリプト。 |
PowerShell スクリプト | RunPowerShellScript | 実行中の Windows インスタンス上で実行されている PowerShell スクリプト。 |
Bat スクリプト | RunBatScript | 実行中の Windows インスタンス上で実行されている Bat スクリプト。 |
前提条件
- ターゲット ECS インスタンスのネットワーク種別が VPC であることを確認する必要があります。
- ターゲット ECS インスタンスのステータスは、[実行中] (
Running
) でなければなりません。 - ターゲット ECS インスタンスには、事前に Cloud Assistant クライアントがインストールされている必要があります。 詳細は、「クラウドアシスタントクライアント」をご参照ください。
- PowerShell コマンドを実行するには、ターゲットの Windows インスタンスに PowerShell 機能が設定されていることを確認する必要があります。
- 最新バージョンの Alibaba Cloud CLI は GitHub から入手できます。
- Alibaba Cloud CLI (Command-Line Interface) がインストールされていることを確認する必要があります。
- SDK がアップグレードされている必要があります。
次の例は、Cloud Assistant を使用するために Alibaba Cloud CLI で API を使用する方法を示しています。 たとえば、Linux インスタンス上で
echo 123
コマンドを実行します。
手順
タスクの結果
コマンド (CreateCommand) を作成する場合、コマンドに次のリクエストのパラメーターを設定できます。
コマンドのプロパティ | パラメーター | 説明 |
---|---|---|
実行ディレクトリ | WorkingDir | コマンドが実行される ECS インスタンス内のパスを指定します。 デフォルト値:
|
タイムアウト期間 | TimeOut |
ECS インスタンス上のコマンドの呼び出しタイムアウト値を変更します。 単位は秒です。 何らかの理由でコマンドが失敗した場合、呼び出しはタイムアウトする可能性があり、Cloud Assistant クライアントにより、その後コマンドプロセスは強制的に終了します。 パラメーター値は 60 以上でなければなりません。 値が 60 より小さい場合、タイムアウト値はデフォルトで 60 秒となります。 デフォルト値: 3600
|
クラウドアシスタントを使用するための Python SDK のサンプル
Alibaba Cloud SDK を使用して Cloud Assistant を使用することもできます。 Alibaba Cloud SDK の設定方法の詳細については、Alibaba Cloud ユーザー向けの「」をご参照ください。 以下は、Cloud Assistant を使用するための Python SDK コードです。
# 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
import os
import time
import datetime
import base64
from aliyunsdkcore import client
from aliyunsdkecs.request.v20140526. CreateCommandRequest import CreateCommandRequest
from aliyunsdkecs.request.v20140526. InvokeCommandRequest import InvokeCommandRequest
from aliyunsdkecs.request.v20140526. DescribeInvocationResultsRequest import DescribeInvocationResultsRequest
# configuration the log output formatter, if you want to save the output to file,
# append ",filename='ecs_invoke.log'" after datefmt.
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',filename='aliyun_assist_openapi_test.log', filemode='w')
#access_key = 'Your Access Key Id'
#acess_key_secrect = 'Your Access Key Secrect'
#region_name = 'cn-shanghai'
#zone_id = 'cn-shanghai-b'
access_key = 'LTAIXXXXXXXXXXXX'
acess_key_secrect = '4dZXXXXXXXXXXXXXXXXXXXXXXXX'
region_name = 'cn-hangzhou'
zone_id = 'cn-hangzhou-f'
clt = client.AcsClient(access_key, acess_key_secrect, region_name)
def create_command(command_content, type, name, description):
request = CreateCommandRequest()
request.set_CommandContent(command_content)
request.set_Type(type)
request.set_Name(name)
request.set_Description(description)
response = _send_request(request)
if response is None:
return None
command_id = response.get('CommandId')
return command_id;
def invoke_command(instance_id, command_id, timed, cronat):
request = InvokeCommandRequest()
request.set_Timed(timed)
InstanceIds = [instance_id]
request.set_InstanceIds(InstanceIds)
request.set_CommandId(command_id)
request.set_Frequency(cronat)
response = _send_request(request)
invoke_id = response.get('InvokeId')
return invoke_id;
def get_task_output_by_id(instance_id, invoke_id):
logging.info("Check instance %s invoke_id is %s", instance_id, invoke_id)
request = DescribeInvocationResultsRequest()
request.set_InstanceId(instance_id)
request.set_InvokeId(invoke_id)
response = _send_request(request)
invoke_detail = None
output = None
if response is not None:
result_list = response.get('Invocation').get('InvocationResults').get('InvocationResult')
for item in result_list:
invoke_detail = item
output = base64.b64decode(item.get('Output'))
break;
return output;
def execute_command(instance_id):
command_str = 'yum check-update'
command_id = create_command(base64.b64encode(command_str), 'RunShellScript', 'test', 'test')
if(command_id is None):
logging.info('create command failed')
return
invoke_id = invoke_command(instance_id, command_id, 'false', '')
if(invoke_id is None):
logging.info('invoke command failed')
return
time.sleep(15)
output = get_task_output_by_id(instance_id, invoke_id)
if(output is None):
logging.info('get result failed')
return
logging.info("output: %s is \n", output)
# send open api request
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__':
execute_command('i-bp17zhpbXXXXXXXXXXXXX')
参考文献
上記の例では、Alibaba Cloud CLI とCloud Assistant API CreateCommand、InvokeCommand、DescribeInvocations、およびDescribeInvocationResultsを使用して、ECS インスタンスのメンテナンスを自動管理する方法を示しています。 Cloud Assistant の他の API も使用できます。
- StopInvocation: スケジュールされたコマンド処理の中止。
- ModifyCommand: コマンドの内容の変更。
- DescribeCommands: 使用可能なコマンドの照会。
- DeleteCommand: コマンドの削除。