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 コマンドを実行します。

手順

  1. ローカルコンピューターの CMD、PowerShell、または Shell で、aliyuncli ecs CreateCommand --CommandContent ZWNobyAxMjM= --Type RunShellScript --Name test --Description test を実行して、シェルスクリプトを作成します (CreateCommand)。 正常に作成されたら、コマンド ID 情報が返されます。
    • CommandContentZWNobyAxMjM = は、echo 123 コマンドの Base 64 コードです。 Base 64 のエンコードまたはデコードの詳細については、『Wikipedia - Base64』をご参照ください。
    • ターゲット ECS インスタンスのオペレーティングシステムが Windows の場合は、typeRunBatScript または RunPowershellScript に変更します。
    • スクリプトが作成されたら、 CommandId が返されます。

  2. aliyuncl ecs InvokeCommand --InstanceId.1 your-vm-instance-id1 --InstanceId.2 your-vm-instance-id2 --CommandId your-command-id --Timed falseを実行して、コマンド (InvokeCommand) を実行します
    • InstanceIds は、ECS インスタンス ID を示します。 毎回最大 100 個の ECS インスタンスがサポートされます。
    • Timed は、タスクが定期的なものかどうかを示します。 --Timed True は、タスクが定期的なものであることを示し、--Timed False はその反対を示します。
    • タスクが定期的なもので、 Timed パラメーター値が True である場合、Frequency パラメーターに間隔値を指定する必要があります。 たとえば、 0 */20 * * * * は、間隔値が 20 分であることを示します。 詳細は、「 」をご参照ください。
    • 共有の InvokeId は、すべてのターゲット ECS インスタンスに対して返されます。 InvokeId を使用して、コマンドの呼び出し状況を確認することができます。
  3. 任意。 aliyuncli ecs DescribeInvocations --InstanceId your-vm-instance-id --InvokeId your-invoke-id を実行して、呼び出し状況 (DescribeInvocations) を照会します。 具体的には、InvokeId は、ECS インスタンスに対するコマンド呼び出し中に手順 2 で返された呼び出し ID です。

    返された InvokeStatus 値が Finished である場合は、コマンド処理が完了したことを示しますが、必ずしも期待したほど効果的ではありません。 DescribeInvocationResultsOutput パラメーターを確認して、特定の呼び出し結果を取得する必要があります。


  4. (任意)。 aliyuncli ecs DescribeInvocationResults --InstanceId your-vm-instance-id --InvokeId your-invoke-id を実行して、呼び出し結果 (DescribeInvocationResults) を確認します。 具体的には、InvokeId は、ECS インスタンスに対するコマンド呼び出し中に手順 2 で返された呼び出し ID です。

タスクの結果

コマンド (CreateCommand) を作成する場合、コマンドに次のリクエストのパラメーターを設定できます。

コマンドのプロパティ パラメーター 説明
実行ディレクトリ WorkingDir コマンドが実行される ECS インスタンス内のパスを指定します。 デフォルト値:
  • Linux インスタンスの場合: /root 。
  • Windows インスタンスの場合: C:\ProgramData\aliyun\assist\$(version)など、Cloud Assistant クライアントプロセスが置かれているパス。
タイムアウト期間 TimeOut

ECS インスタンス上のコマンドの呼び出しタイムアウト値を変更します。 単位は秒です。

何らかの理由でコマンドが失敗した場合、呼び出しはタイムアウトする可能性があり、Cloud Assistant クライアントにより、その後コマンドプロセスは強制的に終了します。

パラメーター値は 60 以上でなければなりません。 値が 60 より小さい場合、タイムアウト値はデフォルトで 60 秒となります。

デフォルト値: 3600

  • 1 回限りの呼び出し:
    • 呼び出しタイムアウト後は、指定された ECS インスタンスのコマンド呼び出しステータス (DescribeInvocationResults) は Failed となります。
  • 定期的な呼び出し:
    • 定期的な呼び出しのタイムアウト値は、すべての呼び出しレコードに対して有効です。
    • 1 回の呼び出し操作がタイムアウトすると、呼び出しレコード (DescribeInvocationResults) のステータスは Failed となります。
    • 最後の呼び出しのタイムアウトステータスは、次の呼び出しに影響しません。

クラウドアシスタントを使用するための 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 CreateCommandInvokeCommandDescribeInvocations、およびDescribeInvocationResultsを使用して、ECS インスタンスのメンテナンスを自動管理する方法を示しています。 Cloud Assistant の他の API も使用できます。