起動スクリプトの実行

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

たとえば、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 スクリプトを使用することもできます。スクリプトは種類に関係なくそのまま実行されることに注意してください。

bash 以外のスクリプトを実行するには、ファイルの先頭にシバン行を追加して、使用するインタプリタを指定します。たとえば、Python スクリプトを使用する場合は次のようなシバン行を追加します。

#! /usr/bin/python

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

ローカル起動スクリプトとは、ローカル コンピュータ上にあるスクリプトです。ローカル起動スクリプトを使用するには、起動スクリプト ファイルを渡すか、起動スクリプトの内容を直接メタデータ サーバーに渡します。

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

起動スクリプト ファイルの提供

ローカル起動スクリプト ファイルを渡す場合に使用できるのは gcloud コマンドライン ツールだけです。

ローカル起動スクリプトを渡すには、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

起動スクリプトの内容を直接提供する

起動スクリプトの内容を直接渡すこともできます。

Console

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

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

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

  2. [インスタンスを作成] をクリックします。
  3. [新しいインスタンスの作成] ページで、インスタンス向けに希望するプロパティを入力します。 詳細構成オプションで [管理、ディスク、ネットワーキング、SSH 認証鍵] セクションを展開します。
  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. [アクセスとセキュリティ] タブをクリックします。
    7. [プロジェクトへのアクセス] セクションで、[ストレージ] セクションの [読み取り専用] を選択します。これにより、Google Cloud Storage に格納されている起動スクリプトを仮想マシンから使用できるようになります。
    8. [作成] をクリックしてインスタンスを作成します。

    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. ページの上部にある [編集] ボタンをクリックします。
  4. [カスタム メタデータ] で [項目を追加] をクリックします。
  5. 次のいずれかのキーを使用して起動スクリプトを追加します。

    • 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、および Ubuntu イメージ:

$ sudo google_metadata_script_runner --script-type startup
startup-script: INFO Starting startup scripts.
startup-script: INFO startup-script: Return code 0.
startup-script: INFO Finished running startup scripts.

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

  • 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

v20160606 より古いすべてのイメージ:

$ sudo /usr/share/google/run-startup-scripts
google Running startup script...
google Finished running startup script...

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

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

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

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

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

#! /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 ドキュメント