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

Elastic Compute Service:クラウドアシスタントコマンドを使用してインスタンスを停止または再起動する

最終更新日:Sep 03, 2025

このトピックでは、クラウドアシスタントコマンドを使用してインスタンスを停止または再起動する方法について説明します。

前提条件

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

クラウドアシスタントでコマンドを実行してインスタンスを停止または再起動する場合は、コマンドの最後に終了コードを追加する必要があります。これにより、コマンド実行の精度とリアルタイムステータスが保証されます。そうでない場合、クラウドアシスタントクライアントは実行結果を報告できず、コマンドステータスが正しく更新されない可能性があります。

重要

ターゲットインスタンスの クラウドアシスタントクライアント が、以下のバージョンより前のバージョンではないことを確認してください。

  • Linux: 2.2.3.317

  • Windows: 2.2.3.317

コマンドの実行時にエラーが発生した場合は、クラウドアシスタントクライアントを最新バージョンに更新する必要があります。詳細については、クラウドアシスタントクライアントの自動アップグレードをアップグレードまたは無効にする を参照してください。

  1. ECS コンソール - ストレージ容量ユニット
  2. 上部のナビゲーションバーで、管理するリソースのリージョンとリソースグループを選択します。地域

  3. ページの右上隅にある コマンドの作成/実行 をクリックします。

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

  5. [コマンドコンテンツ] の最後に、対応する終了コードを設定します。

    • インスタンスを停止するには、次のいずれかの終了コードを指定します。

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

      終了コード

      コマンド例

      Linux

      193

      # このシェルコマンドは終了コード 193 を返し、インスタンスを停止するアクションをトリガーします。
      exit 193

      Windows

      3009

      # この PowerShell コマンドは終了コード 3009 を返し、インスタンスを停止するアクションをトリガーします。
      exit 3009
    • コマンドを使用してインスタンスを再起動するには、次のいずれかの終了コードを指定します。

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

      終了コード

      コマンド例

      Linux

      194

      # このシェルコマンドは終了コード 194 を返し、インスタンスを再起動するアクションをトリガーします。
      exit 194

      Windows

      3010

      # この PowerShell コマンドは終了コード 3010 を返し、インスタンスを再起動するアクションをトリガーします。
      exit 3010
  6. インスタンスの選択 または マネージドインスタンスの選択 セクションで、コマンドを実行するインスタンスを選択します。

    説明

    マネージドインスタンスとは、Alibaba Cloud によって提供されていないが、クラウドアシスタントによって管理されているインスタンスです。詳細については、Alibaba Cloud マネージドインスタンス を参照してください。

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

OpenAPI を使用してクラウドアシスタントコマンドを実行し、インスタンスを一括で再起動する

