起動スクリプトの実行


Compute Engine では、独自の起動スクリプトを作成して仮想マシン(VM)インスタンスで実行すると、インスタンスが起動するたびに自動タスクを実行できます。起動スクリプトでは、ソフトウェアのインストール、更新の実行、サービスの有効化などのタスクを定義して実行できます。

たとえば、Apache サーバーをインストールして起動する起動スクリプトは次のようになります。

#! /bin/bash
apt update
apt -y install apache2
cat <<EOF > /var/www/html/index.html
<html><body><h1>Hello World</h1>
<p>This page was created from a startup script.</p>
</body></html>
EOF

起動スクリプトを指定するには、メタデータ サーバーで起動スクリプトのメタデータキーを使用します。起動スクリプトを提供するには、Google Cloud Console、gcloud コマンドライン ツール、Compute Engine API のいずれかを使用します。

始める前に

このタスクに必要な権限

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

起動スクリプトの実行

ネットワークが使用可能になった後、インスタンスは常に起動スクリプトを root として実行します。

起動スクリプトのファイル形式に制約はありません。起動スクリプトが存在する場合、Compute Engine は次の処理を行います。

  1. インスタンス内のローカル ファイルに起動スクリプトをコピーします。
  2. ファイルの実行権限を設定します。
  3. ファイルを実行します。

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

bash 以外のスクリプトを実行するには、ファイルの先頭にシバン行#! で始まる行)を追加します。これにより、使用するインタープリタがオペレーティング システムに指示されます。たとえば、Python スクリプトを使用する場合は、次のシバン行を追加します。

#! /usr/bin/python

ローカル起動スクリプトの使用

ローカル起動スクリプトとは、ローカルの PC 上にあるスクリプトです。ローカル起動スクリプトを使用するには、ローカル起動スクリプトのファイルをインスタンスに渡すか、起動スクリプトの内容を直接メタデータ サーバーに渡します。次のサブセクションの例では、startup-script メタデータをローカル ファイルまたは直接入力によって追加する方法を示します。

ローカル起動スクリプトには、256 KB というメタデータ値の長さ制限が適用されます。起動スクリプトがこの制限を超えていると、ローカルに読み込むことができません。代わりに、Cloud Storage にファイルを保存し、インスタンスの作成時にスクリプトの URL を指定します。詳細については、Cloud Storage に格納された起動スクリプトを渡すをご覧ください。

起動スクリプト ファイルを渡す

ローカルの起動スクリプト ファイルを渡すには、gcloud コマンドライン ツールを使用する必要があります。--metadata-from-file フラグの後にメタデータのキーペア startup-script=PATH_TO_FILE を指定します。PATH_TO_FILE は、起動スクリプトの相対パスで置き換えます。

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

起動スクリプトの内容を直接渡す

あるいは、Google Cloud Console、gcloud コマンドライン ツール、Compute Engine API を使用して、起動スクリプトの内容を直接入力または貼り付けることもできます。

Console

Cloud Console の [起動スクリプト] セクションで、起動スクリプトを直接指定します。

  1. Cloud Console で、[VM インスタンス] ページに移動します。

    [VM インスタンス] ページに移動

  2. [インスタンスを作成] をクリックします。
  3. [新しいインスタンスの作成] ページで、インスタンスのプロパティを入力します。 詳細構成オプションで、[管理、セキュリティ、ディスク、ネットワーク、単一テナンシー] セクションを展開します。
  4. [自動化] セクションの [起動スクリプト] で、起動スクリプトの内容を指定します。

    Cloud Console で起動スクリプトを設定する

  5. [作成] をクリックしてインスタンスを作成します。

gcloud

gcloud コマンドライン ツールで --metadata フラグを使用し、startup-script=contents Key-Value ペアを使用して起動スクリプトの内容を指定します。contents は起動スクリプトの内容で置き換えます。

たとえば、次のコマンドによって作成されるインスタンスは、起動時にシステムの更新を行い、Apache をインストールして、1 つのウェブページを起動します。このコマンドを実行してから、インスタンスの外部 IP アドレスにアクセスし、index.html ページの内容を確認します。

Linux デスクトップでは、次のようなコマンドを実行します。

gcloud compute instances create example-instance --tags http-server \
  --metadata startup-script='#! /bin/bash
