起動スクリプトの実行

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

たとえば、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 Console を使用します。

始める前に

このタスクに必要な権限

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

起動スクリプトの実行

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

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

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

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

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

#! /usr/bin/python

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

ローカル起動スクリプトとは、ローカルのパソコン上にあるスクリプトです。ローカル起動スクリプトを使用するには、ローカル起動スクリプトのファイルをインスタンスに渡すか、起動スクリプトの内容を直接メタデータ サーバーに渡します。次のサブセクションの例では、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

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

また、コンソール、gcloud コマンドライン ツール、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-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://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-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 固有のメタデータキーを使用します。以下の表に示す特殊なキーのいずれかを選択します。実行するスクリプトの種類に対応するメタデータキーを選択する必要があります。複数のメタデータキーをインスタンスに渡すことで、複数のスクリプトを指定することもできます。各メタデータキーは、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 を入力します。
      1. [作成] をクリックして、インスタンスを作成します。

    gcloud

    gcloud コマンドライン ツールを使用して、--scopes フラグと --metadata フラグを使用してインスタンスを作成し、startup-script-url キーを指定します。--scopes フラグは、仮想マシンが 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/startupscript.sh
    

    API

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

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

    Windows

    gcloud コマンドライン ツールを使用して、--scopes フラグと --metadata フラグを使用してインスタンスを作成し、windows-startup-script-url キーを指定します。--scopes フラグは、仮想マシンが 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/startupscript.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-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 分経っても問題が自動的に解決されない場合は、仮想マシン インスタンスを再作成してください。

次のステップ