インスタンス テンプレートの作成

このページでは、インスタンス テンプレートの作成および管理方法について説明します。インスタンス テンプレートは、マネージド インスタンス グループのインスタンスのマシンタイプ、イメージ、ゾーン、その他のインスタンス プロパティを定義します。マネージド インスタンス グループを作成するには、インスタンス テンプレートが必要です。

インスタンス テンプレートの詳細については、インスタンス グループの概要をご覧ください。

始める前に

インスタンス テンプレートの作成

インスタンス テンプレートは、マネージド インスタンス グループを作成するために必要です。マネージド インスタンス グループには、同一の仮想マシン インスタンスが含まれます。これらの同一インスタンスを維持するために、インスタンス グループは指定されたインスタンス テンプレートを使用して、そのグループの VM インスタンスを作成します。

インスタンス メタデータ、起動スクリプト、永続ディスク、サービス アカウントなど、個々の VM インスタンスを作成するための通常の API リクエストで定義できるあらゆるインスタンス プロパティは、インスタンス テンプレートで記述できます。

インスタンス テンプレートの作成には最低限、インスタンスの作成に必要なプロパティと同じプロパティが必要になります。必須項目の一覧は、instanceTemplates().insert リファレンスで確認してください。

インスタンス テンプレートは、Google Cloud Platform Consolegcloud compute ツールまたは API を使用して作成します。

Console

  1. Cloud Platform Console で、[インスタンス テンプレート] ページに移動します。

    [インスタンス テンプレート] ページに移動

  2. [インスタンス テンプレートを作成] をクリックします。
  3. インスタンス テンプレートに使用する各項目を入力するか、またはデフォルト値を承認します。デフォルトの値は次のとおりです。

    • マシンタイプ: n1-standard-1
    • イメージ: 最新の Debian イメージ
    • ブートディスク: インスタンスにちなんで名付けられた新しい標準のブートディスク
    • VPC ネットワーク: default VPC ネットワーク
    • IP アドレス: エフェメラル外部 IP アドレス
  4. [作成] をクリックしてテンプレートを作成します。

gcloud

gcloud compute で、instance-templates create コマンドを使用してインスタンス テンプレートを作成します。

gcloud compute instance-templates create [INSTANCE_TEMPLATE]

ここで、[INSTANCE_TEMPLATE] を希望するインスタンス テンプレート名に置き換えます。

明示的なテンプレート設定を指定しない場合は、gcloud compute により以下のデフォルト値でテンプレートが作成されます。

  • マシンタイプ: n1-standard-1
  • イメージ ファミリー: 最新の Debian イメージ
  • イメージ プロジェクト: 公開された Debian イメージを所有し共有するプロジェクト
  • ブートディスク: インスタンスにちなんで名付けられた新しい標準のブートディスク
  • ネットワーク: default VPC ネットワーク
  • IP アドレス: エフェメラル外部 IP アドレス

これらの構成設定は明示的に指定することもできます。次に例を示します。

gcloud compute instance-templates create example-template-custom \
    --machine-type n1-standard-4 \
    --image-family debian-9 \
    --image-project debian-cloud \
    --boot-disk-size 250GB

使用可能なフラグの一覧は、gcloud compute リファレンスで確認できます。

デフォルトの構成設定を使用したテンプレートは次のようなものになります。

gcloud compute instance-templates describe example-template

creationTimestamp: '2014-09-10T16:18:32.042-07:00'
description: ''
id: '6057583701980539406'
kind: compute#instanceTemplate
name: example-template
properties:
  canIpForward: false
  disks:
  - autoDelete: true
    boot: true
    initializeParams:
      sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/family/debian-9
    kind: compute#attachedDisk
    mode: READ_WRITE
    type: PERSISTENT
  machineType: n1-standard-1
  networkInterfaces:
  - accessConfigs:
    - kind: compute#accessConfig
      name: external-nat
      type: ONE_TO_ONE_NAT
    network: https://www.googleapis.com/compute/v1/projects/myproject/global/networks/default
  scheduling:
    automaticRestart: true
    onHostMaintenance: MIGRATE
  serviceAccounts:
  - email: default
    scopes:
    - https://www.googleapis.com/auth/devstorage.read_only