# Installs apache and a custom homepage
  sudo su -
  apt update
  apt -y install apache2
  cat <<EOF > /var/www/html/index.html
  <html><body><h1>Hello World</h1>
  <p>This page was created from a start up script.</p>
  </body></html>
  EOF'

Windows デスクトップの場合は、cmd ターミナルで次のコマンドを実行できます。

gcloud compute instances create example-instance --tags http-server \
  --metadata startup-script="
  apt update;
  apt -y install apache2;
  echo \"This page was created from a start up script.\" ^> /var/www/html/index.html"

同様に、PowerShell を使用している場合は、--% という特殊文字を使用して、gcloud ツールに正確なコマンドを渡すことができます。

gcloud --% compute instances create example-instance --tags http-server \
  --metadata startup-script="
  apt update;
  apt -y install apache2;
  echo \"This page was created from a start up script.\" ^> /var/www/html/index.html"

API

API では、リクエストのメタデータ プロパティの一部として起動スクリプトを指定します。メタデータキーには startup-script を使用します。

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

{
  ...
  "metadata": {
    "items": [
      {
       "key": "startup-script",
       "value": "#! /bin/bash\n\n# Installs apache and a custom homepage\napt update\napt -y install apache2\ncat <<EOF > /var/www/html/index.html\n<html><body><h1>Hello World</h1>\n<p>This page was created from a start up script.</p>\n</body></html>"
      }
    ]
  }
  ...
}

Windows インスタンス用の起動スクリプトを渡す

起動スクリプトを Windows インスタンスで実行するには、Windows 固有のメタデータキーを使用します。次の表に示す特殊なメタデータキーから選択します。各メタデータキーは、実行するスクリプトの種類と一致させる必要があります。異なるメタデータキーをインスタンスに渡して、複数のスクリプトを指定することもできます。各メタデータキーは VM インスタンスごとに 1 回のみ指定できます。

VM インスタンスの起動後に VM インスタンスで起動スクリプトを手動で実行する必要がある場合は、管理者が次のコマンドを実行します。

C:\Program Files\Google\Compute Engine\metadata_scripts\run_startup_scripts.cmd

次の表に、サポートされている起動スクリプトの種類、スクリプトを実行するタイミング、スクリプトの指定に使用するメタデータキーを示します。これらのメタデータキーの使用方法については、ローカル起動スクリプトの使用をご覧ください。これらのスクリプトは、GCESysprep コマンドを使用してイメージを準備する場合にのみ実行されます。

スクリプトの種類 次のものを実行します
  • GCESysprep2 の実行中
  • 起動前
次のものを実行します
  • GCESysprep2 の完了後
  • 後続の起動時
url 起動スクリプト メタデータキー:
sysprep-specialize-script-url
メタデータキー:
windows-startup-script-url
cmd 起動スクリプト メタデータキー:
sysprep-specialize-script-cmd
メタデータキー:
windows-startup-script-cmd
bat 起動スクリプト メタデータキー:
sysprep-specialize-script-bat
メタデータキー:
windows-startup-script-bat
ps11 起動スクリプト メタデータキー:
sysprep-specialize-script-ps1
メタデータキー:
windows-startup-script-ps1

Cloud Storage に格納された起動スクリプトを渡す

スクリプトを Cloud Storage に保存し、インスタンスの作成時にスクリプトの URL を指定できます。これにより、どこからでもスクリプトにアクセスできるようになるほか、メタデータ サーバーの制限も回避できます。

スクリプトへのアクセス権限の設定

Cloud Storage から起動スクリプトを使用する前に、そのスクリプトにアクセスする権限を取得する必要があります。バケットとファイルのアクセス制御の設定を調べて、必要な権限があることを確認してください。

禁止するアクセス制御が明示的に設定されている場合を除き、プロジェクト オーナーまたは編集者はデフォルトで同じプロジェクトのファイルにアクセスできます。