Alibaba Cloud は、クラウドリソースを管理するため豊富な OpenAPI 操作を提供しています。このセクションでは、ローカルの Linux 環境で Python コードを実行して OpenAPI 操作を呼び出す方法の例を示します。この例では、コマンドを実行してインスタンスを一括で再起動する方法を示します。

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

    1. 使用する Resource Access Management (RAM) ユーザーの AccessKey ペアを取得します。詳細については、AccessKey ペアの作成 を参照してください。

    2. DescribeRegions 操作を呼び出して、リージョンのリストを取得します。パラメータの詳細については、DescribeRegions を参照してください。

    3. DescribeInstances 操作を呼び出して、指定された条件を満たすインスタンスをフィルタリングします。DescribeInstances 操作のパラメータの説明については、DescribeInstances を参照してください。

  2. ローカル環境を構成し、サンプルコードを実行します。

    1. Alibaba Cloud SDK for Python をインストールしてアップグレードします。

      sudo pip install --upgrade alibabacloud_ecs20140526
    2. .py ファイルを作成し、次のサンプルコードをファイルに書き込みます。

      クリックしてサンプルコードを表示

      # coding=utf-8
      # Python SDK がインストールされていない場合は、「sudo pip install alibabacloud_ecs20140526」を実行します。
      # 最新の SDK バージョンを使用していることを確認してください。
      # アップグレードするには、「sudo pip install --upgrade alibabacloud_ecs20140526」を実行します。
      
      import base64
      import logging
      import os
      import sys
      import time
      
      from alibabacloud_ecs20140526.client import Client as Ecs20140526Client
      from alibabacloud_ecs20140526.models import (
          DescribeInvocationResultsRequest,
          DescribeInstancesRequest,
          RunCommandRequest,
          RebootInstancesRequest
      )
      from alibabacloud_tea_openapi.models import Config
      
      # ログ出力フォーマッタを構成します。
      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 ペアが侵害され、アカウント内のすべてのリソースのセキュリティが脅かされる可能性があります。次のサンプルコードでは、環境変数を使用して AccessKey ペアを取得しています。この方法は参考用です。セキュリティを強化するには、STS トークンを使用してください。
      access_key = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']
      access_key_secret = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
      region_id = '<yourRegionId>'  # 取得したリージョン ID を入力します。
      
      ecs_config = Config(
          access_key_id=access_key,
          access_key_secret=access_key_secret,
          endpoint=f'ecs.{region_id}.aliyuncs.com'
      )
      client = Ecs20140526Client(ecs_config)
      
      
      def base64_decode(content, code='utf-8'):
          if sys.version_info.major == 2:
              return base64.b64decode(content)
          else:
              return base64.b64decode(content).decode(code)
      
      
      def get_invoke_result(invoke_id):
          request = DescribeInvocationResultsRequest(
              region_id=region_id,
              invoke_id=invoke_id
          )
          response = client.describe_invocation_results(request)
          response_details = response.body.invocation.invocation_results.invocation_result
          dict_res = {detail.instance_id: {"status": detail.invocation_status,
                                           "output": base64_decode(detail.output)} for detail in
                      response_details}
          return dict_res
      
      
      def get_instances_status(instance_ids):
          request = DescribeInstancesRequest(
              region_id=region_id,
              instance_ids=str(instance_ids)
          )
          response = client.describe_instances(request)
          response_details = response.body.instances.instance
          dict_res = {detail.instance_id: {"status": detail.status} for detail in response_details}
          return dict_res
      
      
      def run_command(cmdtype, cmdcontent, instance_ids, timeout=60):
          """
          cmdtype: コマンドタイプ。有効な値:RunBatScript、RunPowerShellScript、RunShellScript。
          cmdcontent: コマンドの内容。
          instance_ids: インスタンス ID のリスト。
          """
          try:
              request = RunCommandRequest(
                  region_id=region_id,
                  type=cmdtype,
                  command_content=cmdcontent,
                  instance_id=instance_ids,
                  timeout=timeout  # コマンド実行のタイムアウト期間(秒)。デフォルト値は 60 です。実行するコマンドに基づいて適切なタイムアウト期間を設定します。
              )
              response = client.run_command(request)
              return response.body.invoke_id
          except Exception as e:
              logger.error("コマンドの実行に失敗しました", exc_info=True)
      
      
      def reboot_instances(instance_ids, Force=False):
          """
          instance_ids: 再起動するインスタンス ID のリスト。
          Force: インスタンスを強制的に再起動するかどうかを指定します。デフォルトは False です。
          """
          request = RebootInstancesRequest(
              region_id=region_id,
              instance_id=instance_ids,
              force_reboot=Force
          )
          response = client.reboot_instances(request)
      
      
      def wait_invoke_finished_get_out(invoke_id, wait_count, wait_interval):
          for i in range(wait_count):
              result = get_invoke_result(invoke_id)
              if set([res['status'] for _, res in result.items()]) & set(["Running", "Pending", "Stopping"]):
                  time.sleep(wait_interval)
              else:
                  return result
          return result
      
      
      def wait_instance_reboot_ready(ins_ids, wait_count, wait_interval):
          for i in range(wait_count):
              result = get_instances_status(ins_ids)
              if set([res['status'] for _, res in result.items()]) != set(["Running"]):
                  time.sleep(wait_interval)
              else:
                  return result
          return result
      
      
      def run_task():
          # クラウドアシスタントコマンドのタイプを設定します。
          cmdtype = "RunShellScript"
          # クラウドアシスタントコマンドの内容を設定します。
          cmdcontent = """
          #!/bin/bash
          echo helloworld
          """
          # タイムアウト期間を設定します。
          timeout = 60
          # コマンドを実行して再起動するインスタンスの ID を入力します。
          ins_ids = ["i-bp185fcs****", "i-bp14wwh****", "i-bp13jbr****"]
      
          # コマンドを実行します。
          invoke_id = run_command(cmdtype, cmdcontent, ins_ids, timeout)
          logger.info("コマンドを実行、invoke-id:%s" % invoke_id)
      
          if invoke_id is None:
              logger.error("コマンドの実行に失敗しました。これ以上実行を停止します")
              return
      
          # コマンドが完了するまで待ちます。システムは 5 秒間隔で 10 回ステータスをクエリします。クエリの回数と間隔は必要に応じて構成します。
          invoke_result = wait_invoke_finished_get_out(invoke_id, 10, 5)
          for ins_id, res in invoke_result.items():
              logger.info(
                  "インスタンス %s コマンドの実行が完了しました、ステータス: %s、出力:%s" % (ins_id, res['status'], res['output']))
      
          # インスタンスを再起動します。
          logger.warning("インスタンスを再起動しています")
          reboot_instances(ins_ids)
      
          time.sleep(5)
          # インスタンスが再起動して「実行中」状態になるまで待ちます。システムは 10 秒間隔で 30 回ステータスをクエリします。
          reboot_result = wait_instance_reboot_ready(ins_ids, 30, 10)
          logger.warning("インスタンスの再起動が完了しました")
          for ins_id, res in reboot_result.items():
              logger.info("インスタンス %s ステータス: %s" % (ins_id, res['status']))
      
      
      if __name__ == '__main__':
          run_task()
      

      サンプルコードの次の情報を、取得した情報に置き換えます。

      • AccessKey ID:

        access_key = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']

      • AccessKey シークレット:

        access_key_secret = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']

      • リージョン ID:

        region_id = '<yourRegionId>'

      • インスタンス ID:

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

    3. .py ファイルを実行します。

      次の図は、3 つのインスタンスで helloworld を出力するコマンドが実行され、その後、インスタンスが自動的に再起動された結果を示しています。openapi-exec-reboot