selfLink: https://www.googleapis.com/compute/v1/projects/myproject/global/instanceTemplates/example-template

API

インスタンス テンプレートの API では、instanceTemplates().insert ドキュメントの説明に沿って、必要なすべての設定項目を明示的に定義する必要があります。たとえば、最小限の必須項目を使用したインスタンス テンプレートは次のようなものになります。

{
"name": "example-template",
"properties": {
  "machineType": "zones/us-central1-a/machineTypes/n1-standard-4",
  "networkInterfaces": [
    {
      "network": "global/networks/default",
      "accessConfigs":
      [
        {
          "name": "external-IP",
          "type": "ONE_TO_ONE_NAT"
        }
      ]
    }
  ],
  "disks":
  [
    {
      "type": "PERSISTENT",
      "boot": true,
      "mode": "READ_WRITE",
      "initializeParams":
      {
        "sourceImage": "projects/debian-cloud/global/images/family/debian-9"
      }
    }
  ]
  }
}

disks プロパティについては、initializeParams プロパティを指定して各インスタンスに新しい永続ブートディスクを作成する必要があります。または、source プロパティを指定して既存の永続ブートディスクを関連付けることもできます。既存のブートディスクを関連付けた場合、テンプレートから作成できるインスタンスは 1 つだけになります。

サブネットを指定したインスタンス テンプレートの作成

インスタンス テンプレートのコマンドで --subnet フラグと --region フラグが使用できるようになりました。これらのフラグを使用すると、選択したサブネットに新しいインスタンスを配置できます。--subnet フラグは --region フラグと一緒に使用する必要があります。インスタンス テンプレートに指定するサブネットは事前に用意しておく必要があります。

gcloud compute instance-templates create [INSTANCE_TEMPLATE] \
    --region [REGION] \
    --subnet [SUBNET_NAME]

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

  • [INSTANCE_TEMPLATE] を希望するインスタンス テンプレート名に置き換えます。
  • [REGION] をサブネットのリージョンに置き換えます。
  • [SUBNET_NAME] をサブネットの名前に置き換えます。

この例では、subnet-us-qa サブネットにのみインスタンスを作成する template-qa という名前のテンプレートを作成しています。

gcloud compute instance-templates create template-qa \
    --region us-central1 \
    --subnet subnet-us-qa