起動スクリプトの提供

  1. バケットを作成します。バケットを作成することも、既存のバケットを使用することもできます。バケットの作成については、Google Cloud Console でバケットを作成するまたは gsutil でバケットを作成するをご覧ください。
  2. ファイルをバケットにアップロードします。手順に沿って gsutil または Cloud Console を使用し、オブジェクトをアップロードします。
  3. インスタンスを作成するときに、起動スクリプト ファイルの URL を指定します。

    Console

    1. Google Cloud Console で、[VM インスタンス] ページに移動します。

      [VM インスタンス] ページに移動

    2. [インスタンスを作成] をクリックします。

    3. 新しいインスタンスの作成ページで、インスタンスにプロパティを入力します。

    4. [ID と API アクセス] セクションで、Cloud Storage 内の起動スクリプト ファイルに対する読み取り権限を持つサービス アカウントを選択します。たとえば、サービス アカウントにはストレージ オブジェクト閲覧者ロールの権限が必要です。

    5. [管理、セキュリティ、ディスク、ネットワーク、単一テナンシー] セクションを展開します。

    6. [メタデータ] セクションで、メタデータキーとして startup-script-url を指定します。

    7. [] ボックスに、gs://BUCKET/FILE または https://storage.googleapis.com/BUCKET/FILE 形式で起動スクリプト ファイルの URL を入力します。

    8. [作成] をクリックしてインスタンスを作成します。

    gcloud

    gcloud コマンドライン ツールを使用して、--scopes フラグと --metadata フラグを使用してインスタンスを作成し、startup-script-url キーを指定します。--scopes フラグを使用すると、VM が Cloud Storage にアクセスして起動スクリプトをダウンロードできます。Cloud Storage の URL は gs://BUCKET/FILE または https://storage.googleapis.com/BUCKET/FILE の形式でスクリプトに指定できます。

    gcloud compute instances create example-instance --scopes storage-ro \
      --metadata startup-script-url=gs://BUCKET/FILE.sh
    

    API

    API では、リクエストのメタデータ プロパティの一部として起動スクリプトを指定します。メタデータキーには startup-script-url を使用します。また、VM が起動スクリプト ファイルにアクセスできるように、Cloud Storage スコープを含む scopes のリストを指定します。

    POST https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instances
    
    {
      ...
      "serviceAccounts": [
        {
          "email": "default",
          "scopes": [
            "https://www.googleapis.com/auth/devstorage.read_only"
          ]
        }
      ],
      "metadata": {
        "items": [
          {
           "key": "startup-script-url",
           "value": "gs://BUCKET/FILE"
          }
        ]
      },
      "tags": {
        "items": []
      },
      "machineType": "zones/us-central1-a/machineTypes/e2-medium",
      "name": "example-instance"
    }
    

    Windows

    gcloud コマンドライン ツールでインスタンスを作成するには、--scopes フラグと --metadata フラグを使用して windows-startup-script-url キーを指定します。--scopes フラグを使用すると、VM が Cloud Storage にアクセスして起動スクリプトをダウンロードできます。Cloud Storage の URL は gs://BUCKET/FILE または https://storage.googleapis.com/BUCKET/FILE の形式でスクリプトに指定できます。

    gcloud compute instances create example-windows-instance --scopes storage-ro \
      --metadata windows-startup-script-url=gs://BUCKET/FILE.ps1
    

実行中のインスタンスに起動スクリプトを適用する

実行中のインスタンスがある場合は、そのインスタンスに起動スクリプトを追加すると、次にそのインスタンスが再起動するときに起動スクリプトが実行されます。その後も再起動のたびに実行されます。

実行中のインスタンスで起動スクリプトを設定するには、次の操作を行います。

Console

  1. Google Cloud Console で、[VM インスタンス] ページに移動します。

    [VM インスタンス] ページに移動

  2. 起動スクリプトを追加するインスタンスをクリックします。

  3. インスタンスの詳細ページで、次の手順を行います。

    1. [編集] ボタンをクリックします。
    2. [カスタム メタデータ] で [項目を追加] をクリックします。
    3. 次のいずれかのキーを使用して起動スクリプトを追加します。

      • startup-script: このキーで起動スクリプトの内容を直接指定します。
      • startup-script-url: このキーで、Cloud Storage に格納されている起動スクリプトの URL を渡します。

gcloud

gcloud コマンドライン ツールで instances add-metadata コマンドを使用して、インスタンスにメタデータを追加します。次のいずれかの起動スクリプトキーを使用できます。

  • --metadata startup-script=CONTENTS: このキーで起動スクリプトの内容を直接指定します。
  • --metadata startup-script-url=URL: このキーで、Cloud Storage に格納されている起動スクリプトの URL を渡します。
  • --metadata-from-file startup-script=FILE: ローカルに格納されている起動スクリプト ファイルを渡す場合に使用します。

例:

gcloud compute instances add-metadata EXAMPLE_INSTANCE \
  --metadata-from-file startup-script=PATH_TO_FILE
