起動スクリプトの実行

独自の起動スクリプトを作成して仮想マシンで実行すると、インスタンスが起動するたびに自動タスクを実行できます。起動スクリプトでは、ソフトウェアのインストール、更新の実行、サービスの有効化など、さまざまなタスクを定義して実行できます。これにより、新しいインスタンスの作成時を含め、仮想マシン インスタンスをプログラムによって簡単にカスタマイズできます。

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

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

起動スクリプトは、メタデータ サーバーで startup-script メタデータキーを使用して指定します。起動スクリプトを渡すには、gcloud コマンドライン ツール、API、Google Cloud Platform Console を使用できます。

始める前に

このタスクに必要な権限

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

起動スクリプトの実行

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

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

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

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

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

#! /usr/bin/python

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

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

ローカル起動スクリプトには、256 KB というメタデータ値の長さ制限が適用されます。起動スクリプトがこの制限を超えている場合、ローカルに読み込むことはできません。その場合は代わりに Google 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

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

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

Console

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

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

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

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

    GCP Console での起動スクリプトの設定のスクリーンショット

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

gcloud

gcloud コマンドライン ツールで、--metadata フラグを指定し、startup-script=[CONTENTS] キーペアを使用して起動スクリプトの内容を渡します。[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-get update
apt-get install -y apache2
cat <<EOF > /var/www/html/index.html
<html><body><h1>Hello World</h1>
<p>This page was created from a simple start up script!</p>
</body></html>
EOF'

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

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

同様に、PowerShell を使用している場合は、--% マーカーを使用してコマンドをそのまま gcloud ツールに渡して実行できます。

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

API

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

POST https://www.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-get update\napt-get install -y apache2\ncat <<EOF > /var/www/html/index.html\n<html><body><h1>Hello World</h1>\n<p>This page was created from a simple start up script!</p>\n</body></html>"
      }
    ]
  }
  ...
}

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

起動スクリプトを Windows インスタンスで実行するには、Windows 固有のメタデータキーを使用します。以下に示す特殊なキーのいずれかを選択します。実行するスクリプトの種類に対応するキーを選択する必要があります。複数のキーをインスタンスに渡して複数のスクリプトを指定することもできます。キーはそれぞれインスタンスごとに 1 回だけ指定できます。

上記と同じ手順に従って、次のキーをローカル起動スクリプトで使用できます。

スクリプトの種類 起動の前、sysprep 中に実行 sysprep の完了後、起動のたびに実行
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

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

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

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

Google Cloud Storage に格納されている起動スクリプトを使用するには、そのスクリプトにアクセスする権限が必要です。バケットとファイルのアクセス制御の設定を調べて、必要な権限があることを確認してください。

プロジェクト オーナーと編集者は、アクセス制御で明示的に禁止されていない限り、同じプロジェクトのファイルにアクセスできます。

起動スクリプトの提供

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

    Console

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

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

    2. [インスタンスを作成] をクリックします。
    3. [新しいインスタンスの作成] ページで、インスタンス向けに希望するプロパティを入力します。 詳細構成オプションで、[管理、セキュリティ、ディスク、ネットワーク、単一テナンシー] セクションを展開します。
    4. [メタデータ] セクションで、メタデータキーとして startup-script-url を指定します。
    5. [] ボックスで、起動スクリプト ファイルの URL を gs://[BUCKET]/[FILE] または https://storage.googleapis.com/[BUCKET]/[FILE] の形式で指定します。
    6. [ID と API アクセス] セクションで、Cloud Storage 内の起動スクリプト ファイルに対する読み取り権限を持つサービス アカウントを選択します。たとえば、サービス アカウントにはストレージ オブジェクト閲覧者の役割の権限が必要です。
    7. [作成] をクリックしてインスタンスを作成します。

    gcloud

    gcloud コマンドライン ツールで、--scopes フラグと --metadata フラグを使用してインスタンスを作成し、startup-script-url キーを指定します。--scopes フラグで、仮想マシンが Google Cloud Storage にアクセスして起動スクリプトをダウンロードできるようにします。Google 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/startupscript.sh
    

    API

    API で、リクエストのメタデータ プロパティの一部として起動スクリプトを渡します。メタデータキーには startup-script-url を使用します。さらに、scopes のリストに Google Cloud Storage スコープを含めて、仮想マシンが起動スクリプト ファイルにアクセスできるようにします。

    POST https://www.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/myfile"
          }
        ]
      },
      "tags": {
        "items": []
      },
      "machineType": "zones/us-central1-a/machineTypes/n1-standard-1",
      "name": "example-instance"
    }
    

    Windows

    gcloud コマンドライン ツールで、--scopes フラグと --metadata フラグを使用してインスタンスを作成し、windows-startup-script-url キーを指定します。--scopes フラグで、仮想マシンが Google Cloud Storage にアクセスして起動スクリプトをダウンロードできるようにします。Google 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/startupscript.ps1
    

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

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

実行中のインスタンスに対して起動スクリプトを設定するには、次の手順に従います。

Console

  1. [VM インスタンス] ページに移動します。
  2. 起動スクリプトを追加するインスタンスをクリックします。インスタンスの詳細ページが表示されます。
  3. インスタンスの詳細ページで、次の手順を実行します。

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

      • startup-script: 起動スクリプトの内容を直接渡す場合に使用します。
      • startup-script-url: Google Cloud Storage に格納されている起動スクリプトの URL を渡す場合に使用します。

gcloud

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

  • --metadata startup-script=CONTENTS: 起動スクリプトの内容を直接渡す場合に使用します。
  • --metadata startup-script-url=URL: Google 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://www.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: Google Cloud Storage に格納されている起動スクリプトの URL を渡す場合に使用します。

例:

POST https://www.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、SLES、Container-Optimized OS、および Ubuntu イメージ:

$ sudo google_metadata_script_runner --script-type startup --debug

startup-script: INFO Starting startup scripts.
startup-script: INFO startup-script: Return code 0.
startup-script: INFO Finished running startup scripts.

Container-Optimized OS では、journalctl を使用して起動スクリプトの出力を表示することもできます。

$ sudo journalctl -u google-startup-scripts.service

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

  • CentOS、RHEL: /var/log/messages
  • Debian: /var/log/daemon.log
  • Ubuntu 14.04、16.04、16.10: /var/log/syslog
  • SLES 11 および 12: /var/log/messages

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

起動スクリプトを複数のインスタンスで実行する場合、起動スクリプトでカスタム値を使用すると便利なことがあります。たとえば、同じ起動スクリプトを実行する複数のインスタンスで、それぞれ異なるカスタム メッセージを表示できます。

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

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

#! /bin/bash
VALUE_OF_FOO=$(curl http://metadata.google.internal/computeMetadata/v1/instance/attributes/foo -H "Metadata-Flavor: Google")
apt-get update
apt-get install -y 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 仮想マシンに固有の問題として、Compute Engine でメタデータ サーバーへの接続が確認されるまでは、メタデータ サーバーの情報(カスタム起動スクリプトやカスタム シャットダウン スクリプトなど)が取得されません。そのため、メタデータ サーバーが応答しない場合や、ネットワークがまだ構成されていない場合は、仮想マシンの起動が完了しません。

v20160606 よりも古いイメージを使用している Linux 仮想マシンでは、シリアルポート出力に "Waiting for metadata server, attempt N" というメッセージが表示されます(N は試行回数)。

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

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Compute Engine ドキュメント