Created [https://www.googleapis.com/compute/latest/projects/PROJECT_ID/global/instanceTemplates/template-qa].
NAME        MACHINE_TYPE  PREEMPTIBLE CREATION_TIMESTAMP
template-qa n1-standard-1             2015-12-23T20:34:00.791-07:00

このテンプレートを使用してマネージド インスタンス グループのインスタンスを作成すると(自動スケーリングの設定は任意)、指定したリージョンの指定したサブネットにインスタンスが自動的に作成されます。これにより、負荷分散のために新規に作成するインスタンスのサブネットを制御できるようになります。

インスタンス テンプレートでのカスタム イメージまたはパブリック イメージの使用

マネージド インスタンス グループはインスタンスの追加と削除が頻繁に行われることを想定した設計であるため、カスタム イメージを作成してそれをインスタンス テンプレートで指定するようにすると便利です。インスタンスで必要とするアプリケーションと設定をイメージで用意しておくと、マネージド インスタンス グループ内の個々のインスタンスにこれらを手動で設定する必要がなくなります。

代わりに、公開イメージ起動スクリプトを使用するインスタンス テンプレートを作成し、それを起動してインスタンスを準備することもできます。カスタム イメージは起動スクリプトを使用するインスタンスより確定的で、素早く起動できます。ただし、起動スクリプトのほうが柔軟性が高く、インスタンス内のアプリケーションと設定を簡単に更新することができます。

確定的なインスタンス テンプレート

通常、インスタンス テンプレートのプロパティはできるだけ明示的かつ確定的にすることをお勧めします。サードパーティのサービスをインストールまたは使用する起動スクリプトをインスタンス テンプレート内で使用する場合は、必ずインストールするアプリケーションのバージョンなど、明示的な情報をそのスクリプトで指定してください。Compute Engine はテンプレートで定義された情報のみに依存しており、参照されているサードパーティのサービスを制御することはできません。テンプレートが曖昧な場合、インスタンス テンプレートが予想外の動作をすることがあります。

たとえば、次のコマンドで、apache2 をインストールするとともに外部サーバー上でホストされたファイルを使用する起動スクリプトを含む、インスタンス テンプレートを作成するとします。

gcloud compute instance-templates create example-template-with-startup \
    --image-family debian-9 \
    --image-project debian-cloud \
    --metadata startup-script='#! /bin/bash
    sudo apt-get install -y apache2
    scp myuser@108.59.87.185:index.php /var/www/'

この起動スクリプトには 2 つの潜在的な問題があります。

  • このスクリプトはインストールする apache2 のバージョンを明示的に定義しておらず、apt-get レポジトリにある使用可能な現行バージョンに依存しています。
  • このスクリプトはサードパーティ上でホストされているバージョン指定のないファイルに依存しており、これはインスタンス テンプレートが前回使用された後に変更されている可能性があります。

オートスケーラーを使用する場合、確定的でないインスタンス テンプレートでは、オートスケーラーによって新しいインスタンスが異なる設定(別バージョンの apache2 など)でマネージド インスタンス グループに追加される可能性があります。

同様に、確定的でないインスタンス テンプレートをマネージド インスタンス グループに適用し、そのグループを Instance Group Updater サービスを使用して異なるテンプレートに更新した後に、以前のテンプレートにロールバックした場合、インスタンスは常に起動時の最新バージョンをフェッチするため、更新前とは異なるバージョンの apache2 または index.php ファイルがインスタンスで使用されてしまう可能性があります。

テンプレートの予期しない動作を防止するため、以下のいずれかの方法を使用してください。

  • コンテナ用に最適化されたイメージ、または Docker タグの付いた Docker を使用します。たとえば、Docker イメージの新しいビルドに毎回新しいタグを割り当て、そのタグをインスタンス テンプレートで(デフォルトの最新タグの代わりに)使用することをお勧めします。コンテナ用に最適化されたイメージについては、マニフェスト ファイル内でイメージの特定のビルドを明示的に参照できます。下の例では、「version_2_1_3」というタグの付いたバージョンの Docker イメージ「myimage」を使用しています。

    version: v1beta2
    containers:
      - name: simple-echo
        image: myimage:version_2_1_3
           [ rest of your manifest file ]
    
  • テンプレートのイメージとして使用するカスタム イメージを作成します。これは起動スクリプトよりも望ましい方法です。この方法ではすべてのインスタンスが必ず同一になるのに対し、起動スクリプトを使用する場合は配布パッケージの更新後に結果が変わる可能性があるからです。プロトタイピングや迅速な開発にはインスタンス テンプレートの起動スクリプトを使用し、実際のサービスを展開する準備ができたらカスタム イメージを使用するようにしてください。

  • 起動スクリプトを使用する場合は、スクリプトを更新して確定的なものにすることを検討してください。たとえば、以前のテンプレートの新バージョンを作成して、次のように確定的な起動スクリプトを指定します。

    gcloud compute instance-templates create example-template-with-startup-2-1-3 \
        --image-family debian-9 \
        --image-project debian-cloud \
        --metadata startup-script='#! /bin/bash
        sudo apt-get install -y apache2=2.2.20-1ubuntu1
        scp myuser@108.59.87.185:version_2_1_3/index.php /var/www/'
    

    ここで、「version_2_1_3」はサービスのバージョン 2.1.3 用の PHP スクリプトが格納されたサブディレクトリです。

メタデータと起動スクリプト

インスタンス テンプレートでは、メタデータと起動スクリプトを、インスタンスのディレクトリ作成時に指定するのと同じ方法で指定できます。インスタンス テンプレートで指定した起動スクリプトとメタデータは、そのテンプレートから作成または再作成されるすべての新規インスタンスに適用されます。

たとえば、インスタンス テンプレートで次のようにメタデータのキーと値のペアを指定したとします。

POST https://www.googleapis.com/compute/v1/projects/myproject/global/instanceTemplates

{
 "name": "example-instance-template",
 "properties": {
  "machineType": "n1-standard-1",
  "disks": [
    ...
   }
  ],
  "metadata": {
   "items": [
    {
     "key": "apple",
     "value": "red"
    }
   ]
  },
  ...
}

メタデータ apple:red は、このインスタンス テンプレートから作成するすべてのインスタンスに適用されます。

インスタンス テンプレートの更新

既存のインスタンス テンプレートを更新したり、作成したインスタンス テンプレートを変更したりすることはできません。インスタンス テンプレートが最新でなくなった場合や、設定の変更が必要になった場合は、新しいインスタンス テンプレートを作成してください。

インスタンス テンプレートに関する情報の取得

Console

  1. Cloud Platform Console で、[インスタンス テンプレート] ページに移動します。

    [インスタンス テンプレート] ページに移動

  2. インスタンス テンプレートの名前をクリックして、テンプレートの詳細を表示します。

gcloud

gcloud コマンドライン ツールを使用して、次を実行します。

gcloud compute instance-templates describe [INSTANCE_TEMPLATE]

API

API で、instanceTemplates().get リクエストを実行します。

GET https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/instanceTemplates/[INSTANCE_TEMPLATE]

インスタンス テンプレートの一覧表示

作成したインスタンス テンプレートの一覧を取得するには、次の手順に従います。

Console

[インスタンス テンプレート] ページには、プロジェクトのすべてのインスタンス テンプレートが一覧表示されます。

[インスタンス テンプレート] ページに移動

gcloud

gcloud コマンドライン ツールを使用して、次を実行します。

gcloud compute instance-templates list

API

API で、instanceTemplates().list リクエストを実行します。

GET https://www.googleapis.com/compute/v1/projects/myproject/global/instanceTemplates

インスタンス テンプレートの削除

インスタンス テンプレートを削除すると、そのテンプレートは一覧から消去されます。マネージド インスタンス グループがそのインスタンス テンプレートを参照している場合は、テンプレートを削除できません。

Console

  1. Cloud Platform Console で、[インスタンス テンプレート] ページに移動します。

    [インスタンス テンプレート] ページに移動

  2. 削除するインスタンス テンプレートを選択します。
  3. [削除] をクリックします。

gcloud

gcloud コマンドライン ツールを使用して、次を実行します。

gcloud compute instance-templates delete example-template

API

API で、instanceTemplates().delete リクエストを実行します。

DELETE https://www.googleapis.com/compute/v1/projects/myproject/global/instanceTemplates/example-template

マネージド インスタンス グループのインスタンスは時折、グループ内の他のインスタンスと同期しなくなり、他のインスタンスとは別のインスタンス テンプレートを使用してしまうことがあります。マネージド インスタンス グループのインスタンスが、グループに指定されたテンプレートとは別のテンプレートを使用している場合、そのインスタンスはそのテンプレートが削除されても、引き続きそのテンプレートを自動修復イベントに使用します。インスタンスを新しいテンプレートに更新するには、そのインスタンスを再作成してください。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Compute Engine ドキュメント