OOS を使用してクラウドアシスタントコマンドを実行し、インスタンスを一括で再起動する

CloudOps Orchestration Service (OOS) は、Alibaba Cloud の自動 O&M サービスです。テンプレートで O&M アクションを定義し、テンプレートを実行して自動 O&M タスクを実行できます。

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

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

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

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

  2. テンプレート構成を完了します。

    1. [テンプレートの作成] ページで、デフォルト構成を維持し、[次へ] をクリックします。

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

      サンプルコードを表示するにはクリックしてください

      FormatVersion: OOS-2019-06-01
      Description:
        en: 複数の ECS インスタンスでクラウドアシスタントコマンドをバッチで実行し、インスタンスを再起動します。
        name-en: コマンドのバッチ実行と ECS インスタンスの再起動
        categories:
          - run_command
      Parameters:
        regionId:
          Type: String
          Description:
            en: リージョン ID。
          Label:
            en: リージョン
          AssociationProperty: RegionId
          Default: '{{ ACS::RegionId }}'
        targets:
          Type: Json
          Label:
            en: ターゲットインスタンス
          AssociationProperty: Targets
          AssociationPropertyMetadata:
            ResourceType: ALIYUN::ECS::Instance
            RegionId: regionId
        commandType:
          Description:
            en: コマンドのタイプ。
            
          Label:
            en: コマンドタイプ
            
          Type: String
          AllowedValues:
            - RunBatScript
            - RunPowerShellScript
            - RunShellScript
          Default: RunShellScript
        commandContent:
          Description:
            en: ECS インスタンスで実行するコマンドの内容。
            
          Label:
            en: コマンド内容
            
          Type: String
          MaxLength: 16384
          AssociationProperty: Code
          Default: echo hello
        workingDir:
          Description:
            en: 'ECS インスタンスでコマンドを実行するディレクトリ。 Linux インスタンスの場合、デフォルトは root ユーザーのホームディレクトリ (/root) です。 Windows インスタンスの場合、デフォルトは Cloud Assistant クライアントプロセスがあるディレクトリ (C:\Windows\System32 など) です。'
          Label:
            en: 作業ディレクトリ
            
          Type: String
          Default: ''
        timeout:
          Description:
            en: ECS インスタンスでのコマンド実行のタイムアウト期間。
          Label:
            en: タイムアウト
          Type: Number
          Default: 600
        enableParameter:
          Description:
            en: コマンドにシークレットパラメーターまたはカスタムパラメーターが含まれているかどうかを指定します。
          Label:
            en: パラメーターの有効化
          Type: Boolean
          Default: false
        username:
          Description:
            en: ECS インスタンスでコマンドを実行するために使用されるユーザー名。
          Label:
            en: ユーザー名
          Type: String
          Default: ''
        windowsPasswordName:
          Description:
            en: Windows インスタンスでコマンドを実行するユーザーのパスワード名。
          Label:
            en: Windows パスワード名
          Type: String
          Default: ''
          AssociationProperty: SecretParameterName
        rateControl:
          Description:
            en: タスク実行の同時実行率。
          Label:
            en: レート制御
          Type: Json
          AssociationProperty: RateControl
          Default:
            Mode: Concurrency
            MaxErrors: 0
            Concurrency: 10
        OOSAssumeRole:
          Description:
            en: OOS が偽装する RAM ロール。
          Label:
            en: OOS 偽装ロール
          Type: String
          Default: OOSServiceRole
      RamRole: '{{ OOSAssumeRole }}'
      Tasks:
        - Name: getInstance
          Description:
            en: ECS インスタンスを取得します。
          Action: ACS::SelectTargets
          Properties:
            ResourceType: ALIYUN::ECS::Instance
            RegionId: '{{ regionId }}'
            Filters:
              - '{{ targets }}'
          Outputs:
            instanceIds:
              Type: List
              ValueSelector: Instances.Instance[].InstanceId
        - Name: runCommand
          Action: ACS::ECS::RunCommand
          Description:
            en: Cloud Assistant コマンドを実行します。
          Properties:
            regionId: '{{ regionId }}'
            commandContent: '{{ commandContent }}'
            instanceId: '{{ ACS::TaskLoopItem }}'
            commandType: '{{ commandType }}'
            workingDir: '{{ workingDir }}'
            timeout: '{{ timeout }}'
            enableParameter: '{{ enableParameter }}'
            username: '{{ username }}'
            windowsPasswordName: '{{ windowsPasswordName }}'
          Loop:
            RateControl: '{{ rateControl }}'
            Items: '{{ getInstance.instanceIds }}'
            Outputs:
              commandOutputs:
                AggregateType: Fn::ListJoin
                AggregateField: commandOutput
          Outputs:
            commandOutput:
              Type: String
              ValueSelector: invocationOutput
        - Name: rebootInstance
          Action: ACS::ECS::RebootInstance
          Description:
            en: ECS インスタンスを再起動します。
          Properties:
            regionId: '{{ regionId }}'
            instanceId: '{{ ACS::TaskLoopItem }}'
          Loop:
            RateControl: '{{ rateControl }}'
            Items: '{{ getInstance.instanceIds }}'
      Outputs:
        instanceIds:
          Type: List
          Value: '{{ getInstance.instanceIds }}'
    3. [テンプレートの作成] をクリックします。

    4. 表示されるダイアログボックスで、テンプレート名 runcommand_reboot_instances を入力し、[作成完了] をクリックします。

  3. テンプレートの構成を完了します。

    1. 作成したテンプレートを探し、[アクション] 列の[実行の作成] をクリックします。

    2. 実行構成を完了します。

      プロンプトに従って構成を完了します。 [パラメータの設定] ページで、複数のインスタンスを選択し、その他の設定にはデフォルト値を保持します。exec-temp

    3. [確認] ページで、[作成] をクリックします。

      実行が作成されると、テンプレートの自動実行が開始されます。実行の [基本情報] ページにリダイレクトされます。[実行ステータス][成功]に変わるまでお待ちください。

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

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

      image

    2. Cloud Assistant コマンド実行ステップをクリックします。 ループタスクリストタブで、各タスクノードの実行の詳細を表示します。 下の図は、スケジュールされた操作が正常に完了したことを示しています。

      image