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 のいずれかを使用します。
始める前に
- このガイドのコマンドラインの例を使用する場合、以下を行ってください。
- gcloud コマンドライン ツールの最新バージョンをインストールするか、最新バージョンに更新します。
- デフォルトのリージョンとゾーンを設定します。
- このガイドの API の例を使用する場合、API アクセスを設定します。
- メタデータ サーバーとは何かを理解します。
- Unix の改行を含む ASCII テキストを保存するようにテキスト エディタを構成します。
このタスクに必要な権限
このタスクを行うには、次の権限が必要です。
- 新しいインスタンスを作成するために必要なすべての権限
- インスタンスに対する
compute.instances.setMetadata
起動スクリプトの実行
ネットワークが使用可能になった後、インスタンスは常に起動スクリプトを root として実行します。
起動スクリプトのファイル形式に制約はありません。起動スクリプトが存在する場合、Compute Engine は次の処理を行います。
- インスタンス内のローカル ファイルに起動スクリプトをコピーします。
- ファイルの実行権限を設定します。
- ファイルを実行します。
たとえば、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 の [起動スクリプト] セクションで、起動スクリプトを直接指定します。
- Cloud Console で、[VM インスタンス] ページに移動します。
- [インスタンスを作成] をクリックします。
- [新しいインスタンスの作成] ページで、インスタンスのプロパティを入力します。 詳細構成オプションで、[管理、セキュリティ、ディスク、ネットワーク、単一テナンシー] セクションを展開します。
- [自動化] セクションの [起動スクリプト] で、起動スクリプトの内容を指定します。
- [作成] をクリックしてインスタンスを作成します。
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
コマンドを使用してイメージを準備する場合にのみ実行されます。
スクリプトの種類 | 次のものを実行します
|
次のものを実行します
|
---|---|---|
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 |
ps1 1 起動スクリプト |
メタデータキー:sysprep-specialize-script-ps1 |
メタデータキー:windows-startup-script-ps1 |
Cloud Storage に格納された起動スクリプトを渡す
スクリプトを Cloud Storage に保存し、インスタンスの作成時にスクリプトの URL を指定できます。これにより、どこからでもスクリプトにアクセスできるようになるほか、メタデータ サーバーの制限も回避できます。
スクリプトへのアクセス権限の設定
Cloud Storage から起動スクリプトを使用する前に、そのスクリプトにアクセスする権限を取得する必要があります。バケットとファイルのアクセス制御の設定を調べて、必要な権限があることを確認してください。
禁止するアクセス制御が明示的に設定されている場合を除き、プロジェクト オーナーまたは編集者はデフォルトで同じプロジェクトのファイルにアクセスできます。
起動スクリプトの提供
- バケットを作成します。バケットを作成することも、既存のバケットを使用することもできます。バケットの作成については、Google Cloud Console でバケットを作成するまたは
gsutil
でバケットを作成するをご覧ください。 - ファイルをバケットにアップロードします。手順に沿って
gsutil
または Cloud Console を使用し、オブジェクトをアップロードします。 - インスタンスを作成するときに、起動スクリプト ファイルの URL を指定します。
Console
Google Cloud Console で、[VM インスタンス] ページに移動します。
[インスタンスを作成] をクリックします。
新しいインスタンスの作成ページで、インスタンスにプロパティを入力します。
[ID と API アクセス] セクションで、Cloud Storage 内の起動スクリプト ファイルに対する読み取り権限を持つサービス アカウントを選択します。たとえば、サービス アカウントにはストレージ オブジェクト閲覧者ロールの権限が必要です。
[管理、セキュリティ、ディスク、ネットワーク、単一テナンシー] セクションを展開します。
[メタデータ] セクションで、メタデータキーとして
startup-script-url
を指定します。[値] ボックスに、
gs://BUCKET/FILE
またはhttps://storage.googleapis.com/BUCKET/FILE
形式で起動スクリプト ファイルの URL を入力します。[作成] をクリックしてインスタンスを作成します。
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
Google Cloud Console で、[VM インスタンス] ページに移動します。
起動スクリプトを追加するインスタンスをクリックします。
インスタンスの詳細ページで、次の手順を行います。
- [編集] ボタンをクリックします。
- [カスタム メタデータ] で [項目を追加] をクリックします。
次のいずれかのキーを使用して起動スクリプトを追加します。
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
次のステップ
- シャットダウン スクリプトを追加する
- インタラクティブ シリアル コンソールを使用してインスタンスのトラブルシューティングを行う。
- 起動スクリプトのトラブルシューティングを行う。