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


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

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

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

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

始める前に

  • まだ設定していない場合は、認証を設定します。認証とは、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

制限事項

マシンイメージから VM を作成する場合、次の制限が適用されます。

  • 60 分でソース マシン イメージから最大 6 個の VM を作成できます。この上限を超えると、インスタンスの作成オペレーションが失敗し、次のようなエラーが返されます。

    Operation rate exceeded for resource 'projects/test/global/machineImages/machine-image-1'.
    Too frequent operations from the source resource.
    

    定義した上限(60 分で 6 つの VM)を超える VM を作成するには、ソース VM から追加のマシンイメージを作成するか、新しい VM から有効期間が短いマシンイメージを作成します。その後、新しいマシンイメージから必要な数の VM を作成できます。

  • Google Cloud コンソールを使用して、リージョン永続ディスクがアタッチされたマシンイメージから VM を作成することはできません。Google Cloud CLI または REST を使用して、アタッチされているリージョン永続ディスクごとに replicaZones パラメータと deviceName パラメータを指定します。詳細については、マシンイメージから VM を作成する(プロパティのオーバーライドあり)をご覧ください。

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

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

コンソール

  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

REST

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

コンソール

  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

REST

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 のサービス アカウント プロパティをオーバーライドする必要があります。

共有 VPC ネットワークを使用するプロジェクト間でマシンイメージを共有する場合は、マシンイメージから VM を作成するときに、共有 VPC の詳細を明示的に指定する必要があります。たとえば、非ホスト プロジェクトで VM を作成する場合は、--network--subnet、または --network-interface オプションを使用して、ホスト プロジェクトの共有 VPC の詳細を指定します。

以下のセクションでは、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
        --subnet=SUBNET
    

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

    • VM_PROJECT_ID: VM を作成するプロジェクトのプロジェクト ID
    • VM_NAME: 作成する VM の名前
    • ZONE: VM のゾーン
    • MACHINE_IMAGE_PROJECT: マシンイメージが置かれているプロジェクトのプロジェクト ID
    • MACHINE_IMAGE_NAME: VM の作成元にするマシンイメージ
    • SERVICE_ACCOUNT_EMAIL: VM にアタッチするサービス アカウントのメールアドレス
    • SUBNET: サブネットとインスタンスが同じプロジェクト内にある場合は、SUBNET をインスタンスと同じリージョンにあるサブネットの名前に置き換えます。

      共有 VPC ネットワークのサブネットを指定するには、SUBNET を次の形式の文字列に置き換えます。

      projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME
      

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

      • HOST_PROJECT_ID: 共有 VPC ホスト プロジェクトのプロジェクト ID
      • REGION: サブネットのリージョン
      • SUBNET_NAME: サブネットの名前

      たとえば、次のコマンドは、my-machine-image というマシンイメージから、us-east1-b ゾーンの vm-projectmy-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
      

次のステップ