起動スクリプトは、仮想マシン(VM)インスタンスの起動プロセス中にタスクを実行するファイルです。起動スクリプトは、プロジェクト内のすべての VM または単一の VM に適用できます。VM レベルのメタデータで指定された起動スクリプトは、プロジェクト レベルのメタデータで指定された起動スクリプトをオーバーライドします。また、起動スクリプトはネットワークが利用可能な場合にのみ実行されます。このドキュメントでは、Linux VM インスタンスで起動スクリプトを使用する方法について説明します。プロジェクト レベルの起動スクリプトを追加する方法については、gcloud compute project-info add-metadata
をご覧ください。
Linux 起動スクリプトの場合は、bash ファイルを使用することも、bash 以外のファイルを使用することもできます。bash 以外のファイルを使用する場合は、ファイルの先頭に #!
を追加してインタープリタを指定します。たとえば、Python 3 の起動スクリプトを使用する場合は、ファイルの先頭に #! /usr/bin/python3
を追加します。
このドキュメントの手順のいずれかを使用して起動スクリプトを指定すると、Compute Engine は次の処理を行います。
起動スクリプトを VM にコピーする
起動スクリプトの実行権限を設定する
VM の起動時に
root
ユーザーとして起動スクリプトを実行する
起動スクリプトに関連するさまざまなタスクと、それぞれを実行するタイミングの詳細については、概要をご覧ください。
始める前に
- 起動スクリプトの概要についてお読みください。
- メタデータ サーバーについてお読みください。
-
まだ設定していない場合は、認証を設定します。認証とは、Google Cloud サービスと API にアクセスするために ID を確認するプロセスです。ローカル開発環境からコードまたはサンプルを実行するには、次のように Compute Engine に対する認証を行います。
このページのサンプルをどのように使うかに応じて、タブを選択してください。
コンソール
Google Cloud コンソールを使用して Google Cloud サービスと API にアクセスする場合、認証を設定する必要はありません。
gcloud
-
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
- デフォルトのリージョンとゾーンを設定します。
REST
このページの REST API サンプルをローカル開発環境で使用するには、gcloud CLI に指定した認証情報を使用します。
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
-
Linux 起動スクリプトのメタデータキー
起動スクリプトは、メタデータキーで指定された場所から VM に渡されます。メタデータキーは、起動スクリプトをローカルに保存するか、Cloud Storage に保存するか、VM に直接渡すかを指定します。使用するメタデータキーは、起動スクリプトのサイズによって異なる場合があります。
次の表に、Linux 起動スクリプトに使用できるメタデータキーと、起動スクリプトの保存場所とサイズに基づいて使用するキーの情報を示します。
メタデータキー | 使用目的 |
---|---|
startup-script |
ローカルに保存するか、直接追加する bash または bash 以外の起動スクリプトを渡します。この最大サイズは 256 KB です。 |
startup-script-url |
Cloud Storage に保存され、サイズが 256 KB を超える bash または bash 以外の起動スクリプトを渡します。ここに入力した文字列は、gcloud storage を実行する際にそのまま使用されます。startup-script-url にスペース文字が含まれる場合は、スペースを %20 に置き換えることや、startup-script-url 文字列に二重引用符("" )を追加することはしないでください。 |
Linux 起動スクリプトの実行順序
複数の起動スクリプトを使用できます。ローカルに格納されている起動スクリプトまたは直接追加された起動スクリプトは、Cloud Storage に保存されている起動スクリプトより前に実行されます。次の表に、メタデータキーに基づく Linux 起動スクリプトの実行順序を示します。
メタデータキー | 実行順序 |
---|---|
startup-script |
初回起動後の各起動時の 1 番目 |
startup-script-url |
初回起動後の各起動時の 2 番目 |
Linux 起動スクリプトを直接渡す
VM を作成するときに、起動スクリプトの内容を VM に直接追加できます。次の手順では、Apache をインストールして基本的なウェブページを作成する起動スクリプトで VM を作成する方法を説明します。
Console
Linux 起動スクリプトを新しい VM に直接渡す
Google Cloud コンソールで、[インスタンスの作成] ページに移動します。
[ブートディスク] で [変更] を選択し、Linux オペレーティング システムを選択します。
[詳細オプション] セクションを開き、次の操作を行います。
- [管理] セクションを開きます。
[自動化] セクションで、次の起動スクリプトを追加します。
#! /bin/bash apt update apt -y install apache2 cat <<EOF > /var/www/html/index.html <html><body><p>Linux startup script added directly.</p></body></html> EOF
[作成] をクリックします。
Linux 起動スクリプトを既存の VM に直接渡す
Google Cloud コンソールで [VM インスタンス] ページに移動します。
VM の [名前] をクリックします。
[編集] をクリックします。
[自動化] で、起動スクリプトの内容を追加します。
起動スクリプトの確認
VM が起動したら、ウェブブラウザで外部 IP を表示して、起動スクリプトでウェブサイトが作成されたことを確認します。サンプル起動スクリプトが完了するまでに約 1 分かかることがあります。
gcloud
Linux 起動スクリプトを新しい VM に直接渡す
次の gcloud compute instances create
コマンドを使用して、VM の作成時に起動スクリプトの内容を直接渡します。
gcloud compute instances create VM_NAME \ --image-project=debian-cloud \ --image-family=debian-10 \ --metadata=startup-script='#! /bin/bash apt update apt -y install apache2 cat <<EOF > /var/www/html/index.html <html><body><p>Linux startup script added directly.</p></body></html> EOF'
VM_NAME は VM の名前で置き換えます。
Linux 起動スクリプトを既存の VM に直接渡す
次の gcloud compute instances add-metadata
コマンドを使用して、既存の VM に起動スクリプトを直接追加します。
gcloud compute instances add-metadata VM_NAME \ --zone=ZONE \ --metadata=startup-script='#! /bin/bash apt update apt -y install apache2 cat <<EOF > /var/www/html/index.html <html><body><p>Linux startup script added directly.</p></body></html> EOF'
次のように置き換えます。
VM_NAME: VM の名前
ZONE: VM のゾーン
起動スクリプトの確認
VM が起動したら、ウェブブラウザで外部 IP を表示して、起動スクリプトでウェブサイトが作成されたことを確認します。サンプル起動スクリプトが完了するまでに約 1 分かかることがあります。
REST
Linux 起動スクリプトを新しい VM に直接渡す
起動スクリプトを作成するときに、次の instances.insert
メソッドを使用して、起動スクリプトの内容を直接 VM に渡します。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances { ... "networkInterfaces": [ { "accessConfigs": [ { "type": "ONE_TO_ONE_NAT" } ] } ], "metadata": { "items": [ { "key": "startup-script", "value": "#! /bin/bash\napt update\napt -y install apache2\ncat <<EOF > /var/www/html/index.html\n<html><body><p>Linux startup script added directly.</p></body></html>\nEOF" } ] }, ... }
次のように置き換えます。
PROJECT_ID: プロジェクト ID
ZONE: VM を作成するゾーン
Linux 起動スクリプトを既存の VM に直接渡す
instances.get
メソッドを使用して VM のtags.fingerprint
値を取得します。GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME
次のように置き換えます。
PROJECT_ID: プロジェクト ID
ZONE: VM のゾーン
VM_NAME: VM のゾーン
instances.setMetadata
メソッドを呼び出して、fingerprint
値と、起動スクリプトのメタデータのキーと値を使用して、起動スクリプトを渡します。POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setMetadata { "fingerprint": FINGERPRINT, "items": [ { "key": "startup-script", "value": "#! /bin/bash\napt update\napt -y install apache2\ncat <<EOF > /var/www/html/index.html\n<html><body><p>Linux startup script added directly.</p></body></html>\nEOF" } ], ... }
次のように置き換えます。
PROJECT_ID: プロジェクト ID
ZONE: VM のゾーン
VM_NAME: VM のゾーン
FINGERPRINT:
instances.get
メソッドを使用して取得したtags.fingerprint
値
起動スクリプトの確認
VM が起動したら、ウェブブラウザで外部 IP を表示して、起動スクリプトでウェブサイトが作成されたことを確認します。サンプル起動スクリプトが完了するまでに約 1 分かかることがあります。
ローカル ファイルから Linux 起動スクリプトを渡す
起動スクリプトをワークステーション上のローカル ファイルに保存し、ローカル ファイルの作成時にメタデータとして VM に渡すことができます。VM に保存されているファイルを起動スクリプトとして使用することはできません。
Linux 起動スクリプトをローカル ファイルから VM に渡す前に、次の操作を行います。
起動スクリプトを保存するローカル ファイルを作成する。
gcloud CLI から起動スクリプトへの相対パスをメモする。
このファイルに次の起動スクリプトを追加する。
#! /bin/bash apt update apt -y install apache2 cat <<EOF > /var/www/html/index.html <html><body><p>Linux startup script from a local file.</p></body></html> EOF
gcloud
Linux 起動スクリプトをローカル ファイルから新しい VM に渡す
VM を作成し、--metadata-from-file
フラグを指定した gcloud compute instances create
コマンドを使用して、起動スクリプトとして使用するローカル ファイルの内容を渡します。
gcloud compute instances create VM_NAME \ --image-project=debian-cloud \ --image-family=debian-10 \ --metadata-from-file=startup-script=FILE_PATH
次のように置き換えます。
VM_NAME: VM の名前
FILE_PATH: 起動スクリプト ファイルの相対パス
Linux 起動スクリプトをローカル ファイルから既存の VM に渡す
次の gcloud compute instances add-metadata
コマンドを使用して、ローカル ファイルから既存の VM に起動スクリプトを渡します。
gcloud compute instances add-metadata VM_NAME \ --zone=ZONE \ --metadata-from-file startup-script=FILE_PATH
次のように置き換えます。
VM_NAME: VM の名前
ZONE: VM のゾーン
FILE_PATH: 起動スクリプト ファイルの相対パス
起動スクリプトの確認
ウェブブラウザで外部 IP を表示して、起動スクリプトによってウェブサイトが作成されたことを確認します。サンプル起動スクリプトが完了するまでに約 1 分かかることがあります。
Cloud Storage から Linux 起動スクリプトを渡す
起動スクリプトを Cloud Storage に保存し、作成時に VM に渡します。Cloud Storage に起動スクリプトを追加すると、VM の作成時に起動スクリプトを参照するのに使用できる URL が生成されます。
Cloud Storage バケットから起動スクリプトを追加する前に、次の操作を行います。
起動スクリプトを保存するファイルを作成する。この例では、bash(
.sh
)ファイルを使用します。次の内容を bash ファイルに追加します。これにより、Apache がインストールされ、簡単なウェブページが作成されます。
#! /bin/bash apt update apt -y install apache2 cat <<EOF > /var/www/html/index.html <html><body><p>Linux startup script from Cloud Storage.</p></body></html> EOF
セキュリティ上の影響
禁止するアクセス制御が明示的に設定されている場合を除き、デフォルトではプロジェクト オーナーとプロジェクト編集者は同じプロジェクト内の Cloud Storage ファイルにアクセスできます。
Cloud Storage バケットまたはオブジェクトがメタデータよりも安全性が低い場合、起動スクリプトを変更して VM を再起動すると、権限昇格のリスクがあります。これは、VM が再起動すると、起動スクリプトが
root
として実行され、接続されたサービス アカウントの権限を使用して他のリソースにアクセスできるようになるためです。
制限事項
Console
Cloud Storage に保存されている起動スクリプトを新しい VM に渡す
Google Cloud コンソールで、[インスタンスの作成] ページに移動します。
VM の詳細を指定します。
[ブートディスク] で [変更] を選択し、Linux オペレーティング システムを選択します。
[ID と API へのアクセス] セクションで、ストレージ オブジェクト閲覧者ロール(
roles/storage.objectViewer
)が割り当てられているサービス アカウントを選択します。[詳細オプション] セクションを開き、次の操作を行います。
- [管理] セクションを開きます。
[メタデータ] セクションで、次の値を追加します。
キー: メタデータキー。Cloud Storage から起動スクリプトを追加するには、
startup-script-url
に設定します。値: メタデータの値。次のいずれかの形式を使用して、起動スクリプト ファイルの Cloud Storage の場所に設定します。
- 認証済み URL:
https://storage.googleapis.com/BUCKET/FILE
- gcloud storage URI:
gs://BUCKET/FILE
次のように置き換えます。
- BUCKET: 起動スクリプト ファイルを含むバケットの名前
- FILE: 起動スクリプトのファイル名
- 認証済み URL:
VM を作成するには、[作成] をクリックします。
Cloud Storage に保存されている起動スクリプトを既存の VM に渡す
Google Cloud コンソールで [VM インスタンス] ページに移動します。
VM の [名前] をクリックします。
[編集] をクリックします。
[メタデータ] で、次の値を追加します。
キー:
startup-script-url
値: 次のいずれかの形式を使用する起動スクリプト ファイルの Cloud Storage の場所。
- 認証済み URL:
https://storage.googleapis.com/BUCKET/FILE
- gcloud storage URI:
gs://BUCKET/FILE
- 認証済み URL:
起動スクリプトの確認
ウェブブラウザで外部 IP を表示して、起動スクリプトによってウェブサイトが作成されたことを確認します。サンプル起動スクリプトが完了するまでに約 1 分かかることがあります。
gcloud
Cloud Storage に保存されている起動スクリプトを新しい VM に渡す
次の gcloud compute instances create
コマンドを使用して、VM の作成時に Cloud Storage にある起動スクリプトを渡します。VM が Cloud Storage にアクセスできるように、--scope
フラグの値に storage-ro
を使用します。
gcloud compute instances create VM_NAME \ --image-project=debian-cloud \ --image-family=debian-10 \ --scopes=storage-ro \ --metadata=startup-script-url=CLOUD_STORAGE_URL
次のように置き換えます。
VM_NAME: VM の名前。
CLOUD_STORAGE_URL: メタデータ値。次のいずれかの形式を使用して、起動スクリプト ファイルの Cloud Storage の場所に設定します。
- 認証済み URL:
https://storage.googleapis.com/BUCKET/FILE
- gcloud storage URI:
gs://BUCKET/FILE
- 認証済み URL:
Cloud Storage に保存されている起動スクリプトを既存の VM に渡す
次の gcloud compute instances add-metadata
コマンドを使用して、Cloud Storage に保存されている起動スクリプトを既存の VM に渡します。
gcloud compute instances add-metadata VM_NAME \ --zone=ZONE \ --metadata startup-script-url=CLOUD_STORAGE_URL
次のように置き換えます。
VM_NAME: VM の名前。
ZONE: VM のゾーン。
CLOUD_STORAGE_URL: メタデータ値。次のいずれかの形式を使用して、起動スクリプト ファイルの Cloud Storage の場所に設定します。
- 認証済み URL:
https://storage.googleapis.com/BUCKET/FILE
- gcloud storage URI:
gs://BUCKET/FILE
- 認証済み URL:
起動スクリプトの確認
ウェブブラウザで外部 IP を表示して、起動スクリプトによってウェブサイトが作成されたことを確認します。サンプル起動スクリプトが完了するまでに約 1 分かかることがあります。
REST
Cloud Storage に保存されている起動スクリプトを新しい VM に渡す
次の instances.insert
メソッドを使用して VM の作成時に Cloud Storage にある起動スクリプトを VM に渡します。VM が Cloud Storage にアクセスできるように、scopes
フィールドに https://www.googleapis.com/auth/devstorage.read_only
を追加します。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances { ... "networkInterfaces": [ { "accessConfigs": [ { "type": "ONE_TO_ONE_NAT" } ] } ], "serviceAccounts": [ { "email": "default", "scopes": [ "https://www.googleapis.com/auth/devstorage.read_only" ] } ], "metadata": { "items": [ { "key": "startup-script-url", "value": "CLOUD_STORAGE_URL" } ] }, ... }
次のように置き換えます。
PROJECT_ID: プロジェクト ID。
ZONE: 新しい VM を作成するゾーン。
CLOUD_STORAGE_URL: メタデータ値。次のいずれかの形式を使用して、起動スクリプト ファイルの Cloud Storage の場所に設定します。
- 認証済み URL:
https://storage.googleapis.com/BUCKET/FILE
- gcloud storage URI:
gs://BUCKET/FILE
- 認証済み URL:
Cloud Storage に保存されている起動スクリプトを既存の VM に渡す
instances.get
メソッドを使用して VM のtags.fingerprint
値を取得します。GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME
次のように置き換えます。
PROJECT_ID: プロジェクト ID
ZONE: VM のゾーン
VM_NAME: VM のゾーン
instances.setMetadata
メソッドを呼び出して、fingerprint
値と、起動スクリプトのメタデータのキーと値を使用して、起動スクリプトを渡します。POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setMetadata { "fingerprint": FINGERPRINT, "items": [ { "key": "startup-script-url", "value": "CLOUD_STORAGE_URL" } ], ... }
次のように置き換えます。
PROJECT_ID: プロジェクト ID。
ZONE: VM のゾーン。
VM_NAME: VM のゾーン。
FINGERPRINT:
instances.get
メソッドを使用して取得したtags.fingerprint
値。CLOUD_STORAGE_URL: メタデータ値。次のいずれかの形式を使用して、起動スクリプト ファイルの Cloud Storage の場所に設定します。
- 認証済み URL:
https://storage.googleapis.com/BUCKET/FILE
- gcloud storage URI:
gs://BUCKET/FILE
- 認証済み URL:
起動スクリプトの確認
ウェブブラウザで外部 IP を表示して、起動スクリプトによってウェブサイトが作成されたことを確認します。サンプル起動スクリプトが完了するまでに約 1 分かかることがあります。
Linux 起動スクリプトからメタデータへのアクセス
起動スクリプトでメタデータ値にアクセスできます。たとえば、複数の VM に同じスクリプトを使用できます。各 VM に異なるメタデータ値を渡すことで、各スクリプトを個別にパラメータ化できます。
起動スクリプトからカスタム メタデータ値にアクセスする方法は次のとおりです。
メタデータキーの値をクエリする起動スクリプトを作成します。たとえば、次の bash ファイル(
.sh
)起動スクリプトは、foo
メタデータキーの値をクエリします。#! /bin/bash METADATA_VALUE=$(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><p>Accessing metadata value of foo: $METADATA_VALUE</p></body></html> EOF
次の
gcloud compute instances create
コマンドを使用して、VM の作成時にfoo
メタデータキーの値を設定します。この例では、起動スクリプトがローカル ファイルから VM に渡されます。gcloud
gcloud compute instances create VM_NAME \ --image-project=debian-cloud \ --image-family=debian-10 \ --metadata-from-file=startup-script=FILE_PATH \ --metadata=foo=bar
次のように置き換えます。
VM_NAME: VM の名前
FILE_PATH: 起動スクリプト ファイルの相対パス
メタデータの Key-Value ペアを指定する方法の詳細については、カスタム メタデータの設定をご覧ください。
ローカル ワークステーションからウェブブラウザで外部 IP を表示し、起動スクリプトが
foo
の値を出力していることを確認します。サンプル起動スクリプトが完了するまでに約 1 分かかることがあります。
Linux 起動スクリプトの再実行
次の手順で起動スクリプトを再実行します。
次のコマンドを実行します。
sudo google_metadata_script_runner startup
Linux 起動スクリプトの出力の表示
Linux 起動スクリプトからの出力を確認するには、次のいずれかの操作を行います。
インスタンスに接続し、次のコマンドを実行します。
sudo journalctl -u google-startup-scripts.service
Google Cloud コンソールでシリアルポート 1 を介して出力を表示し、
google_metadata_script_runner
イベントを確認します。
次のステップ
Windows VM で起動スクリプトを使用する方法を学習する。
起動スクリプトのトラブルシューティングについて学習する。
シャットダウン スクリプトの追加方法を学習する。
メタデータの保存と取得について学習する。