マシンイメージから VM インスタンスを作成する


マシンイメージを作成すると、それを使用してソース VM インスタンスのコピーを作成できます。マシンイメージを使用する詳細については、マシンイメージの用途をご覧ください。

マシンイメージには、インスタンスを作成する場合に必要となるほとんどの情報とデータが含まれています。

マシンイメージは変更できませんが、マシンイメージからインスタンスを作成するときに、マシンイメージのほぼすべてのプロパティをオーバーライドできます。

インスタンスは、Google Cloud ConsoleGoogle Cloud CLI、またはCompute Engine API のいずれかを使用してマシンイメージから作成できます。

準備

マシンイメージから VM を作成する(オーバーライドなし)

プロパティを変更せずに完全なマシンイメージから VM を作成する場合は、この方法を使用します。

Console

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

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

  2. [マシンイメージからの新しい VM インスタンス] をクリックします。

  3. マシンイメージを選択して [続行] をクリックします。

  4. (省略可)VM の詳細をカスタマイズします。

  5. [作成] をクリックします。

gcloud

gcloud compute instances create コマンドを使用して、マシンイメージからインスタンスを作成します。

gcloud compute instances create VM_NAME \
    --zone=ZONE \
    --source-machine-image=SOURCE_MACHINE_IMAGE_NAME

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

  • VM_NAME: 作成する VM の名前。
  • ZONE: VM のゾーン
  • SOURCE_MACHINE_IMAGE_NAME: VM の作成元にするマシンイメージ。

たとえば、次の gcloud コマンドを使用すると、us-east1-b ゾーンに my-machine-image マシンイメージから my-instance VM を作成できます。

gcloud compute instances create my-instance \
    --zone=us-east1-b \
    --source-machine-image=my-machine-image

VM が作成されると、次のような出力が表示されます。

