シャットダウン スクリプトの実行


仮想マシン(VM)インスタンスが停止または再起動する直前にコマンドを実行するシャットダウン スクリプトを作成して実行します。これは、自動スクリプトを使用してインスタンスの起動とシャットダウンを実行し、インスタンスでクリーンアップまたはタスク(ログのエクスポートや他のシステムとの同期など)を実行する時間を確保できるようにする場合に便利です。

シャットダウン スクリプトは、VM がマネージド インスタンス グループに属し、オートスケーラーが使用されている場合に特に役立ちます。オートスケーラーによってグループ内の VM がシャットダウンされる場合、VM が停止する前にシャットダウン スクリプトが実行され、定義したアクションがシャットダウン スクリプトによって実行されます。スクリプトは、VM が停止する前の限られたシャットダウン期間中に実行されます。たとえば、シャットダウン スクリプトによって、処理済みのデータが Cloud Storage にコピーされることや、ログがバックアップされることがあります。

シャットダウン スクリプトは起動スクリプトとほぼ同様に機能します。起動スクリプトに関するドキュメントの多くは、シャットダウン スクリプトにも適用されます。

シャットダウン タスクと再起動タスクでは、VM が常に次のようにシャットダウン スクリプトを実行します。

  • Linux VM の場合は、root ユーザーを使用します。
  • Windows VM の場合は、System アカウントを使用します。

始める前に

  • スタートアップ スクリプトについて学習します。
  • メタデータ サーバーとは何かを理解します。
  • まだ設定していない場合は、認証を設定します。認証とは、Google Cloud サービスと API にアクセスするために ID を確認するプロセスです。ローカル開発環境からコードまたはサンプルを実行するには、次のように Compute Engine に対する認証を行います。

    このページのサンプルをどのように使うかに応じて、タブを選択してください。

    コンソール

    Google Cloud コンソールを使用して Google Cloud サービスと API にアクセスする場合、認証を設定する必要はありません。

    gcloud

    1. Google Cloud CLI をインストールし、次のコマンドを実行して初期化します。

      gcloud init
    2. デフォルトのリージョンとゾーンを設定します

    Terraform

    このページの Terraform サンプルをローカル開発環境から使用するには、gcloud CLI をインストールして初期化し、自身のユーザー認証情報を使用してアプリケーションのデフォルト認証情報を設定してください。

    1. Google Cloud CLI をインストールします。
    2. gcloud CLI を初期化するには:

      gcloud init
    3. Google アカウントのローカル認証情報を作成します。

      gcloud auth application-default login

    詳細については、 ローカル開発環境の認証の設定 をご覧ください。

    REST

    このページの REST API サンプルをローカル開発環境で使用するには、gcloud CLI に指定した認証情報を使用します。

      Google Cloud CLI をインストールし、次のコマンドを実行して初期化します。

      gcloud init

このタスクに必要な権限

このタスクを行うには、次の権限が必要です。

仕様

制限事項

シャットダウン スクリプトを使用する場合には注意すべき制限がいくつかあります。

  • シャットダウン スクリプトは、インスタンスが停止するまでの限られた時間で実行を完了する必要があります。
    • オンデマンド インスタンス: インスタンスの停止または削除後 90 秒
    • プリエンプティブル インスタンス: インスタンスのプリエンプションの開始後 30 秒
  • Compute Engine は、ベストエフォート方式でのみシャットダウン スクリプトを実行します。まれに、Compute Engine ではシャットダウン スクリプトの完了を保証できないことがあります。
  • Windows では、ローカル グループ ポリシーを使用してシャットダウン スクリプトを起動します。
    • インストール パッケージでは、システムのシャットダウン時にスクリプトを起動するように、ローカル グループ ポリシー Computer Configuration/Windows Setting/Scripts (Startup/Shutdown) 設定を構成します。

シャットダウン スクリプトの呼び出し

シャットダウン スクリプトは、再起動や停止など、特定の Advanced Configuration and Power Interface(ACPI)イベントがトリガーになります。インスタンスを再起動または停止する方法は多数ありますが、シャットダウン スクリプトの実行をトリガーするアクションは限られています。シャットダウン スクリプトは、次のアクションの一環として実行されます。

  • API への instances.delete リクエストや instances.stop などによってインスタンスがシャットダウンされるとき。
  • Compute Engine によってプリエンプティブル インスタンスがプリエンプション プロセスの一部として停止されるとき。
  • sudo shutdownsudo reboot などのゲスト オペレーティング システムに対するリクエストによってインスタンスがシャットダウンされるとき。
  • Google Cloud コンソールまたは gcloud compute ツールを使用してインスタンスを手動でシャットダウンするとき。

