すべてのプロダクト
Search
ドキュメントセンター

Elastic Compute Service:Cloud Assistantコマンドを実行してインスタンスを停止または再起動する

最終更新日:Apr 18, 2024

このトピックでは、Cloud Assistantコマンドを実行してElastic Compute Service (ECS) インスタンスを停止または再起動する方法について説明します。

前提条件

  • 停止または再起動するインスタンスの状態は、実行中 (実行中) です。

  • Cloud Assistance Agentがインスタンスにインストールされています。 詳細については、「Cloud Assistant Agentのインストール」をご参照ください。

(推奨) 終了コードを使用してインスタンスを停止または再起動する

Cloud Assistantコマンドを実行してインスタンスを停止または再起動する場合、コマンドの実行ステータスをリアルタイムで正確にするために、コマンドの最後に特定の終了コードを追加することを推奨します。 終了コードなしでCloud Assistantコマンドを実行してインスタンスを停止または再起動すると、コマンドが停止または再起動操作で終了しても、コマンドの実行ステータスが正しく更新されない場合があります。 これは、インスタンスを停止または再起動するためにコマンドを実行する前に、Cloud Assistant Agentがコマンドの実行ステータスを保存しないために発生します。

重要

Cloud Assistant Agentのインストールバージョンが次のバージョンより前でないことを確認します。

  • Linux: 2.2.3.317

  • Windows: 2.1.3.317

Cloud Assistantコマンドを終了コードで実行したときにエラーが報告された場合は、Cloud Assistant Agentを最新バージョンにアップグレードします。 詳細については、「Cloud Assistant Agentのアップグレードまたは無効化」をご参照ください。

  1. にログインします。ECSコンソール.

  2. 左側のナビゲーションウィンドウで、メンテナンス&モニタリング > クラウドアシスタント.

  3. 上部のナビゲーションバーで、リソースが属するリージョンとリソースグループを選択します。 地域

  4. ECSクラウドアシスタントページの右上隅にある コマンドの作成/実行 をクリックします。

  5. コマンド情報 セクションで、パラメーターを設定します。 詳細については、「Cloud Assistantコマンドの作成と実行」をご参照ください。

  6. [コマンドコンテンツ] コードエディターで、コマンドスクリプトの最後に終了コードを追加します。

    • コマンドを実行してインスタンスを停止するには、インスタンスのオペレーティングシステムタイプに基づいて、次の表のいずれかの終了コードを指定します。

      オペレーティングシステム

      終了コード

      サンプルコマンド

      Linux

      193

      # 次のシェルコマンドが193の終了コードを返した場合、指定されたインスタンスを停止する操作がトリガーされます。
      出口193 

      Windows

      3009

      # 次のPowerShellコマンドが3009の終了コードを返した場合、指定されたインスタンスを停止する操作がトリガーされます。
      出口3009 
    • コマンドを実行してインスタンスを再起動するには、インスタンスのオペレーティングシステムタイプに基づいて、次の表のいずれかの終了コードを指定します。

      オペレーティングシステム

      終了コード

      サンプルコマンド

      Linux

      194

      # 次のシェルコマンドが194の終了コードを返した場合、指定されたインスタンスを再起動する操作がトリガーされます。
      出口194 

      Windows

      3010

      # 次のPowerShellコマンドが3010の終了コードを返した場合、指定されたインスタンスを再起動する操作がトリガーされます。
      出口3010 
  7. では、インスタンスの選択またはマネージドインスタンスの選択セクションで、コマンドを実行するインスタンスを選択します。

    説明

    マネージドインスタンスは、Alibaba Cloudによって提供されていないが、Cloud Assistantによって管理されているインスタンスです。 詳細は、「Alibaba Cloudマネージドインスタンス」をご参照ください。

  8. クリック実行して保存または実行コマンドをすぐに実行します。

Cloud Assistantコマンドを実行してインスタンスをバッチ再起動するAPI操作を呼び出す