gcloud compute instances add-metadata EXAMPLE_INSTANCE \
  --metadata startup-script-url=gs://BUCKET/FILE

API

API で、instances().setMetadata メソッドにリクエストを送信し、新しいメタデータと fingerprint 値を指定します。

フィンガープリントとは、Compute Engine によって生成されるランダムな文字列で、楽観的ロックを実行するために使用されます。リクエストを実行するには、一致するフィンガープリント値を指定します。フィンガープリントはリクエストのたびに変更され、一致しないフィンガープリントを指定するとリクエストが拒否されます。これにより、一度に実行できる更新が 1 つだけになるため、競合が防止されます。

インスタンスの最新のフィンガープリントを取得するには、instances().get リクエストを実行します。

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

フィンガープリント値をコピーします。

{

 ...
 "name": "example-instance",
 "metadata": {
  "kind": "compute#metadata",
  "fingerprint": "zhma6O1w2l8="
 },
 "...
}

次のいずれかのメタデータキーとフィンガープリント値を使用して、instances().setMetadata メソッドにリクエストを送信します。

  • startup-script: このキーで起動スクリプトの内容を直接指定します。
  • startup-script-url: このキーで、Cloud Storage に格納されている起動スクリプトの URL を渡します。

例:

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

    {
     "fingerprint": "zhma6O1w2l8=",
     "items": [
      {
       "key": "startup-script-url",
       "value": "gs://BUCKET/FILE"
      }
     ]
    }

起動スクリプトの再実行

VM インスタンスで起動スクリプトを再実行するには、インスタンスに接続し、次のいずれかのコマンドを実行します。

Debian、CentOS、RHEL イメージ

sudo google_metadata_script_runner startup

GCEMetadataScripts: Starting startup scripts (version YYMMDD.NN).
GCEMetadataScripts: Found startup-script in metadata.
GCEMetadataScripts: startup-script exit status 0
GCEMetadataScripts: Finished running startup scripts.

Container-Optimized OS、Ubuntu、SLES イメージ

sudo google_metadata_script_runner --script-type startup --debug

起動スクリプトのログの表示

起動スクリプトの出力が次のログファイルに書き込まれます。

  • CentOS と RHEL: /var/log/messages
  • Debian: /var/log/daemon.log
  • Ubuntu: /var/log/syslog
  • SLES: /var/log/messages

journalctl コマンドを使用すると、起動スクリプトの出力を表示することもできます。

sudo journalctl -u google-startup-scripts.service

起動スクリプトでのカスタム値の設定

起動スクリプトを複数のインスタンスで実行する場合、起動スクリプトでカスタム値を使用すると便利なことがあります。たとえば、異なるインスタンスで起動スクリプトを実行し、各インスタンスにカスタム メッセージを出力させることができます。

こうしたカスタム値を使用するには、インスタンスの作成時にメタデータの Key-Value ペアとして指定し、起動スクリプトで参照します。カスタム メタデータキーの作成方法については、カスタム メタデータの設定をご覧ください。

カスタム メタデータキーのペアを設定したら、新しいメタデータを照会するように起動スクリプトを変更できます。たとえば、上記のスクリプトは次のように変更できます。

#! /bin/bash
VALUE_OF_FOO=$(curl http://metadata.google.internal/computeMetadata/v1/instance/attributes/foo -H "Metadata-Flavor: Google")
apt update
apt -y install apache2
cat <<EOF > /var/www/html/index.html
<html><body><h1>Hello World</h1>
<p>The value of foo: $VALUE_OF_FOO</p>
</body></html>
EOF

トラブルシューティング

メタデータ サーバーへのネットワーク接続

  • Linux VM の場合、Compute Engine は、メタデータ サーバーとの接続を確認してから、メタデータ サーバーからカスタム起動スクリプトやシャットダウン スクリプトなどの情報を取得します。メタデータ サーバーが応答していないか、ネットワークが構成されていない場合、VM は起動を完了しません。

  • v20160606 より前のイメージを使用する Linux VM の場合、シリアルポート出力に "Waiting for metadata server, attempt N" が表示されます。N は試行回数を表します。

    この問題は、一時的なネットワークの問題によって最大 7 分間続く場合がありますが、自動的に解決されます。7 分経っても問題が自動的に解決されない場合は、VM インスタンスを再作成してください。

次のステップ