instances().reset を使用してインスタンスがリセットされる場合、シャットダウン スクリプトは実行されません。

シャットダウン スクリプトは任意のファイル形式にできます。シャットダウン スクリプトが存在する場合、Compute Engine では、以下を行います。

  1. インスタンス内のローカル ファイルにスクリプトをコピーします。
  2. そのファイルを実行するための権限が設定されます。
  3. インスタンスの停止時にファイルを実行します。

たとえば、bash スクリプトの代わりに Python スクリプトを使用できます。スクリプトは種類に関係なくそのまま実行されることに注意してください。

bash 以外のスクリプトを実行するには、オペレーティング システムがどのインタープリターを使用すべきか把握できるよう、ファイルの先頭にシバン行を追加します。たとえば、Python スクリプトを使用する場合は次のようなシバン行を追加します。

#!/usr/bin/python

シャットダウン スクリプトの実行時間

インスタンスがシャットダウンまたは再起動される前に、限られた期間でシャットダウン スクリプトが実行されます。この期間中に、Compute Engine により、シャットダウン スクリプトが実行されます。この期間を経過してもスクリプトが完了していない場合は、インスタンスが自動的に停止し、実行中のすべてのタスクが終了します。sudo shutdown コマンドを使用してゲスト オペレーティング システムにリクエストを行うことで、インスタンスをシャットダウンまたは再起動する場合、この制限は適用されません。

シャットダウン期間の長さは、インスタンスの種類によって異なります。プリエンプティブル インスタンスでは、通常のインスタンスよりもシャットダウン期間が短くなります。それぞれのインスタンスのタイプに対するシャットダウン期間制限の詳細については、シャットダウン期間をご覧ください。

一般に、オペレーティング システムでシャットダウン プロセスを完了してバッファをディスクにフラッシュする時間が確保されるように、シャットダウン期間内にシャットダウン スクリプトの実行を完了する必要があります。

ローカル シャットダウン スクリプトの使用

ローカル シャットダウン スクリプトは、ローカル コンピュータ上に存在するスクリプトです。ローカル シャットダウン スクリプトは、Compute Engine に対してファイルとして渡すか内容を直接渡します。

シャットダウン スクリプトでは必要な数だけアクションを実行できますが、ローカルでファイルを渡す場合は、スクリプトをメタデータ値の長さの上限である 256 KB よりも長くすることはできません。この長さの上限を超えるスクリプトを使用するには、ファイルを Cloud Storage に保存してください。詳細については、Cloud Storage からシャットダウン スクリプトを使用するをご覧ください。

シャットダウン スクリプト ファイルを渡す

ローカル シャットダウン スクリプト ファイルは、gcloud コマンドライン ツールを介してのみ渡すことができます。

gcloud

ローカル シャットダウン スクリプト ファイルを渡すには、--metadata-from-file フラグと、その後にメタデータキーのペア、shutdown-script=PATH/TO/FILE(ここで PATH/TO/FILE はシャットダウン スクリプトへの相対パス)を指定します。次に例を示します。

gcloud compute instances create example-instance \
    --metadata-from-file shutdown-script=examples/scripts/install.sh

Terraform

シャットダウン スクリプトを直接指定するには、メタデータでシャットダウン スクリプトのパスを指定して google_compute_instance リソースを使用します。

resource "google_compute_instance" "shutdown_content_from_file" {
  name         = "instance-name-shutdown-content-from-file"
  machine_type = "f1-micro"
  zone         = "us-central1-c"
  metadata = {
    # Shuts down Apache server
    shutdown-script = file("${path.module}/shutdown-script.sh")
  }
  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11"
    }
  }
  network_interface {
    # A default network is created for all Google Cloud projects
    network = "default"
    access_config {
    }
  }
}

シャットダウン スクリプトの内容を直接渡す

シャットダウン スクリプトの内容を直接渡すこともできます。

コンソール