Created [https://www.googleapis.com/compute/v1/projects/project-12345/zones/us-east1-b/instances/my-instance].
NAME               ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP   STATUS
my-instance        us-east1-b  e2-standard-2               192.0.2.1   203.224.0.113  RUNNING

API

API で、instances.insert メソッドに対して POST リクエストを作成します。リクエストの本文に次のパラメータを指定します。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances

{
  "name": "VM_NAME",
  "sourceMachineImage": "SOURCE_MACHINE_IMAGE_URL"
}

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

  • PROJECT_ID: 実際のプロジェクト ID
  • ZONE: VM のゾーン
  • VM_NAME: 作成する VM の名前。
  • SOURCE_MACHINE_IMAGE_URL: VM の作成に使用するマシンイメージの完全な URL または部分的な URL。たとえば、my-machine-image というマシンイメージが myProject というプロジェクトにあるとします。有効な URL は次のとおりです。

    • https://www.googleapis.com/compute/v1/projects/myProject/global/machineImages/my-machine-image
    • projects/myProject/global/machineImages/my-machine-image
    • global/machineImages/my-machine-image

マシンイメージから VM を作成する(プロパティのオーバーライドあり)

マシンイメージに基づいて VM を作成して、いくつかの変更を行う場合は、オーバーライドを行います。オーバーライドを使用するには、インスタンスを作成するときに、既存のマシンイメージのプロパティをオーバーライドする属性を渡します。

オーバーライド機能を使用する場合は、次の点にご注意ください。

  • マシンイメージから VM を作成しているときに、ディスク名以外のアタッチされたディスクのプロパティをオーバーライドすることはできません。
  • アタッチされた各リージョン永続ディスクの replicaZones パラメータと、リージョン ディスクのマシンイメージの deviceName を指定する必要があります。

  • マシンイメージの生成に使用したソース VM と新しい VM が同じプロジェクトで、同じリージョンにある場合:

    • ソース インスタンスと新しい VM のプロパティはほとんど同じです。異なるプロパティとしては、自動的に割り当てられるエフェメラル IP アドレスなどがあります。
    • 新しい VM を作成しても、ソース VM インスタンスがまだ存在している場合は、新しい VM にソース インスタンスと同じ名前とゾーンを使用することはできません。
  • マシンイメージの生成に使用したソース VM と新しい VM が同じプロジェクトでも、リージョンが異なる場合:

    • 新しい VM のすべてのゾーンリソースとリージョン リソースをオーバーライドする必要があります。たとえば、VM インスタンスを作成するとき使用するマシンイメージのソース インスタンスが別のリージョンに属している場合は、サブネットワークやリージョン ファイアウォール ルールなどのリージョン リソースをオーバーライドする必要があります。ただし、ロードバランサやサービス アカウントなどのグローバル リソースは、変更しないのであれば、オーバーライドする必要はありません。

Console

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

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

  2. [マシンイメージからの新しい VM インスタンス] をクリックします。

  3. マシンイメージを選択して [続行] をクリックします。

  4. (省略可)VM の詳細をカスタマイズします。

  5. [作成] をクリックします。

    設定の詳細については、イメージから VM インスタンスを作成するをご覧ください。

gcloud

gcloud compute instances create コマンドを使用してインスタンスをマシンイメージから作成して、オーバーライドするプロパティを追加します。

たとえば、次の gcloud コマンドを使用すると、us-east1-b ゾーンに my-machine-image マシンイメージから my-instance VM を作成できます。この例では、マシンタイプの変更、ホスト メンテナンス ポリシーの停止、regional-disk-0 という名前のリージョン永続ディスクの構成でオーバーライドを行います。

gcloud compute instances create my-instance \
    --zone=us-east1-b \
    --source-machine-image=my-machine-image \
    --machine-type=e2-standard-2 \
    --maintenance-policy=TERMINATE \
    --create-disk=device-name=boot-device-0,boot=true,auto-delete=true \
    --create-disk=device-name=regional-disk-0,\
      replica-zones=^:^us-east1-b:us-east1-c,boot=false

API

VM の作成時にマシンイメージのプロパティをオーバーライドするには、instances.insert() API を使用し、オーバーライドするフィールドをリクエスト本文で指定します。

API で、instances.insert メソッドに対して POST リクエストを作成します。リクエストの本文に、sourceMachineImage パラメータと必要なオーバーライドを追加します。インスタンスの作成時に通常設定するプロパティを追加できます。たとえば、マシンタイプを変更する場合は、API 呼び出しに machineType パラメータが追加されます。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances

{
  "name": "VM_NAME",
  "machineType": "zones/ZONE/machineTypes/NEW_MACHINE_TYPE",
  "sourceMachineImage": "SOURCE_MACHINE_IMAGE_URL"
}

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

  • PROJECT_ID: プロジェクト ID
  • ZONE: VM のゾーン
  • VM_NAME: 作成する VM の名前。
  • NEW_MACHINE_TYPE: VM に使用するマシンタイプ
  • SOURCE_MACHINE_IMAGE_URL: インスタンスの作成に使用するマシンイメージの完全な URL または部分的な URL。たとえば、my-machine-image というマシンイメージが myProject というプロジェクトにあるとします。有効な URL は次のとおりです。

    • https://www.googleapis.com/compute/v1/projects/myProject/global/machineImages/my-machine-image
    • projects/myProject/global/machineImages/my-machine-image
    • global/machineImages/my-machine-image

オーバーライド動作

API のオーバーライド動作は、RFC 7396 で記述されている JSON マージパッチ ルールに従います。要約すると、次のルールが適用されます。

  • 基本フィールドをオーバーライドすると、マシンイメージ内の対応する基本フィールドはリクエストの基本フィールド値に置き換えられます。基本フィールドには、machineTypename などのパラメータが含まれます。
  • 繰り返しフィールドをオーバーライドすると、そのプロパティのすべての繰り返し値が、リクエストで指定された対応する値に置き換えられます。繰り返しフィールドは一般的に、型が list のプロパティです。たとえば、disksnetworkInterfaces は繰り返しフィールドです。
  • nested object をオーバーライドすると、マシンイメージ内のオブジェクトは、リクエスト内の対応するオブジェクト仕様とマージされます。ネストされたオブジェクトが繰り返しフィールド内にある場合、そのフィールドは繰り返しフィールドのルールに従って扱われます。ラベルはこのルールの例外であり、ラベルの型が object であっても繰り返しフィールドとして扱われます。

たとえば、マシンイメージから VM を作成し、その VM でリージョン永続ディスクを作成する場合は、ディスクのオーバーライドを使用して replicaZones オプションを指定します。disks フィールドは繰り返しフィールドであるため、リージョン ディスクだけでなく、接続されているすべてのディスクとブートディスクのディスク構成を指定する必要があります。

POST /compute/projects/my-proj/zones/us-west1-a/instances
{
  "name": "vm-from-image",
  "sourceMachineImage": "global/machineImages/my-machine-image",
  "disks": [
    {
      "kind": "compute#attachedDisks",
      "boot": true,
      "autoDelete": true,
      "deviceName": "boot-device",
      "initializeParams": {
        "sourceImage": "projects/my-proj/global/images/my-image",
        "diskType": "projects/my-proj/zones/us-west1-a/diskTypes/pd-standard",
      }
    },
    {
      "kind": "compute#attachedDisk",
      "boot": false,
      "autoDelete": true,
      "deviceName": "regional-device-0",
      "initializeParams": {
         "diskType": "projects/my-proj/zones/us-west1-a/diskTypes/pd-standard",
         "replicaZones": [
            "projects/my-proj/zones/us-west1-a",
            "projects/my-proj/zones/us-west1-c"
         ]
      }
    }
  ]
}

別のプロジェクトのマシンイメージから VM を作成する

別のプロジェクトのマシンイメージから VM を作成するときに、そのソース プロジェクトのサービス アカウントにアクセスできない場合があります。別のプロジェクトのマシンイメージから VM を作成する場合は、マシンイメージにアクセスできることを確認し、新しい VM のサービス アカウント プロパティをオーバーライドする必要があります。

以下のセクションでは、Google Cloud CLI を使用して、異なるプロジェクトに配置されたマシンイメージから VM を作成する方法について説明します。

  1. 別のプロジェクトに保存されているマシンイメージへのアクセスを許可します。

    権限をソース プロジェクトとマシンイメージのいずれかに付与できます。gcloud compute machine-images add-iam-policy-binding コマンドを使用して、マシンイメージに対する権限を付与します。

    gcloud compute machine-images add-iam-policy-binding MACHINE_IMAGE_NAME \
        --project=MACHINE_IMAGE_PROJECT \
        --member='ACCOUNT_EMAIL' \
        --role='roles/compute.admin'
    

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

    • MACHINE_IMAGE_PROJECT: ソース マシンイメージを含むプロジェクトのプロジェクト ID。
    • MACHINE_IMAGE_NAME: 権限バインディングを追加するマシンイメージの名前。
    • ACCOUNT_EMAIL: VM を作成している serviceAccount または user のメールアドレス。メールアドレスは必要な接頭辞を含む形式にしてください。接頭辞は次のいずれかでなければなりません。

      • user:: メールアドレスがユーザー アカウントに関連付けられている場合に指定します。例: user:user@example.com
      • serviceAccount:: メールアドレスがサービス アカウントに関連付けられている場合に指定します。例: serviceAccount:123456789000-compute@developer.gserviceaccount.com

    たとえば、my-machine-image というマシンイメージへの compute.admin バインディングをサービス アカウントのメールアドレス 123456789000-compute@developer.gserviceaccount.com に追加するには、次の gcloud コマンドを使用します。

    gcloud compute machine-images add-iam-policy-binding my-machine-image \
        --project=machine-image-project \
        --member='serviceAccount:123456789000-compute@developer.gserviceaccount.com' \
        --role='roles/compute.admin'
    
  2. gcloud compute instances create コマンドを実行するユーザーに、マシンイメージに関連付けられたサービス アカウントに対するサービス アカウント ユーザーロールroles/iam.serviceAccountUser)を付与します。

  3. gcloud compute instances create コマンドを使用して、マシンイメージから VM を作成します。

    gcloud compute instances create VM_NAME \
        --project=VM_PROJECT_ID \
        --zone=ZONE \
        --source-machine-image=projects/MACHINE_IMAGE_PROJECT/global/machineImages/MACHINE_IMAGE_NAME \
        --service-account=SERVICE_ACCOUNT_EMAIL
    

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

    • VM_PROJECT_ID: VM を作成するプロジェクトのプロジェクト ID。
    • VM_NAME: 作成する VM の名前。
    • ZONE: VM のゾーン
    • MACHINE_IMAGE_PROJECT: マシンイメージのあるプロジェクトのプロジェクト ID。
    • MACHINE_IMAGE_NAME: VM の作成元にするマシンイメージ。
    • SERVICE_ACCOUNT_EMAIL: VM に関連付けるサービス アカウントのメールアドレス。

      たとえば、次のコマンドは、us-east1-b ゾーンにある vm-project 内に、my-machine-image というマシンイメージから my-instance という VM を作成します。

      --service-account フラグには、新しく作成された VM に接続するサービス アカウントを指定します。このフラグを指定しないと、ソース サービス アカウントを両方のプロジェクトで共有できず、オペレーションが失敗します。

      gcloud compute instances create my-instance \
       --project=vm-project \
       --zone=us-east1-b \
       --source-machine-image=projects/machine-image-project/global/machineImages/my-machine-image \
       --service-account=000123456789-compute@developer.gserviceaccount.com
      

      VM が作成されると、次のような出力が表示されます。

      Created [https://www.googleapis.com/compute/v1/projects/project-12345/zones/us-east1-b/instances/my-instance].
      NAME               ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP   STATUS
      my-instance        us-east1-b  e2-standard-2               192.0.2.1   203.224.0.113  RUNNING
      

次のステップ