Linux VM での起動スクリプトの使用


起動スクリプトは、仮想マシン(VM)インスタンスの起動プロセス中にタスクを実行するファイルです。起動スクリプトは、プロジェクト内のすべての VM または単一の VM に適用できます。VM レベルのメタデータで指定された起動スクリプトは、プロジェクト レベルのメタデータで指定された起動スクリプトをオーバーライドします。また、起動スクリプトはネットワークが利用可能な場合にのみ実行されます。このドキュメントでは、Linux VM インスタンスで起動スクリプトを使用する方法について説明します。プロジェクト レベルの起動スクリプトを追加する方法については、gcloud compute project-info add-metadata をご覧ください。

Linux 起動スクリプトの場合は、bash ファイルを使用することも、bash 以外のファイルを使用することもできます。bash 以外のファイルを使用する場合は、ファイルの先頭に #! を追加してインタープリタを指定します。たとえば、Python 3 の起動スクリプトを使用する場合は、ファイルの先頭に #! /usr/bin/python3 を追加します。

このドキュメントの手順のいずれかを使用して起動スクリプトを指定すると、Compute Engine は次の処理を行います。

  1. 起動スクリプトを VM にコピーする

  2. 起動スクリプトの実行権限を設定する

  3. VM の起動時に root ユーザーとして起動スクリプトを実行する

起動スクリプトに関連するさまざまなタスクと、それぞれを実行するタイミングの詳細については、概要をご覧ください。

始める前に

  • 起動スクリプトの概要についてお読みください。
  • メタデータ サーバーについてお読みください。
  • まだ設定していない場合は、認証を設定します。認証とは、Google Cloud サービスと API にアクセスするために ID を確認するプロセスです。ローカル開発環境からコードまたはサンプルを実行するには、次のように Compute Engine に対する認証を行います。

    このページのサンプルをどのように使うかに応じて、タブを選択してください。

    コンソール

    Google Cloud コンソールを使用して Google Cloud サービスと API にアクセスする場合、認証を設定する必要はありません。

    gcloud

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. デフォルトのリージョンとゾーンを設定します

    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 に直接渡す

  1. Google Cloud コンソールで、[インスタンスの作成] ページに移動します。

    [インスタンスの作成] に移動

  2. [ブートディスク] で [変更] を選択し、Linux オペレーティング システムを選択します。

  3. [詳細オプション] セクションを開き、次の操作を行います。

    1. [管理] セクションを開きます。
    2. [自動化] セクションで、次の起動スクリプトを追加します。

       #! /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
      
  4. [作成] をクリックします。

Linux 起動スクリプトを既存の VM に直接渡す

  1. Google Cloud コンソールで [VM インスタンス] ページに移動します。

    [VM インスタンス] に移動

  2. VM の [名前] をクリックします。

  3. [編集] をクリックします。

  4. [自動化] で、起動スクリプトの内容を追加します。

起動スクリプトの確認

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 に直接渡す

  1. 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 のゾーン

  2. 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 に渡す前に、次の操作を行います。

  1. 起動スクリプトを保存するローカル ファイルを作成する。

  2. gcloud CLI から起動スクリプトへの相対パスをメモする。

  3. このファイルに次の起動スクリプトを追加する。

    #! /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 バケットから起動スクリプトを追加する前に、次の操作を行います。

  1. 起動スクリプトを保存するファイルを作成する。この例では、bash(.sh)ファイルを使用します。

  2. 次の内容を 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
    
  3. Cloud Storage バケットを作成する

  4. ファイルを Cloud Storage バケットに追加する

セキュリティ上の影響

  • 禁止するアクセス制御が明示的に設定されている場合を除き、デフォルトではプロジェクト オーナーとプロジェクト編集者は同じプロジェクト内の Cloud Storage ファイルにアクセスできます。

  • Cloud Storage バケットまたはオブジェクトがメタデータよりも安全性が低い場合、起動スクリプトを変更して VM を再起動すると、権限昇格のリスクがあります。これは、VM が再起動すると、起動スクリプトが root として実行され、接続されたサービス アカウントの権限を使用して他のリソースにアクセスできるようになるためです。

制限事項

Console

Cloud Storage に保存されている起動スクリプトを新しい VM に渡す

  1. Google Cloud コンソールで、[インスタンスの作成] ページに移動します。

    [インスタンスの作成] に移動

  2. VM の詳細を指定します。

  3. [ブートディスク] で [変更] を選択し、Linux オペレーティング システムを選択します。

  4. [ID と API へのアクセス] セクションで、ストレージ オブジェクト閲覧者ロール(roles/storage.objectViewer)が割り当てられているサービス アカウントを選択します。

  5. [詳細オプション] セクションを開き、次の操作を行います。

    1. [管理] セクションを開きます。
    2. [メタデータ] セクションで、次の値を追加します。

      • キー: メタデータキー。Cloud Storage から起動スクリプトを追加するには、startup-script-url に設定します。

      • : メタデータの値。次のいずれかの形式を使用して、起動スクリプト ファイルの Cloud Storage の場所に設定します。

        • 認証済み URL: https://storage.googleapis.com/BUCKET/FILE
        • gcloud storage URI: gs://BUCKET/FILE

        次のように置き換えます。

        • BUCKET: 起動スクリプト ファイルを含むバケットの名前
        • FILE: 起動スクリプトのファイル名
  6. VM を作成するには、[作成] をクリックします。

Cloud Storage に保存されている起動スクリプトを既存の VM に渡す

  1. Google Cloud コンソールで [VM インスタンス] ページに移動します。

    [VM インスタンス] に移動

  2. VM の [名前] をクリックします。

  3. [編集] をクリックします。

  4. [メタデータ] で、次の値を追加します。

    • キー: startup-script-url

    • : 次のいずれかの形式を使用する起動スクリプト ファイルの Cloud Storage の場所。

      • 認証済み URL: https://storage.googleapis.com/BUCKET/FILE
      • gcloud storage URI: gs://BUCKET/FILE

起動スクリプトの確認

ウェブブラウザで外部 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

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

起動スクリプトの確認

ウェブブラウザで外部 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

Cloud Storage に保存されている起動スクリプトを既存の VM に渡す

  1. 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 のゾーン

  2. 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

起動スクリプトの確認

ウェブブラウザで外部 IP を表示して、起動スクリプトによってウェブサイトが作成されたことを確認します。サンプル起動スクリプトが完了するまでに約 1 分かかることがあります。

Linux 起動スクリプトからメタデータへのアクセス

起動スクリプトでメタデータ値にアクセスできます。たとえば、複数の VM に同じスクリプトを使用できます。各 VM に異なるメタデータ値を渡すことで、各スクリプトを個別にパラメータ化できます。

起動スクリプトからカスタム メタデータ値にアクセスする方法は次のとおりです。

  1. メタデータキーの値をクエリする起動スクリプトを作成します。たとえば、次の 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
    
  2. 次の 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 ペアを指定する方法の詳細については、カスタム メタデータの設定をご覧ください。

  3. ローカル ワークステーションからウェブブラウザで外部 IP を表示し、起動スクリプトが foo の値を出力していることを確認します。サンプル起動スクリプトが完了するまでに約 1 分かかることがあります。

Linux 起動スクリプトの再実行

次の手順で起動スクリプトを再実行します。

  1. VM に接続します

  2. 次のコマンドを実行します。

    sudo google_metadata_script_runner startup
    

Linux 起動スクリプトの出力の表示

Linux 起動スクリプトからの出力を確認するには、次のいずれかの操作を行います。

次のステップ