Google Cloud コンソールでは、shutdown-script メタデータキーを使用してシャットダウン スクリプトを直接指定します。

  1. [インスタンスの作成] ページに移動します。

    [インスタンスの作成] に移動

  2. VM の詳細を指定します。

  3. [詳細オプション] セクションを開きます。

  4. [管理] を開いて、次の操作を行います。

    1. [カスタム メタデータ] セクションで [項目を追加] をクリックします。
    2. [キー] フィールドに、メタデータキーとして「shutdown-script」と入力します。
    3. [] フィールドに、シャットダウン スクリプトの内容を追加します。
  5. VM 作成プロセスを続行します。

gcloud

Google Cloud CLI を使用して --metadata フラグを指定し、シャットダウン スクリプトの内容を指定します。その後に shutdown-script=CONTENTS キーペアを指定します。ここで CONTENTS はシャットダウン スクリプトの内容です。

gcloud compute instances create example-instance --metadata shutdown-script="#! /bin/bash
> # Shuts down Apache server
> /etc/init.d/apache2 stop"

Terraform

シャットダウン スクリプトを直接指定するには、メタデータでシャットダウン スクリプトを指定して google_compute_instance リソースを使用します。

resource "google_compute_instance" "default" {
  name         = "instance-name-shutdown-content-directly"
  machine_type = "f1-micro"
  zone         = "us-central1-c"
  metadata = {
    # Shuts down Apache server
    shutdown-script = "#! /bin/bash /etc/init.d/apache2 stop"
  }
  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11"
    }
  }
  network_interface {
    # A default network is created for all Google Cloud projects
    network = "default"
    access_config {
    }
  }
}

REST

API では、インスタンスを作成するときにリクエストのメタデータ プロパティの一部としてシャットダウン スクリプトを渡します。メタデータキーとして shutdown-script を使用します。

POST https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instances

{...
  "metadata": {
    "items": [
      {
       "key": "shutdown-script",
       "value": "#! /bin/bash\n\n# Shuts down Apache server\n/etc/init.d/apache2 stop"
      }
    ]
  }...
}

Windows インスタンスでシャットダウン スクリプトを渡す

以下の Windows 固有のメタデータキーを使用して、Windows インスタンスでシャットダウン スクリプトを実行します。以下に示す特殊なキーのいずれかを選択します。実行するスクリプトの種類に対応するキーを選択する必要があります。

複数のキーをインスタンスに渡すことで複数のシャットダウン スクリプトを指定できますが、各キーは仮想マシンごとに 1 回のみ指定できます。

ローカル シャットダウン スクリプトで使用できるキーは次のとおりです。手順は上と同じです。

cmd シャットダウン スクリプト bat シャットダウン スクリプト ps1 シャットダウン スクリプト
windows-shutdown-script-cmd windows-shutdown-script-bat windows-shutdown-script-ps1

Cloud Storage からのシャットダウン スクリプトの使用

Cloud Storage にシャットダウン スクリプトを保存し、そこから使用できます。それには起動スクリプトのドキュメントに記載されている手順に従いますが、startup-script-urlshutdown-script-url に置き換えてください。

Windows インスタンスの場合は、windows-startup-script-urlwindows-shutdown-script-url に置き換えます。

実行中のインスタンスに対するシャットダウン スクリプトの適用

実行中のインスタンスにシャットダウン スクリプトを追加する方法については、実行中のインスタンスに対する起動スクリプトの適用の手順をご覧ください。ただし、メタデータキーは次のいずれかのキーに置き換えてください。

  • shutdown-script: このキーで、シャットダウン スクリプトの内容を直接指定します。Google Cloud CLI を使用すると、--metadata-from-file フラグと shutdown-script メタデータキーを使用してシャットダウン スクリプト ファイルへのパスを指定できます。
  • shutdown-script-url: このキーで、Cloud Storage のシャットダウン スクリプト ファイルの URL を指定します。

シャットダウン スクリプトの出力の表示

Linux

Linux シャットダウン スクリプトからの出力を確認するには、次のいずれかの操作を行います。

Windows

Windows Server シャットダウン スクリプトからの出力を確認するには、次のいずれかを使用して GCEMetadataScripts イベントを確認します。

  • Google Cloud コンソールのシリアルポート 1。詳細については、シリアルポート出力の表示をご覧ください。

  • Windows イベント ビューアのアプリケーション ログ。

  • Windows ワークステーションの IAP Desktop。詳細については、GitHub の GoogleCloudPlatform/iap-desktop リポジトリをご覧ください。