Alibaba Cloudは、クラウドリソースを管理するためのさまざまなAPI操作を提供しています。 このセクションでは、オンプレミスのLinux環境でPythonコードを実行してCloud Assistantコマンドを実行し、インスタンスをバッチ再起動することによってAPI操作を呼び出す方法について説明します。

  1. Cloud Assistantコマンドの実行に必要な情報を準備します。

    1. AccessKeyペアを取得します。

      RAM (Resource Access Management) ユーザーのAccessKeyペアを取得することを推奨します。 詳細については、「AccessKey の作成」をご参照ください。

    2. Cloud Assistantコマンドを実行するインスタンスのリージョンIDを取得します。

      DescribeRegions操作を呼び出して、最新のリージョンリストを照会できます。 DescribeRegions操作のパラメーターについては、「DescribeRegions」をご参照ください。

    3. Cloud Assistantコマンドを実行するインスタンスのIDを取得します。

      DescribeInstances操作を呼び出して、特定の条件を満たすインスタンスを照会できます。 たとえば、実行中の状態にあるインスタンスや特定のタグが追加されているインスタンスを照会できます。 DescribeInstances操作のパラメーターについては、「DescribeInstances」をご参照ください。

  2. オンプレミス環境を設定し、サンプルコードを実行します。

    1. Alibaba Cloud ECS SDK for Pythonをインストールします。

      sudo pip install aliyun-python-sdk-ecs
    2. ECS SDK for Pythonを最新バージョンに更新します。

      sudo pip install -- upgrade aliyun-python-sdk-ecs
    3. を作成します。Create a. pyファイルに次のサンプルコードを記述します。

      サンプルコードの次のパラメーターを、前の手順で取得した実際の値に置き換えます。

      • AccessKey ID:

        access_key = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID ']

      • AccessKey secret:

        access_key_secret = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET ']

      • リージョンID:

        region_id = '<yourRegionId>'

      • インスタンスID:

        ins_ids= ["i-bp185fcs ****" 、"i-bp14wwh ****" 、"i-bp13jbr ****"]

      サンプルコード:

      # coding=utf-8
      # ECS SDK for Pythonがインストールされていない場合は、sudo pip install aliyun-python-sdk-ecsコマンドを実行します。
      # Python用のECS SDKの最新バージョンを使用していることを確認してください。
      # sudo pip install -- upgrade aliyun-python-sdk-ecsコマンドを実行して、Python用のECS SDKのバージョンをアップグレードします。
      
      jsonのインポート
      インポートsys
      インポートbase64
      インポート時間
      インポートロギング
      osのインポート
      aliyunsdkcore.clientインポートからAcsClient
      からaliyunsdkcore.acs_exception.exceptions import ClientException
      aliyunsdkcore.acs_exception.exceptionsからServerExceptionをインポート
      aliyunsdkecs.request. v20140526.からRunCommandRequestのインポートRunCommandRequest
      aliyunsdkecs.request. v20140526.からDescribeInvocationResultsRequestのインポートDescribeInvocationResultsRequest
      aliyunsdkecs.request. v20140526.からRebootInstancesRequestのインポートRebootInstancesRequest
      aliyunsdkecs.request. v20140526.からDescribeInstancesRequestのインポートDescribeInstancesRequest
      
      # ログ出力フォーマッタを設定します。
      logging.basicConfig(level = logging.INFO、
                          format="%(asctime)s %(name)s [%(levelname)s]: %(message)s" 、
                          datefmt='% m-% d % H:% M')
      
      logger = logging.getLogger()
      
      # ALIBABA_CLOUD_ACCESS_KEY_ID環境変数とALIBABA_CLOUD_ACCESS_KEY_SECRET環境変数がコードランタイム環境で設定されていることを確認します。 
      # プロジェクトコードが漏洩すると、AccessKeyペアが漏洩し、アカウント内のすべてのリソースのセキュリティが侵害される可能性があります。 次のサンプルコードは参考用です。 より高いセキュリティを提供するSecurity Token Service (STS) トークンの使用を推奨します。 
      access_key = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID ']
      access_key_secret = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET ']
      region_id = '<yourRegionId>'# 取得したリージョンIDを指定します。
      
      client = AcsClient(access_key, access_key_secret, region_id)
      
      def base64_decode(content、code='utf-8 '):
          sys.version_info.major == 2の場合:
              base64.b64decode (コンテンツ) を返します
          else:
              base64.b64decode (コンテンツ) を返します。decode (コード)
      
      def get_invoke_result(invoke_id):
          request = DescribeInvocationResultsRequest()
          リクエスト .set_accept_format( &#039;JSON&#039;)
      
          request.set_InvokeId(invoke_id)
          response = client.do_action_with_exception(request)
          response_details = json.loads (レスポンス)["Invocation"]["InvocationResults"]["InvocationResult"]
          dict_res = { detail.get("InstanceId",""):{"status": detail.get("InvocationStatus",""),"output":base64_decode(detail.get("Output","))} for detail in response_details}
          dict_resを返す
      
      def get_instances_status(instance_ids):
          リクエスト = DescribeInstancesRequest()
          リクエスト .set_accept_format( &#039;JSON&#039;)
          request.set_InstanceIds(instance_ids)
          response = client.do_action_with_exception(request)
          response_details = json.loads (レスポンス)["インスタンス"]["インスタンス"]
          dict_res = { detail.get("InstanceId",""):{"status":detail.get("Status",")} for detail in response_details}
          dict_resを返す
      
      def run_command(cmdtype,cmdcontent,instance_ids,timeout=60):
          """
          cmdtype: コマンドのタイプ。 有効な値: RunBatScript、RunPowerShellScript、およびRunShellScript。
          cmdcontent: コマンドの内容。
          instance_ids: コマンドを実行するインスタンスのID。
          """
          試してみてください。
              request = RunCommandRequest()
              リクエスト .set_accept_format( &#039;JSON&#039;)
      
              request.set_Type(cmdtype)
              request.set_CommandContent(cmdcontent)
              request.set_InstanceIds(instance_ids)
              # コマンドを実行するためのタイムアウト期間。 単位は秒です。 デフォルト値: 0。 このパラメーターは、実行するコマンドに基づいて指定します。
              request.set_Timeout (タイムアウト)
              response = client.do_action_with_exception(request)
              invoke_id = json.loads (応答).get("InvokeId")
              return invoke_id
          Eなどの例外を除いて:
              logger.error("run command failed")
      
      def reboot_instances(instance_ids、Force=False):
          """
          instance_ids: 再起動するインスタンスのID。
          Force: インスタンスを強制的に再起動するかどうかを指定します。 デフォルト値:False。
          """
          request = RebootInstancesRequest()
          リクエスト .set_accept_format( &#039;JSON&#039;)
          request.set_InstanceIds(instance_ids)
          request.set_ForceReboot (フォース)
          response = client.do_action_with_exception (リクエスト)
      
      def wait_invoke_finished_get_out(invoke_id,wait_count,wait_interval):
          範囲内のi (wait_count) の場合:
              result = get_invoke_result(invoke_id)
              if set([res["status"] for _, result.items()]) & set(["Running","Pending","Stopping"]):
                  time.sleep(wait_interval)
              else:
                  結果を返す
          リターン結果
      
      def wait_instance_reboot_ready(ins_ids、wait_count、wait_interval):
          範囲内のi (wait_count) の場合:
              result = get_instances_status(ins_ids)
              if set([res["status"] for _, result.items() のres]) ! =set(["Running"]):
                  time.sleep(wait_interval)
              else:
                  結果を返す
          リターン結果
      
      def run_task():
          # Cloud Assistantコマンドのタイプを指定します。
          cmdtype = "RunShellScript"
          # Cloud Assistantコマンドの内容を指定します。
          cmdcontent = """
          #!/bin/bash
          エコーhelloworld
          """
          # コマンド実行のタイムアウト時間を指定します。
          timeout = 60
          # コマンドを実行するインスタンスのIDを指定します。
          ins_ids= ["i-bp185fcs ****" 、"i-bp14wwh ****" 、"i-bp13jbr ****"]
      
          # コマンドを実行します。
          invoke_id = run_command(cmdtype,cmdcontent,ins_ids,timeout)
          logger.info("run command,invoke-id:% s" % invoke_id)
      
          # コマンドが実行されるのを待ちます。 コマンドの実行状態を5秒間隔で10回照会します。 ビジネス要件に基づいて、コマンドの実行ステータスを照会する回数と照会間隔を指定できます。
          invoke_result = wait_invoke_finished_get_out(invoke_id,10,5)
          ins_idのために、invoke_result.items() のres:
              logger.info("instance % s command execute finished,status: % s,output:% s" %(ins_id,res["status"],res["output"])))
      
          # インスタンスを再起動します。
          logger.warn (「今すぐインスタンスを再起動」)
          reboot_instances(ins_ids)
      
          time.sleep(5)
          # インスタンスが [実行中] 状態になるのを待ちます。 インスタンスのステータスを10秒間隔で30回照会します。
          reboot_result = wait_instance_reboot_ready(ins_ids、30,10)
          logger.warn("reboot instance Finished")
          ins_idの場合、reboot_result.items() のres:
              logger.info("instance % s status: % s" %(ins_id,res["status"])))
      
      if __name__ ='__main__':
          run_task() 
    4. を実行します。Run the. pyファイルを作成します。

      の後のサンプル結果を次の図に示します。pyファイルを実行します。 この例では、3つのインスタンスでコマンドが実行され、helloworldが返され、3つのインスタンスが再起動されます。openapi-exec-reboot

OOSを使用してCloud Assistantコマンドを実行し、インスタンスをバッチ再起動する

CloudOps Orchestration Service (OOS) は、Alibaba Cloudが提供する自動O&Mサービスです。 OOSテンプレートを使用して、O&Mタスクを設定および実行できます。

  1. テンプレートの作成ページに移動します。

    1. OOS コンソール にログインします。

    2. 左側のナビゲーションウィンドウで、[自動タスク] > [カスタムテンプレート] を選択します。

    3. [テンプレートの作成] をクリックします。

  2. パラメーターを設定します。

    1. [YAML] タブをクリックし、次のコードを入力します。

      サンプルコード:

      FormatVersion: OOS-2019-06-01
      説明:
        en: Cloud Assistantコマンドを実行して、複数のECSインスタンスを一括再起動します。
         
        name-en: ACS-ECS-BulkyRunCommandRboot
         
        カテゴリ:
          -run_command
      パラメータ:
        regionId:
          データ型:Strig
          説明:
            en: リージョンID
             
          ラベル:
            en: リージョン
             
          AssociationProperty: RegionId
          デフォルト: '{{ ACS::RegionId }}'
        ターゲット:
          タイプ: JSON
          ラベル:
            en: TargetInstance
             
          AssociationProperty: ターゲット
          AssociationPropertyMetadata:
            ResourceType: ALIYUN::ECS:: インスタンス
            RegionId: regionId
        commandType:
          説明:
            en: Cloud Assistantコマンドのタイプ
             
          ラベル:
            en: CommandType
             
          データ型:Strig
          AllowedValues:
            -RunBatScript
            -RunPowerShellScript
            -RunShellScript
          デフォルト: RunShellScript
        commandContent:
          説明:
            en: ECSインスタンスで実行するコマンドの内容
             
          ラベル:
            en: CommandContent
             
          データ型:Strig
          MaxLength: 16384
          AssociationProperty: コード
          デフォルト: echo hello
        workingDir:
          説明:
            en: '作成されたCloud AssistantコマンドがECSインスタンスで実行されるディレクトリ。 Linuxインスタンスの場合、デフォルトのディレクトリは管理者 (rootユーザー) のホームディレクトリ (/root) の下にあります。 Windowsインスタンスの場合、デフォルトのディレクトリは、C:\Windows\System32 'など、Cloud Assistant Agentのプロセスが配置されているディレクトリの下にあります。
               
          ラベル:
            en: WorkingDir
             
          データ型:Strig
          デフォルト:''
        timeout:
          説明:
            en: ECSインスタンスでコマンドを実行するためのタイムアウト期間
             
          ラベル:
            en: タイムアウト
             
          タイプ: 数
          デフォルト: 600
        enableParameter:
          説明:
            en: コマンドにシークレットパラメータまたはカスタムパラメータを含めるかどうか。
             
          ラベル:
            en: EnableParameter
             
          データ型:Bolean
          デフォルト:false
        ユーザー名:
          説明:
            en: ECSインスタンスでコマンドを実行するために使用されるユーザー名
             
          ラベル:
            en: ユーザー名
             
          データ型:Strig
          デフォルト:''
        windowsPasswordName:
          説明:
            en: Windowsインスタンスでコマンドを実行するために使用されるパスワードの名前
             
          ラベル:
            en: WindowsPasswordName
             
          データ型:Strig
          デフォルト:''
          AssociationProperty: SecretParameterName
        rateControl:
          説明:
            en: タスク実行の同時実行率
             
          ラベル:
            en: RateControl
             
          タイプ: JSON
          AssociationProperty: RateControl
          Default:
            モード: 同時実行
            MaxErrors: 0
            並行性: 10
        OOSAssumeRole:
          説明:
            en: OOSが引き受けるRAMロール
             
          ラベル:
            en: OOSAssumeRole
             
          データ型:Strig
          デフォルト: OOSServiceRole
      RamRole: '{{ OOSAssumeRole }}'
      タスク:
        -名前: getInstance
          説明:
            en: ECSインスタンスを取得します。
             
          アクション: ACS::SelectTargets
          プロパティ:
            ResourceType: ALIYUN::ECS:: インスタンス
            RegionId: '{{ regionId }}'
            フィルター:
              -'{{ targets }}'
          Outputs:
            instanceIds:
              タイプ: リスト
              ValueSelector: Instances.Instance[].InstanceId
        -名前: runCommand
          アクション: ACS::ECS::RunCommand
          説明:
            en: Cloud Assistantコマンドを実行します。
             
          プロパティ:
            regionId: '{{ regionId }}'
            commandContent: '{{ commandContent }}'
            instanceId: '{{ ACS::TaskLoopItem }}'
            commandType: '{{ commandType }}'
            workingDir: '{{ workingDir }}'
            timeout: '{{ timeout }}'
            enableParameter: '{{ enableParameter }}'
            username: '{{ username }}'
            windowsPasswordName: '{{ windowsPasswordName }}'
          ループ:
            RateControl: '{{ rateControl }}'
            アイテム: '{{ getInstance.instanceIds }}'
            Outputs:
              commandOutputs:
                AggregateType: Fn::ListJoin
                AggregateField: commandOutput
          Outputs:
            commandOutput:
              データ型:Strig
              ValueSelector: invocationOutput
        -名前: rebootInstance
          アクション: ACS::ECS::RebootInstance
          説明:
            en: ECSインスタンスを再起動します。
             
          プロパティ:
            regionId: '{{ regionId }}'
            instanceId: '{{ ACS::TaskLoopItem }}'
          ループ:
            RateControl: '{{ rateControl }}'
            アイテム: '{{ getInstance.instanceIds }}'
      出力:
        instanceIds:
          タイプ: リスト
          値: '{{ getInstance.instanceIds }}' 
    2. [テンプレートの作成] をクリックします。

    3. 表示されるダイアログボックスで、テンプレート名を入力し、[OK] をクリックします。 この例では、テンプレート名はruncommand_reboot_instancesです。

  3. テンプレートを実行します。

    1. 作成したテンプレートを見つけて、[操作] 列の [実行の作成] をクリックします。

    2. 実行を設定します。

      プロンプトに従って実行設定を完了します。 [パラメーター設定] ステップで、TargetInstanceパラメーターを [手動でインスタンスを選択] に設定し、複数のインスタンスを選択します。 他のパラメーターにはデフォルト値を使用します。exec-temp

    3. [OK] ステップで、[作成] をクリックします。

      実行が作成されると、実行が開始され、実行の詳細ページの [基本情報] タブに自動的に移動します。 テンプレートが実行されると、[実行ステータス] の横に [成功] が表示されます。

  4. 各タスクノードの実行手順と詳細を表示します。

    1. [実行手順と結果] セクションで、[実行フローチャートの表示] をクリックして実行プロセスを表示します。

      image

    2. [クラウドアシスタントの実行] コマンドステップをクリックし、循環タスクリストタブをクリックして、各タスクノードの実行の詳細を表示します。 次の図は、テンプレートで指定された操作が実行されることを示しています。

      image