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


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

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

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

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

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

始める前に

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

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.
    3. Terraform

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

      1. Install the Google Cloud CLI.
      2. To initialize the gcloud CLI, run the following command:

        gcloud init
      3. If you're using a local shell, then create local authentication credentials for your user account:

        gcloud auth application-default login

        You don't need to do this if you're using Cloud Shell.

      詳細については Set up authentication for a local development environment をご覧ください。

      REST

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

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      詳細については、 Google Cloud 認証ドキュメントの REST を使用して認証するをご覧ください。

このタスクに必要な権限

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

仕様

以降のセクションでは、シャットダウン スクリプトの仕様について説明します。

制限事項

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

  • Compute Engine は、ベストエフォート方式でのみシャットダウン スクリプトを実行します。まれに、Compute Engine ではシャットダウン スクリプトの完了を保証できないことがあります。
  • Windows では、ローカル グループ ポリシーを使用してシャットダウン スクリプトを起動します。
    • インストール パッケージでは、システムのシャットダウン時にスクリプトを起動するように、ローカル グループ ポリシー Computer Configuration/Windows Setting/Scripts (Startup/Shutdown) 設定を構成します。

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

シャットダウン スクリプトは、次のいずれかのイベントが発生した後にインスタンスがシャットダウンされたときにトリガーされます。

  • 次のことを行います。

    • ゲスト OS 内からインスタンスを停止または再起動します。

    • インスタンスを停止するか削除します。

  • Compute Engine が、プログラムされた停止オペレーションまたは削除オペレーションの一部としてインスタンスを停止します。

  • Compute Engine によって Spot VM またはプリエンプティブル インスタンスがプリエンプション プロセスの一部として停止されるとき。

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

  1. インスタンス内のローカル ファイルにスクリプトをコピーします。
  2. スクリプトを実行可能にするために、ファイルの権限を設定します。
  3. インスタンスのシャットダウン時にファイルを実行します。

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

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

#!/usr/bin/python

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

シャットダウン スクリプトは、Compute Engine がインスタンスの状態を STOPPING に設定すると実行を開始します。インスタンスが完全に停止する前にスクリプトを完了する必要があります。このとき、インスタンスの状態は TERMINATED に変わります。インスタンスが TERMINATED 状態に達するまでの時間は、インスタンスのタイプによって異なります。

スクリプトの実行時間がインスタンスの停止時間よりも長くなると、Compute Engine はスクリプトを強制的に停止します。これにより、データ損失やタスクの不完全な実行につながる可能性があります。これを回避するには、ゲスト OS 内からインスタンスを停止します。この方法では、シャットダウン スクリプトの実行が完了するまで、インスタンスの状態は STOPPING のままになります。

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

ローカル シャットダウン スクリプトは、ローカル コンピュータ上に存在するスクリプトです。ローカル シャットダウン スクリプトは、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 リポジトリをご覧ください。