Instanzvorlagen erstellen

Auf dieser Seite wird das Erstellen und Verwalten von Instanzvorlagen beschrieben. Mit Instanzvorlagen können Sie den Maschinentyp, das Bootlaufwerk-Image, das Netzwerk und andere VM-Attribute angeben, die Sie beim Erstellen von VM-Instanzen verwenden möchten.

Sie können mit Instanzvorlagen sowohl VMs in einer verwalteten Instanzgruppe als auch einzelne VMs erstellen.

Hinweis

Beschränkungen

  • Eine freigegebene VPC auf anderen Schnittstellen als nic0 für Instanzvorlagen wird in der gcloud CLI und der API unterstützt, jedoch nicht in der Console.
  • Eine existierende Instanzvorlage kann nicht aktualisiert oder verändert werden, nachdem sie erstellt wurde. Wenn eine Instanzvorlage nicht mehr aktuell ist oder Sie Änderungen an der Konfiguration vornehmen müssen, erstellen Sie eine neue Instanzvorlage.

Neue Instanzvorlage erstellen

Die meisten VM-Attribute, die Sie in einer Anfrage zum Erstellen einer einzelnen VM-Instanz angeben können, lassen sich auch für eine Instanzvorlage angeben, z. B. beliebige Instanzmetadaten, Startskripts, nichtflüchtiger Speicher, Dienstkonten und so weiter. Sie müssen den Maschinentyp, das Bootlaufwerk und das Netzwerk angeben.

Erstellen Sie eine Instanzvorlage über dieGoogle Cloud Console, die Google Cloud CLI, die API, Terraform oder die Cloud-Clientbibliotheken.

Console

  1. Rufen Sie in der Console die Seite Instanzvorlagen auf.

    Zu Instanzvorlagen

  2. Klicken Sie auf Instanzvorlage erstellen.

  3. Geben Sie Werte für die folgenden Felder ein oder übernehmen Sie die Standardwerte. Die Standardwerte ändern sich je nach ausgewählter Maschinenfamilie.

    • Maschinentyp
    • Bild
    • Bootlaufwerk
    • VPC-Netzwerk
    • IP-Adresse
  4. Optional: Wenn Sie ein Image ausgewählt haben, das Shielded VM unterstützt, ändern Sie die Einstellungen der VM für Shielded VM:

    1. Klicken Sie unter Verwaltung, Sicherheit, Laufwerke, Netzwerke, einzelne Mandanten auf den Tab Netzwerk.
    2. Wenn Sie Secure Boot deaktivieren möchten, entfernen Sie das Häkchen bei Secure Boot aktivieren. Mit Secure Boot können Sie Ihre VM-Instanzen vor Malware und Rootkits auf Boot- und Kernel-Ebene schützen. Weitere Informationen finden Sie unter Secure Boot.
    3. Wenn Sie das Virtual Trusted Platform Module (vTPM) deaktivieren möchten, entfernen Sie das Häkchen bei vTPM aktivieren. Durch das vTPM wird Measured Boot aktiviert, das die Integrität der VM vor und während des Bootvorgangs prüft. Weitere Informationen finden Sie unter Virtual Trusted Platform Module (vTPM).

    4. Wenn Sie die Integritätsüberwachung deaktivieren möchten, entfernen Sie das Häkchen bei Integrity Monitoring aktivieren. Mit der Integritätsüberwachung können Sie die Integrität beim Starten Ihrer Shielded VM-Instanzen mithilfe von Cloud Monitoring überwachen. Weitere Informationen finden Sie unter Integritätsmonitoring.

  5. Optional: Klicken Sie unter Verwaltung, Sicherheit, Laufwerke, Netzwerke, einzelne Mandanten auf die Tabs, um Ihre Vorlage weiter anzupassen. Dort können Sie z. B. bis zu 15 sekundäre Nicht-Bootlaufwerke hinzufügen.

  6. Optional: Klicken Sie auf Entsprechende REST-Anfrage, um den REST-Anfragetext aufzurufen, der die JSON-Darstellung Ihrer Instanzvorlage enthält.

  7. Klicken Sie auf Erstellen, um die Vorlage anzulegen.

gcloud

Erstellen Sie mit dem Befehl instance-templates create eine Instanzvorlage in gcloud compute.

gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME

Ersetzen Sie dabei INSTANCE_TEMPLATE_NAME durch einen Namen für die Instanzvorlage.

Wenn Sie die Vorlageneinstellungen nicht explizit angeben, verwendet gcloud compute die folgenden Standardwerte:

  • Maschinentyp: der Maschinentyp, z. B. n1-standard-1.
  • Image: Das neueste Debian-Image
  • Bootlaufwerk: Ein neues Standardbootlaufwerk mit dem gleichen Namen wie die VM
  • Netzwerk: Das Standard-VPC-Netzwerk
  • IP-Adresse: Eine sitzungsspezifische externe IP-Adresse

Sie können diese Konfigurationseinstellungen auch explizit festlegen. Beispiel:

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

Sie können bis zu 15 sekundäre Nicht-Bootlaufwerke hinzufügen. Geben Sie das Flag --create-disk für jedes erstellte sekundäre Laufwerk an. Wenn Sie sekundäre Laufwerke aus einem öffentlichen oder einem vorhandenen Image erstellen möchten, geben Sie im Flag --create-disk die Attribute image und image-project an. Für die Erstellung eines leeren Laufwerks geben Sie diese Attribute nicht an. Fügen Sie optional Attribute für das Laufwerk size und type hinzu.

gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME \
    --create-disk= \
        {--image=DISK_IMAGE | --image-family=DISK_IMAGE_FAMILY}, \
        image-project=DISK_IMAGE_PROJECT, \
        size=SIZE_GB

Dabei gilt:

  • INSTANCE_TEMPLATE_NAME: Der Name der neuen Vorlage.

  • Für DISK_IMAGE oder DISK_IMAGE_FAMILY muss eine der folgenden Optionen angegeben werden:
    • DISK_IMAGE: Der Name des Images, das Sie als Nicht-Bootlaufwerk verwenden möchten.
    • DISK_IMAGE_FAMILY ist eine Image-Familie, die als Nicht-Bootlaufwerk verwendet werden soll.

      Weitere Informationen zu Image-Familien finden Sie unter Best Practices für die Verwendung von Image-Familien in Compute Engine.

  • Bei leeren Laufwerken geben Sie nicht Attribut image nicht an.

  • DISK_IMAGE_PROJECT: Das Image-Projekt, das das Image enthält

    Bei leeren Laufwerken geben Sie nicht Attribut image-project nicht an. Weitere Informationen zu öffentlichen Images finden Sie unter Öffentliche Images.

  • SIZE_GB: Die Größe des sekundären Laufwerks.

Wenn Sie ein Image ausgewählt haben, das Shielded VM unterstützt, können Sie optional die Shielded VM-Einstellungen der Instanz mit einem der folgenden Flags ändern:

  • --no-shielded-secure-boot: Secure Boot deaktivieren

    Mit Secure Boot können Sie Ihre VM-Instanzen vor Malware und Rootkits auf Boot- und Kernelebene schützen. Weitere Informationen finden Sie unter Secure Boot.

  • --no-shielded-vtpm: Deaktiviert das Virtual Trusted Platform Module (vTPM)

    Durch das vTPM wird Measured Boot aktiviert, das die Integrität der VM vor und während des Startens überprüft. Weitere Informationen finden Sie unter Virtual Trusted Platform Module (vTPM).

  • --no-shielded-integrity-monitoring: Deaktiviert die Integritätsüberwachung

    Mit dem Integritätsmonitoring können Sie die Integrität beim Booten Ihrer Shielded VM-Instanzen mithilfe von Cloud Monitoring beobachten. Weitere Informationen finden Sie unter Integritätsüberwachung.

Eine Liste aller verfügbaren Unterbefehle und Flags finden Sie in der Referenz zu instance-templates.

Eine Vorlage mit den Einstellungen für die Standardkonfiguration könnte so aussehen:

gcloud compute instance-templates describe example-template
creationTimestamp: '2019-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://compute.googleapis.com/compute/v1/projects/debian-cloud/global/images/family/debian-10
    kind: compute#attachedDisk
    mode: READ_WRITE
    type: PERSISTENT
  machineType: e2-standard-2
  networkInterfaces:
  - accessConfigs:
    - kind: compute#accessConfig
      name: external-nat
      type: ONE_TO_ONE_NAT
    network: https://compute.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://compute.googleapis.com/compute/v1/projects/myproject/global/instanceTemplates/example-template

API

Senden Sie zum Erstellen einer Instanzvorlage eine POST-Anfrage an die Methode instanceTemplates.insert:

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

Ersetzen Sie PROJECT_ID durch die Projekt-ID.

Geben Sie im Anfragetext die Vorlagenattribute an:

{
  "name": "INSTANCE_TEMPLATE_NAME"
  "properties": {
    "machineType": "zones/ZONE/machineTypes/MACHINE_TYPE",
    "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/IMAGE_PROJECT/global/images/IMAGE"
        }
      }
    ]
  }
}

Dabei gilt:

  • INSTANCE_TEMPLATE_NAME: der Name der Instanzvorlage
  • ZONE: Die Zone, in der sich die VMs befinden
  • MACHINE_TYPE: der Maschinentyp der VMs

  • IMAGE_PROJECT: das Image-Projekt, das das Image enthält

    Weitere Informationen zu öffentlichen Images finden Sie unter Öffentliche Images.

  • Für IMAGE oder IMAGE_FAMILY muss eine der folgenden Optionen angegeben werden:
    • IMAGE: Eine bestimmte Version des Images

      Beispiel: "sourceImage": "projects/debian-cloud/global/images/debian-10-buster-v20200309"

    • IMAGE_FAMILY ist eine Image-Familie.

      Dadurch wird die VM aus dem neuesten nicht verworfenen Betriebssystem-Image erstellt. Wenn Sie beispielsweise "sourceImage": "projects/debian-cloud/global/images/family/debian-10" angeben, legt Compute Engine eine VM aus der neuesten Version des Betriebssystem-Images in der Debian 10-Image-Familie an.

      Weitere Informationen zu Image-Familien finden Sie unter Best Practices für die Verwendung von Image-Familien in Compute Engine.

Sie können eine der folgenden Optionen für das Attribut disks angeben:

  • Geben Sie initializeParams an, um nichtflüchtige Bootlaufwerke für jede Instanz zu erstellen. Sie können bis zu 15 sekundäre Nicht-Bootlaufwerke hinzufügen. Geben Sie dazu für jedes zusätzliche Laufwerk das Attribut initializeParams an. Sie können Laufwerke mithilfe von öffentlichen oder benutzerdefinierten Images (oder Image-Familien) im sourceImage erstellen, wie im vorherigen Beispiel gezeigt. Wenn Sie leere Laufwerke hinzufügen möchten, geben Sie kein sourceImage an.

  • Geben Sie source an, um ein vorhandenes nichtflüchtiges Bootlaufwerk anzuhängen. Wenn Sie ein vorhandenes Bootlaufwerk anhängen, können Sie aus Ihrer Vorlage nur eine Instanz erstellen.

Optional können Sie die Attribute diskSizeGb, diskType undlabels für initializeParams und das Attribut diskSizeGb für source angeben.

Wenn Sie ein Image ausgewählt haben, das Shielded VM unterstützt, können Sie optional die Shielded VM-Einstellungen der VM mit den folgenden booleschen Anfragetextelementen ändern:

  • enableSecureBoot: aktiviert oder deaktiviert Secure Boot

    Mit Secure Boot können Sie Ihre VM-Instanzen vor Malware und Rootkits auf Boot- und Kernelebene schützen. Weitere Informationen finden Sie unter Secure Boot.

  • enableVtpm: Aktiviert oder deaktiviert das Virtual Trusted Platform Module (vTPM)

    Durch das vTPM wird Measured Boot aktiviert, das die Integrität der VM vor und während des Startens überprüft. Weitere Informationen finden Sie unter Virtual Trusted Platform Module (vTPM).

    Beim Deaktivieren des vTPM wird auch die Integritätsüberwachung deaktiviert, da dies auf Daten basiert, die von Measured Boot erfasst werden.

  • enableIntegrityMonitoring: aktiviert oder deaktiviert Integritätsüberwachung

    Mit dem Integritätsmonitoring können Sie die Integrität beim Booten der Laufzeit Ihrer Shielded VM-Instanzen mithilfe von Cloud Monitoring-Berichten beobachten und prüfen. Weitere Informationen finden Sie unter Integritätsüberwachung.

Weitere Informationen zu Anfrageparametern finden Sie unter der Methode instanceTemplates.insert.

Terraform

Sie können eine Terraform-Ressource verwenden, um eine Instanzvorlage zu erstellen.

Das folgende Terraform-Beispiel ähnelt dem folgenden gcloud CLI-Befehl:

gcloud compute instance-templates create my-instance-template \
    --machine-type=e2-standard-4 \
    --image-family=debian-9 \
    --image-project=debian-cloud \
    --boot-disk-size=250GB
resource "google_compute_instance_template" "foobar" {
  name         = "my-instance-template"
  machine_type = "e2-standard-4"

  disk {
    source_image = "debian-cloud/debian-11"
    disk_size_gb = 250
  }

  network_interface {
    network = "default"

    # secret default
    access_config {
      network_tier = "PREMIUM"
    }
  }

  # secret default
  service_account {
    scopes = [
      "https://www.googleapis.com/auth/devstorage.read_only",
      "https://www.googleapis.com/auth/logging.write",
      "https://www.googleapis.com/auth/monitoring.write",
      "https://www.googleapis.com/auth/pubsub",
      "https://www.googleapis.com/auth/service.management.readonly",
      "https://www.googleapis.com/auth/servicecontrol",
      "https://www.googleapis.com/auth/trace.append",
    ]
  }
}

Go

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	computepb "google.golang.org/genproto/googleapis/cloud/compute/v1"
	"google.golang.org/protobuf/proto"
)

// createTemplate creates a new instance template with the provided name and a specific instance configuration.
func createTemplate(w io.Writer, projectID, templateName string) error {
	// projectID := "your_project_id"
	// templateName := "your_template_name"

	ctx := context.Background()
	instanceTemplatesClient, err := compute.NewInstanceTemplatesRESTClient(ctx)
	if err != nil {
		return fmt.Errorf("NewInstanceTemplatesRESTClient: %v", err)
	}
	defer instanceTemplatesClient.Close()

	req := &computepb.InsertInstanceTemplateRequest{
		Project: projectID,
		InstanceTemplateResource: &computepb.InstanceTemplate{
			Name: proto.String(templateName),
			Properties: &computepb.InstanceProperties{
				// The template describes the size and source image of the boot disk
				// to attach to the instance.
				Disks: []*computepb.AttachedDisk{
					{
						InitializeParams: &computepb.AttachedDiskInitializeParams{
							DiskSizeGb:  proto.Int64(250),
							SourceImage: proto.String("projects/debian-cloud/global/images/family/debian-11"),
						},
						AutoDelete: proto.Bool(true),
						Boot:       proto.Bool(true),
					},
				},
				MachineType: proto.String("e2-standard-4"),
				// The template connects the instance to the `default` network,
				// without specifying a subnetwork.
				NetworkInterfaces: []*computepb.NetworkInterface{
					{
						Name: proto.String("global/networks/default"),
						// The template lets the instance use an external IP address.
						AccessConfigs: []*computepb.AccessConfig{
							{
								Name:        proto.String("External NAT"),
								Type:        proto.String(computepb.AccessConfig_ONE_TO_ONE_NAT.String()),
								NetworkTier: proto.String(computepb.AccessConfig_PREMIUM.String()),
							},
						},
					},
				},
			},
		},
	}

	op, err := instanceTemplatesClient.Insert(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to create instance template: %v", err)
	}

	if err = op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %v", err)
	}

	fmt.Fprintf(w, "Instance template created\n")

	return nil
}

Java

import com.google.cloud.compute.v1.AccessConfig;
import com.google.cloud.compute.v1.AccessConfig.NetworkTier;
import com.google.cloud.compute.v1.AttachedDisk;
import com.google.cloud.compute.v1.AttachedDiskInitializeParams;
import com.google.cloud.compute.v1.GlobalOperationsClient;
import com.google.cloud.compute.v1.InsertInstanceTemplateRequest;
import com.google.cloud.compute.v1.InstanceProperties;
import com.google.cloud.compute.v1.InstanceTemplate;
import com.google.cloud.compute.v1.InstanceTemplatesClient;
import com.google.cloud.compute.v1.NetworkInterface;
import com.google.cloud.compute.v1.Operation;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class CreateInstanceTemplate {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // projectId: project ID or project number of the Cloud project you use.
    // templateName: name of the new template to create.
    String projectId = "your-project-id";
    String templateName = "template-name";
    createInstanceTemplate(projectId, templateName);
  }

  /*
    Create a new instance template with the provided name and a specific
    instance configuration.
   */
  public static void createInstanceTemplate(String projectId, String templateName)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    try (InstanceTemplatesClient instanceTemplatesClient = InstanceTemplatesClient.create()) {

      String machineType = "e2-standard-4";
      String sourceImage = "projects/debian-cloud/global/images/family/debian-11";

      // The template describes the size and source image of the boot disk
      // to attach to the instance.
      AttachedDisk attachedDisk = AttachedDisk.newBuilder()
          .setInitializeParams(AttachedDiskInitializeParams.newBuilder()
              .setSourceImage(sourceImage)
              .setDiskSizeGb(250).build())
          .setAutoDelete(true)
          .setBoot(true).build();

      // The template connects the instance to the `default` network,
      // without specifying a subnetwork.
      NetworkInterface networkInterface = NetworkInterface.newBuilder()
          .setName("global/networks/default")
          // The template lets the instance use an external IP address.
          .addAccessConfigs(AccessConfig.newBuilder()
              .setName("External NAT")
              .setType(AccessConfig.Type.ONE_TO_ONE_NAT.toString())
              .setNetworkTier(NetworkTier.PREMIUM.toString()).build()).build();

      InstanceProperties instanceProperties = InstanceProperties.newBuilder()
          .addDisks(attachedDisk)
          .setMachineType(machineType)
          .addNetworkInterfaces(networkInterface).build();

      InsertInstanceTemplateRequest insertInstanceTemplateRequest = InsertInstanceTemplateRequest
          .newBuilder()
          .setProject(projectId)
          .setInstanceTemplateResource(InstanceTemplate.newBuilder()
              .setName(templateName)
              .setProperties(instanceProperties).build()).build();

      // Create the Instance Template.
      Operation response = instanceTemplatesClient.insertAsync(insertInstanceTemplateRequest)
          .get(3, TimeUnit.MINUTES);

      if (response.hasError()) {
        System.out.println("Instance Template creation failed ! ! " + response);
        return;
      }
      System.out
          .printf("Instance Template Operation Status %s: %s", templateName, response.getStatus());
    }
  }

  public static void createInstanceTemplateWithDiskType(String projectId, String templateName)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    try (InstanceTemplatesClient instanceTemplatesClient = InstanceTemplatesClient.create();
        GlobalOperationsClient globalOperationsClient = GlobalOperationsClient.create()) {

      AttachedDisk disk = AttachedDisk.newBuilder()
          .setInitializeParams(AttachedDiskInitializeParams.newBuilder()
              .setDiskSizeGb(10)
              .setSourceImage("projects/debian-cloud/global/images/family/debian-10").build())
          .setAutoDelete(true)
          .setBoot(true)
          .setType(AttachedDisk.Type.PERSISTENT.toString()).build();

      InstanceTemplate instanceTemplate = InstanceTemplate.newBuilder()
          .setName(templateName)
          .setProperties(InstanceProperties.newBuilder()
              .setMachineType("n1-standard-1")
              .addDisks(disk)
              .addNetworkInterfaces(NetworkInterface.newBuilder()
                  .setName("global/networks/default").build()).build()).build();

      InsertInstanceTemplateRequest insertInstanceTemplateRequest = InsertInstanceTemplateRequest
          .newBuilder()
          .setProject(projectId)
          .setInstanceTemplateResource(instanceTemplate).build();

      Operation response = instanceTemplatesClient.insertAsync(insertInstanceTemplateRequest)
          .get(3, TimeUnit.MINUTES);

      if (response.hasError()) {
        System.out.println("Instance Template creation failed ! ! " + response);
        return;
      }
      System.out
          .printf("Instance Template Operation Status %s: %s", templateName, response.getStatus());
    }
  }
}

Node.js

/**
 * TODO(developer): Uncomment and replace these variables before running the sample.
 */
// const projectId = 'YOUR_PROJECT_ID';
// const templateName = 'your_template_name';

const compute = require('@google-cloud/compute');

// Create a new instance template with the provided name and a specific instance configuration.
async function createTemplate() {
  const instanceTemplatesClient = new compute.InstanceTemplatesClient();

  const [response] = await instanceTemplatesClient.insert({
    project: projectId,
    instanceTemplateResource: {
      name: templateName,
      properties: {
        disks: [
          {
            // The template describes the size and source image of the boot disk
            // to attach to the instance.
            initializeParams: {
              diskSizeGb: '250',
              sourceImage:
                'projects/debian-cloud/global/images/family/debian-11',
            },
            autoDelete: true,
            boot: true,
          },
        ],
        machineType: 'e2-standard-4',
        // The template connects the instance to the `default` network,
        // without specifying a subnetwork.
        networkInterfaces: [
          {
            // Use the network interface provided in the networkName argument.
            name: 'global/networks/default',
            // The template lets the instance use an external IP address.
            accessConfigs: [
              {
                name: 'External NAT',
                type: 'ONE_TO_ONE_NAT',
                networkTier: 'PREMIUM',
              },
            ],
          },
        ],
      },
    },
  });
  let operation = response.latestResponse;
  const operationsClient = new compute.GlobalOperationsClient();

  // Wait for the create operation to complete.
  while (operation.status !== 'DONE') {
    [operation] = await operationsClient.wait({
      operation: operation.name,
      project: projectId,
    });
  }

  console.log('Instance template created.');
}

createTemplate();

Python

import sys
from typing import Any

from google.api_core.extended_operation import ExtendedOperation
from google.cloud import compute_v1

def wait_for_extended_operation(
    operation: ExtendedOperation, verbose_name: str = "operation", timeout: int = 300
) -> Any:
    """
    This method will wait for the extended (long-running) operation to
    complete. If the operation is successful, it will return its result.
    If the operation ends with an error, an exception will be raised.
    If there were any warnings during the execution of the operation
    they will be printed to sys.stderr.

    Args:
        operation: a long-running operation you want to wait on.
        verbose_name: (optional) a more verbose name of the operation,
            used only during error and warning reporting.
        timeout: how long (in seconds) to wait for operation to finish.
            If None, wait indefinitely.

    Returns:
        Whatever the operation.result() returns.

    Raises:
        This method will raise the exception received from `operation.exception()`
        or RuntimeError if there is no exception set, but there is an `error_code`
        set for the `operation`.

        In case of an operation taking longer than `timeout` seconds to complete,
        a `concurrent.futures.TimeoutError` will be raised.
    """
    result = operation.result(timeout=timeout)

    if operation.error_code:
        print(
            f"Error during {verbose_name}: [Code: {operation.error_code}]: {operation.error_message}",
            file=sys.stderr,
            flush=True,
        )
        print(f"Operation ID: {operation.name}", file=sys.stderr, flush=True)
        raise operation.exception() or RuntimeError(operation.error_message)

    if operation.warnings:
        print(f"Warnings during {verbose_name}:\n", file=sys.stderr, flush=True)
        for warning in operation.warnings:
            print(f" - {warning.code}: {warning.message}", file=sys.stderr, flush=True)

    return result

def create_template(project_id: str, template_name: str) -> compute_v1.InstanceTemplate:
    """
    Create a new instance template with the provided name and a specific
    instance configuration.

    Args:
        project_id: project ID or project number of the Cloud project you use.
        template_name: name of the new template to create.

    Returns:
        InstanceTemplate object that represents the new instance template.
    """
    # The template describes the size and source image of the boot disk
    # to attach to the instance.
    disk = compute_v1.AttachedDisk()
    initialize_params = compute_v1.AttachedDiskInitializeParams()
    initialize_params.source_image = (
        "projects/debian-cloud/global/images/family/debian-11"
    )
    initialize_params.disk_size_gb = 250
    disk.initialize_params = initialize_params
    disk.auto_delete = True
    disk.boot = True

    # The template connects the instance to the `default` network,
    # without specifying a subnetwork.
    network_interface = compute_v1.NetworkInterface()
    network_interface.name = "global/networks/default"

    # The template lets the instance use an external IP address.
    access_config = compute_v1.AccessConfig()
    access_config.name = "External NAT"
    access_config.type_ = "ONE_TO_ONE_NAT"
    access_config.network_tier = "PREMIUM"
    network_interface.access_configs = [access_config]

    template = compute_v1.InstanceTemplate()
    template.name = template_name
    template.properties.disks = [disk]
    template.properties.machine_type = "e2-standard-4"
    template.properties.network_interfaces = [network_interface]

    template_client = compute_v1.InstanceTemplatesClient()
    operation = template_client.insert(
        project=project_id, instance_template_resource=template
    )

    wait_for_extended_operation(operation, "instance template creation")

    return template_client.get(project=project_id, instance_template=template_name)

Instanzvorlage auf Basis einer vorhandenen Instanz erstellen

Mit der Compute Engine API oder der gcloud CLI können Sie die Konfiguration einer vorhandenen VM-Instanz als Instanzvorlage speichern. Die Definition der Quelllaufwerke in der Vorlage kann optional überschrieben werden.

Wenn Sie andere Attribute überschreiben müssen, erstellen Sie zuerst eine Instanzvorlage auf der Grundlage einer vorhandenen Instanz und dann eine ähnliche Vorlage mit den gewünschten Überschreibungen.

gcloud

Verwenden Sie den Befehl gcloud instance-templates create mit den Flags --source-instance und --source-instance-zone.

gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME \
    --source-instance=SOURCE_INSTANCE \
    --source-instance-zone=SOURCE_INSTANCE_ZONE \

Fügen Sie ein oder mehrere --configure-disk-Flags hinzu, um die Definition der Laufwerke der Quellinstanz zu überschreiben:

gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME \
    --source-instance=SOURCE_INSTANCE \
    --source-instance-zone=SOURCE_INSTANCE_ZONE \
    --configure-disk= \
        device-name=SOURCE_DISK, \
        instantiate-from=INSTANTIATE_OPTIONS, \
        auto-delete=AUTO_DELETE

Dabei gilt:

  • INSTANCE_TEMPLATE_NAME der Name der zu erstellenden Vorlage ist.
  • SOURCE_INSTANCE ist der Name der Instanz, die als Modell für die neue Vorlage verwendet werden soll.
  • SOURCE_INSTANCE_ZONE ist die Zone, die die Quellinstanz enthält.
  • SOURCE_DISK der Name eines Laufwerks der Quellinstanz ist, das Sie in der Vorlage überschreiben möchten.
  • INSTANTIATE_OPTIONS gibt an, ob das Laufwerk mit aufgenommen und welches Image verwendet werden soll. Gültige Werte sind vom Laufwerkstyp abhängig:

    • source-image oder source-image-family (nur für Boot- und andere nichtflüchtige Laufwerke mit Lese-/Schreibzugriff gültig). Geben Sie diese Option an, wenn Sie dasselbe Quell-Image oder dieselbe Quell-Image-Familie verwenden möchten, mit der das Laufwerk in der Quell-VM-Instanz erstellt wurde.
    • custom-image (nur für Boot- und andere nichtflüchtige Laufwerke mit Lese-/Schreibzugriff gültig). Wenn Sie Anwendungen und Einstellungen von den Quell-VMs in Ihrer Instanzvorlage beibehalten möchten, können Sie ein benutzerdefiniertes Image erstellen und dann beim Erstellen der Vorlage angeben. Wenn angegeben, geben Sie den Pfad oder die URL für das benutzerdefinierte Image an, wie im folgenden Beispiel gezeigt. Alternativ können Sie eine Image-Familie auch im folgenden Format angeben:

      --configure-disk=device-name=DATA_DISK_NAME,instantiate-from=custom-image,
      custom-image=projects/PROJECT_ID/global/images/family/IMAGE_FAMILY_NAME

    • attach-read-only (nur für schreibgeschützte Laufwerke gültig).

    • blank (nur für nichtflüchtige Speicher, bei denen es sich nicht um ein Bootlaufwerk handelt, und lokale SSDs gültig). Ist dieser Wert angegeben und dient die Vorlage zum Erstellen einer neuen Instanz, wird das Laufwerk unformatiert erstellt. Sie müssen das Laufwerk in einem Startskript formatieren und bereitstellen, bevor Sie es in einer skalierbaren Konfiguration verwenden können.

    • do-not-include (nur für nichtflüchtige Speicher, bei denen es sich nicht um ein Bootlaufwerk handelt, und schreibgeschützte Laufwerke gültig).

  • AUTO_DELETE gibt an, ob das Laufwerk automatisch gelöscht wird, sobald die Instanz gelöscht wird. Gültige Werte sind false, no, true und yes.

Mit folgendem Befehl wird beispielsweise eine Instanzvorlage auf der Basis von my-source-instance erstellt, mit der Option, das ursprüngliche Image von data-disk-a zu verwenden, aber mit true für automatisches Löschen. Außerdem wird data-disk-b durch ein benutzerdefiniertes Image ersetzt.

gcloud compute instance-templates create my-instance-template  \
    --source-instance=my-source-instance \
    --configure-disk=device-name=data-disk-a,instantiate-from=source-image, \
      auto-delete=true
    --configure-disk=device-name=data-disk-b,instantiate-from=custom-image, \
      custom-image=projects/cps-cloud/global/images/cos-89-16108-403-15

API

Rufen Sie die Methode instanceTemplates.insert auf und geben Sie das Feld sourceInstance an. Wenn Sie die Definition der Laufwerke der Quellinstanz überschreiben möchten, fügen Sie ein oder mehrere diskConfigs-Felder hinzu.

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

{
  "name": "INSTANCE_TEMPLATE_NAME",
  "sourceInstance": "zones/SOURCE_INSTANCE_ZONE/instances/SOURCE_INSTANCE",
  "sourceInstanceParams": {
    "diskConfigs": [
      {
        "deviceName": "SOURCE_DISK",
        "instantiateFrom": "INSTANTIATE_OPTIONS",
        "autoDelete": false
      }
    ]
  }
}

Dabei gilt:

  • PROJECT_ID: die Projekt-ID für die Anfrage.
  • INSTANCE_TEMPLATE_NAME: Der Name der neuen Vorlage.
  • SOURCE_INSTANCE_ZONE ist die Zone der Quellinstanz.
  • SOURCE_INSTANCE: der Name der Quellinstanz, die als Modell für diese Instanzvorlage verwendet werden soll.
  • SOURCE_DISK: der Name eines Laufwerks der Quellinstanz, das Sie in der Vorlage überschreiben möchten.
  • INSTANTIATE_OPTIONS: gibt an, ob das Laufwerk mit aufgenommen und welches Image verwendet werden soll.

    Gültige Werte sind vom Laufwerkstyp abhängig:

    • source-image oder source-image-family (nur für Boot- und andere nichtflüchtige Laufwerke mit Lese-/Schreibzugriff gültig).
    • custom-image (nur für Boot- und andere nichtflüchtige Laufwerke mit Lese-/Schreibzugriff gültig). Wenn Sie Anwendungen und Einstellungen von den Quell-VMs in Ihrer Instanzvorlage beibehalten möchten, können Sie ein benutzerdefiniertes Image erstellen und dann beim Erstellen der Vorlage angeben. Wenn angegeben, geben Sie den Pfad oder die URL für das benutzerdefinierte Image an, wie im folgenden Beispiel gezeigt. Alternativ können Sie eine Image-Familie auch im folgenden Format angeben:

      --configure-disk=device-name=DATA_DISK_NAME,instantiate-from=custom-image,
      custom-image=projects/PROJECT_ID/global/images/family/IMAGE_FAMILY_NAME

    • attach-read-only (nur für schreibgeschützte Laufwerke gültig).

    • blank (nur für nichtflüchtige Speicher, bei denen es sich nicht um ein Bootlaufwerk handelt, und lokale SSDs gültig). Ist dieser Wert angegeben und dient die Vorlage zum Erstellen einer neuen Instanz, wird das Laufwerk unformatiert erstellt. Sie müssen das Laufwerk in einem Startskript formatieren und bereitstellen, bevor Sie es in einer skalierbaren Konfiguration verwenden können.

    • do-not-include (nur für nichtflüchtige Speicher, bei denen es sich nicht um ein Bootlaufwerk handelt, und schreibgeschützte Laufwerke gültig).

Im folgenden Beispiel wird eine neue Instanzvorlage auf der Basis von my-source-instance erstellt. In der Instanzvorlage wird das Image für data-disk-a durch projects/cos-cloud/global/images/cos-89-16108-403-15 ersetzt.

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

{
  "name": "my-instance-template",
  "sourceInstance": "zones/us-central1-a/instances/my-source-instance",
  "sourceInstanceParams":
  {
    "diskConfigs":
    [
      {
        "deviceName": "data-disk-a",
        "instantiateFrom": "custom-image",
        "customImage": "projects/cos-cloud/global/images/cos-89-16108-403-15"
      }
    ]
  }
}

Go

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	computepb "google.golang.org/genproto/googleapis/cloud/compute/v1"
	"google.golang.org/protobuf/proto"
)

// createTemplateFromInstance creates a new instance template based on an existing instance.
// This new template specifies a different boot disk.
func createTemplateFromInstance(w io.Writer, projectID, instance, templateName string) error {
	// projectID := "your_project_id"
	// instance := "projects/project/zones/zone/instances/instance"
	// templateName := "your_template_name"

	ctx := context.Background()
	instanceTemplatesClient, err := compute.NewInstanceTemplatesRESTClient(ctx)
	if err != nil {
		return fmt.Errorf("NewInstanceTemplatesRESTClient: %v", err)
	}
	defer instanceTemplatesClient.Close()

	req := &computepb.InsertInstanceTemplateRequest{
		Project: projectID,
		InstanceTemplateResource: &computepb.InstanceTemplate{
			Name:           proto.String(templateName),
			SourceInstance: proto.String(instance),
			SourceInstanceParams: &computepb.SourceInstanceParams{
				DiskConfigs: []*computepb.DiskInstantiationConfig{
					{
						// Device name must match the name of a disk attached to the instance
						// your template is based on.
						DeviceName: proto.String("disk-1"),
						// Replace the original boot disk image used in your instance with a Rocky Linux image.
						InstantiateFrom: proto.String(computepb.DiskInstantiationConfig_CUSTOM_IMAGE.String()),
						CustomImage:     proto.String("projects/rocky-linux-cloud/global/images/family/rocky-linux-8"),
						// Override the auto_delete setting.
						AutoDelete: proto.Bool(true),
					},
				},
			},
		},
	}

	op, err := instanceTemplatesClient.Insert(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to create instance template: %v", err)
	}

	if err = op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %v", err)
	}

	fmt.Fprintf(w, "Instance template created\n")

	return nil
}

Java


import com.google.cloud.compute.v1.DiskInstantiationConfig;
import com.google.cloud.compute.v1.DiskInstantiationConfig.InstantiateFrom;
import com.google.cloud.compute.v1.GlobalOperationsClient;
import com.google.cloud.compute.v1.InsertInstanceTemplateRequest;
import com.google.cloud.compute.v1.InstanceTemplate;
import com.google.cloud.compute.v1.InstanceTemplatesClient;
import com.google.cloud.compute.v1.Operation;
import com.google.cloud.compute.v1.SourceInstanceParams;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class CreateTemplateFromInstance {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // projectId: project ID or project number of the Cloud project you use.
    // instance: the instance to base the new template on. This value uses the following format:
    // **NOTE**: "projects/{project}/zones/{zone}/instances/{instance_name}"
    // templateName: name of the new template to create.
    String projectId = "your-project-id";
    String templateName = "template-name";
    String instance = String.format("projects/%s/zones/%s/instances/%s", projectId, "zone",
        "instanceName");
    createTemplateFromInstance(projectId, templateName, instance);
  }

  // Create a new instance template based on an existing instance.
  // This new template specifies a different boot disk.
  public static void createTemplateFromInstance(String projectId, String templateName,
      String instance)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    try (InstanceTemplatesClient instanceTemplatesClient = InstanceTemplatesClient.create();
        GlobalOperationsClient globalOperationsClient = GlobalOperationsClient.create()) {

      SourceInstanceParams sourceInstanceParams = SourceInstanceParams.newBuilder()
          .addDiskConfigs(DiskInstantiationConfig.newBuilder()
              // Device name must match the name of a disk attached to the instance you are
              // basing your template on.
              .setDeviceName("disk-1")
              // Replace the original boot disk image used in your instance
              // with a Rocky Linux image.
              .setInstantiateFrom(InstantiateFrom.CUSTOM_IMAGE.toString())
              .setCustomImage(
                  String.format("projects/%s/global/images/family/%s", "rocky-linux-cloud",
                      "rocky-linux-8"))
              // Override the AutoDelete setting.
              .setAutoDelete(true).build())
          .build();

      InstanceTemplate instanceTemplate = InstanceTemplate.newBuilder()
          .setName(templateName)
          .setSourceInstance(instance)
          .setSourceInstanceParams(sourceInstanceParams)
          .build();

      InsertInstanceTemplateRequest insertInstanceTemplateRequest = InsertInstanceTemplateRequest
          .newBuilder()
          .setProject(projectId)
          .setInstanceTemplateResource(instanceTemplate)
          .build();

      Operation operation = instanceTemplatesClient.insertCallable()
          .futureCall(insertInstanceTemplateRequest).get(3, TimeUnit.MINUTES);

      Operation response = globalOperationsClient.wait(projectId, operation.getName());

      if (response.hasError()) {
        System.out.println("Instance Template creation failed ! ! " + response);
        return;
      }
      System.out.printf("Instance Template creation operation status %s: %s", templateName,
          response.getStatus());
    }
  }
}

Node.js

/**
 * TODO(developer): Uncomment and replace these variables before running the sample.
 */
// const projectId = 'YOUR_PROJECT_ID';
// const instance = 'projects/project/zones/zone/instances/instance';
// const templateName = 'your_template_name';

const compute = require('@google-cloud/compute');

// Create a new instance template based on an existing instance.
// This new template specifies a different boot disk.
async function createTemplateFromInstance() {
  const instanceTemplatesClient = new compute.InstanceTemplatesClient();

  const [response] = await instanceTemplatesClient.insert({
    project: projectId,
    instanceTemplateResource: {
      name: templateName,
      sourceInstance: instance,
      sourceInstanceParams: {
        diskConfigs: [
          {
            // Device name must match the name of a disk attached to the instance
            // your template is based on.
            deviceName: 'disk-1',
            // Replace the original boot disk image used in your instance with a Rocky Linux image.
            instantiateFrom: 'CUSTOM_IMAGE',
            customImage:
              'projects/rocky-linux-cloud/global/images/family/rocky-linux-8',
            // Override the auto_delete setting.
            autoDelete: true,
          },
        ],
      },
    },
  });
  let operation = response.latestResponse;
  const operationsClient = new compute.GlobalOperationsClient();

  // Wait for the create operation to complete.
  while (operation.status !== 'DONE') {
    [operation] = await operationsClient.wait({
      operation: operation.name,
      project: projectId,
    });
  }

  console.log('Instance template created.');
}

createTemplateFromInstance();

Python

import sys
from typing import Any

from google.api_core.extended_operation import ExtendedOperation
from google.cloud import compute_v1

def wait_for_extended_operation(
    operation: ExtendedOperation, verbose_name: str = "operation", timeout: int = 300
) -> Any:
    """
    This method will wait for the extended (long-running) operation to
    complete. If the operation is successful, it will return its result.
    If the operation ends with an error, an exception will be raised.
    If there were any warnings during the execution of the operation
    they will be printed to sys.stderr.

    Args:
        operation: a long-running operation you want to wait on.
        verbose_name: (optional) a more verbose name of the operation,
            used only during error and warning reporting.
        timeout: how long (in seconds) to wait for operation to finish.
            If None, wait indefinitely.

    Returns:
        Whatever the operation.result() returns.

    Raises:
        This method will raise the exception received from `operation.exception()`
        or RuntimeError if there is no exception set, but there is an `error_code`
        set for the `operation`.

        In case of an operation taking longer than `timeout` seconds to complete,
        a `concurrent.futures.TimeoutError` will be raised.
    """
    result = operation.result(timeout=timeout)

    if operation.error_code:
        print(
            f"Error during {verbose_name}: [Code: {operation.error_code}]: {operation.error_message}",
            file=sys.stderr,
            flush=True,
        )
        print(f"Operation ID: {operation.name}", file=sys.stderr, flush=True)
        raise operation.exception() or RuntimeError(operation.error_message)

    if operation.warnings:
        print(f"Warnings during {verbose_name}:\n", file=sys.stderr, flush=True)
        for warning in operation.warnings:
            print(f" - {warning.code}: {warning.message}", file=sys.stderr, flush=True)

    return result

def create_template_from_instance(
    project_id: str, instance: str, template_name: str
) -> compute_v1.InstanceTemplate:
    """
    Create a new instance template based on an existing instance.
    This new template specifies a different boot disk.

    Args:
        project_id: project ID or project number of the Cloud project you use.
        instance: the instance to base the new template on. This value uses
            the following format: "projects/{project}/zones/{zone}/instances/{instance_name}"
        template_name: name of the new template to create.

    Returns:
        InstanceTemplate object that represents the new instance template.
    """
    disk = compute_v1.DiskInstantiationConfig()
    # Device name must match the name of a disk attached to the instance you are
    # basing your template on.
    disk.device_name = "disk-1"
    # Replace the original boot disk image used in your instance with a Rocky Linux image.
    disk.instantiate_from = "CUSTOM_IMAGE"
    disk.custom_image = "projects/rocky-linux-cloud/global/images/family/rocky-linux-8"
    # Override the auto_delete setting.
    disk.auto_delete = True

    template = compute_v1.InstanceTemplate()
    template.name = template_name
    template.source_instance = instance
    template.source_instance_params = compute_v1.SourceInstanceParams()
    template.source_instance_params.disk_configs = [disk]

    template_client = compute_v1.InstanceTemplatesClient()
    operation = template_client.insert(
        project=project_id, instance_template_resource=template
    )

    wait_for_extended_operation(operation, "instance template creation")

    return template_client.get(project=project_id, instance_template=template_name)

Folgende Tabelle zeigt, wie die Optionen zum Überschreiben von Laufwerken in der Vorlage definiert sind.

Laufwerkstyp Optionen
Bootlaufwerk
  • [Standard] Dasselbe Quell-Image oder dieselbe Image-Familie wie zum Erstellen des Bootlaufwerks auf der Quellinstanz verwenden.
  • Verwenden Sie die URL eines beliebigen benutzerdefinierten oder öffentlichen Images, wie im vorherigen Beispiel beschrieben, oder geben Sie eine Image-Familie im folgenden Format an:

    projects/exampleproject/global/images/family/IMAGE_FAMILY_NAME

Andere nichtflüchtige Speicher mit Lese-/Schreibzugriff
  • [Standard] Dasselbe Quell-Image oder dieselbe Image-Familie wie zum Erstellen des Bootlaufwerks auf der Quellinstanz verwenden. Hinweis: Wenn das Laufwerk der Quellinstanz kein Attribut für Quell-Image-/Quell-Image-Familie hat, wird es als leeres Laufwerk in die Vorlage aufgenommen.
  • Verwenden Sie die URL eines beliebigen benutzerdefinierten oder öffentlichen Images, wie im vorherigen Beispiel beschrieben, oder geben Sie eine Image-Familie im folgenden Format an:

    projects/exampleproject/global/images/family/IMAGE_FAMILY_NAME

  • Stattdessen ein leeres Laufwerk in der Vorlage verwenden. Dient die Vorlage zum Erstellen einer neuen Instanz, wird das Laufwerk unformatiert erstellt. Sie müssen das Laufwerk in einem Startskript formatieren und bereitstellen, bevor Sie es in einer skalierbaren Konfiguration verwenden können.
  • Das Laufwerk nicht mit aufnehmen.
Schreibgeschützte Laufwerke
  • [Standard] Das Laufwerk im schreibgeschützten Modus aufnehmen.
  • Das Laufwerk nicht mit aufnehmen.
Lokale SSD(s)
  • [Standard] Eine leere lokale SSD mit aufnehmen. Dient die Vorlage zum Erstellen einer neuen Instanz, wird das Laufwerk unformatiert erstellt. Sie müssen das Laufwerk in einem Startskript formatieren und bereitstellen, bevor Sie es in einer skalierbaren Konfiguration verwenden können.

Sie können für jedes Laufwerk auch das Attribut auto-delete überschreiben und angeben, ob das Laufwerk gelöscht oder nicht gelöscht werden soll, wenn die zugehörige Instanz gelöscht wird.

Wenn keine Optionen zum Überschreiben angegeben sind, entspricht die Laufwerkskonfiguration in der Vorlage standardmäßig der Quellinstanz.

Instanzvorlage auf Basis einer vorhandenen Vorlage erstellen

Sie können eine vorhandene Instanzvorlage nicht aktualisieren. Wenn eine Instanzvorlage jedoch veraltet ist oder Sie Änderungen vornehmen müssen, können Sie über die Konsole eine andere mit ähnlichen Attributen erstellen.

  1. Zur Seite Instanzvorlagen.

    Zu Instanzvorlagen

  2. Klicken Sie auf die Instanzvorlage, die Sie kopieren und aktualisieren möchten.

  3. Klicken Sie auf Ähnliche erstellen.

  4. Aktualisieren Sie die Konfiguration in der neuen Vorlage.

  5. Klicken Sie auf Erstellen.

Instanzvorlage mit einem Container-Image erstellen

Sie können ein Container-Image in einer Instanzvorlage angeben. Standardmäßig enthält Compute Engine in der Vorlage auch ein Container-Optimized OS-Image mit installiertem Docker. Wenn Sie die Vorlage zum Erstellen einer neuen Instanz verwenden, wird der Container beim Start der Instanz automatisch gestartet.

Console

  1. Rufen Sie die Seite Instanzvorlagen auf.

    Zu Instanzvorlagen

  2. Klicken Sie auf Instanzvorlage erstellen.

  3. Klicken Sie im Abschnitt Container auf Container bereitstellen.

  4. Geben Sie im Dialogfeld Container konfigurieren das zu verwendende Container-Image an.

    • Sie können ein Image aus der Container Registry oder der Artifact Registry angeben. Beispiel:
      • gcr.io/cloud-marketplace/google/nginx1:TAG, wobei TAG das Tag ist, das für eine bestimmte Version des NGINX-Container-Images definiert ist, das auf dem Google Cloud Marketplace verfügbar ist.
      • us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 wählt ein Beispiel-hello-app-Image aus, das in Artifact Registry gespeichert ist.
    • Wenn Sie ein Container-Image von Docker Hub verwenden, geben Sie immer den vollständigen Docker-Image-Namen an. Geben Sie zum Beispiel den folgenden Image-Namen an, um ein Apache-Container-Image bereitzustellen: docker.io/httpd:2.4.
  5. Klicken Sie optional auf Erweiterte Containeroptionen. Weitere Informationen finden Sie unter Optionen zum Ausführen von Containern konfigurieren.

  6. Klicken Sie auf Erstellen.

gcloud

Führen Sie den Befehl gcloud compute instance-templates create-with-container aus:

gcloud compute instance-templates create-with-container INSTANCE_TEMPLATE_NAME \
     --container-image=CONTAINER_IMAGE

Dabei gilt:

  • INSTANCE_TEMPLATE_NAME: Der Name der zu erstellenden Vorlage.
  • CONTAINER_IMAGE: Der vollständige Name des zu verwendenden Container-Images.

Mit dem folgenden Befehl wird beispielsweise eine neue Instanzvorlage mit dem Namen nginx-vm erstellt. Eine aus dieser Vorlage erstellte VM-Instanz startet das Container-Image gcr.io/cloud-marketplace/google/nginx1:TAG und führt es aus, wenn die VM gestartet wird.

gcloud compute instance-templates create-with-container nginx-vm \
     --container-image=gcr.io/cloud-marketplace/google/nginx1:TAG

Ersetzen Sie TAG durch das für eine bestimmte Version des NGINX-Container-Images definierte Tag, das im Google Cloud Marketplace verfügbar ist.

Sie können auch Optionen zum Ausführen des Containers konfigurieren.

Erstellen einer Instanzvorlage, die ein Subnetz spezifiziert

gcloud

Mit dem Flag --subnet können Sie Instanzen, die aus der Vorlage erstellt wurden, in das Subnetz Ihrer Wahl einfügen. Für das Flag --subnet ist das Flag --region erforderlich.

gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME \
  --region=REGION \
  --subnet=SUBNET_NAME_OR_URL

Dabei gilt:

  • INSTANCE_TEMPLATE_NAME: Der Name der Instanzvorlage.
  • REGION: Die Region des Subnetzes.
  • SUBNET_NAME_OR_URL: Entweder der Name des Subnetzes oder seine URL.

Im folgenden Beispiel wird eine Vorlage namens template-qa erstellt, die nur Instanzen im Subnetz subnet-us-qa erstellt.

gcloud compute instance-templates create template-qa \
  --region=us-central1 \
  --subnet=subnet-us-qa

Created [https://compute.googleapis.com/compute/latest/projects/PROJECT_ID/global/instanceTemplates/template-qa].
NAME        MACHINE_TYPE        PREEMPTIBLE CREATION_TIMESTAMP
template-qa e2-standard-2       2019-12-23T20:34:00.791-07:00

Go

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	computepb "google.golang.org/genproto/googleapis/cloud/compute/v1"
	"google.golang.org/protobuf/proto"
)

// createTemplateWithSubnet creates an instance template that uses a provided subnet.
func createTemplateWithSubnet(w io.Writer, projectID, network, subnetwork, templateName string) error {
	// projectID := "your_project_id"
	// network := "projects/project/global/networks/network"
	// subnetwork := "projects/project/regions/region/subnetworks/subnetwork"
	// templateName := "your_template_name"

	ctx := context.Background()
	instanceTemplatesClient, err := compute.NewInstanceTemplatesRESTClient(ctx)
	if err != nil {
		return fmt.Errorf("NewInstanceTemplatesRESTClient: %v", err)
	}
	defer instanceTemplatesClient.Close()

	req := &computepb.InsertInstanceTemplateRequest{
		Project: projectID,
		InstanceTemplateResource: &computepb.InstanceTemplate{
			Name: proto.String(templateName),
			Properties: &computepb.InstanceProperties{
				// The template describes the size and source image of the boot disk
				// to attach to the instance.
				Disks: []*computepb.AttachedDisk{
					{
						InitializeParams: &computepb.AttachedDiskInitializeParams{
							DiskSizeGb:  proto.Int64(250),
							SourceImage: proto.String("projects/debian-cloud/global/images/family/debian-11"),
						},
						AutoDelete: proto.Bool(true),
						Boot:       proto.Bool(true),
					},
				},
				MachineType: proto.String("e2-standard-4"),
				// The template connects the instance to the specified network and subnetwork.
				NetworkInterfaces: []*computepb.NetworkInterface{
					{
						Network:    proto.String(network),
						Subnetwork: proto.String(subnetwork),
					},
				},
			},
		},
	}

	op, err := instanceTemplatesClient.Insert(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to create instance template: %v", err)
	}

	if err = op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %v", err)
	}

	fmt.Fprintf(w, "Instance template created\n")

	return nil
}

Java


import com.google.cloud.compute.v1.AttachedDisk;
import com.google.cloud.compute.v1.AttachedDiskInitializeParams;
import com.google.cloud.compute.v1.GlobalOperationsClient;
import com.google.cloud.compute.v1.InsertInstanceTemplateRequest;
import com.google.cloud.compute.v1.InstanceProperties;
import com.google.cloud.compute.v1.InstanceTemplate;
import com.google.cloud.compute.v1.InstanceTemplatesClient;
import com.google.cloud.compute.v1.NetworkInterface;
import com.google.cloud.compute.v1.Operation;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class CreateTemplateWithSubnet {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    /*
    TODO(developer): Replace these variables before running the sample.
    projectId: project ID or project number of the Cloud project you use.
    network: the network to be used in the new template. This value uses
        the following format: "projects/{project}/global/networks/{network}"
    subnetwork: the subnetwork to be used in the new template. This value
        uses the following format: "projects/{project}/regions/{region}/subnetworks/{subnetwork}"
    templateName: name of the new template to create.
    */
    String projectId = "your-project-id";
    String network = String.format("projects/%s/global/networks/%s", projectId, "network");
    String subnetwork = String.format("projects/%s/regions/%s/subnetworks/%s", projectId, "region",
        "subnetwork");
    String templateName = "template-name";
    createTemplateWithSubnet(projectId, network, subnetwork, templateName);
  }

  // Create an instance template that uses a provided subnet.
  public static void createTemplateWithSubnet(String projectId, String network, String subnetwork,
      String templateName)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    try (InstanceTemplatesClient instanceTemplatesClient = InstanceTemplatesClient.create();
        GlobalOperationsClient globalOperationsClient = GlobalOperationsClient.create()) {

      AttachedDisk disk = AttachedDisk.newBuilder()
          .setInitializeParams(AttachedDiskInitializeParams.newBuilder()
              .setSourceImage(
                  String.format("projects/%s/global/images/family/%s", "debian-cloud", "debian-11"))
              .setDiskSizeGb(250).build())
          .setAutoDelete(true)
          .setBoot(true)
          .build();

      InstanceProperties instanceProperties = InstanceProperties.newBuilder()
          .addDisks(disk)
          .setMachineType("e2-standard-4")
          .addNetworkInterfaces(NetworkInterface.newBuilder()
              .setNetwork(network)
              .setSubnetwork(subnetwork).build())
          .build();

      InstanceTemplate instanceTemplate = InstanceTemplate.newBuilder()
          .setName(templateName)
          .setProperties(instanceProperties)
          .build();

      InsertInstanceTemplateRequest insertInstanceTemplateRequest = InsertInstanceTemplateRequest
          .newBuilder()
          .setProject(projectId)
          .setInstanceTemplateResource(instanceTemplate)
          .build();

      Operation operation = instanceTemplatesClient.insertCallable()
          .futureCall(insertInstanceTemplateRequest).get(3, TimeUnit.MINUTES);

      Operation response = globalOperationsClient.wait(projectId, operation.getName());

      if (response.hasError()) {
        System.out.println("Template creation from subnet failed ! ! " + response);
        return;
      }
      System.out.printf("Template creation from subnet operation status %s: %s", templateName,
          response.getStatus());
    }
  }
}

Node.js

/**
 * TODO(developer): Uncomment and replace these variables before running the sample.
 */
// const projectId = 'YOUR_PROJECT_ID';
// const network = 'projects/project/global/networks/network';
// const subnetwork = 'projects/project/regions/region/subnetworks/subnetwork';
// const templateName = 'your_template_name';

const compute = require('@google-cloud/compute');

// Create an instance template that uses a provided subnet.
async function createTemplateWithSubnet() {
  const instanceTemplatesClient = new compute.InstanceTemplatesClient();

  const [response] = await instanceTemplatesClient.insert({
    project: projectId,
    instanceTemplateResource: {
      name: templateName,
      properties: {
        // The template describes the size and source image of the boot disk
        // to attach to the instance.
        disks: [
          {
            // The template describes the size and source image of the boot disk
            // to attach to the instance.
            initializeParams: {
              diskSizeGb: '250',
              sourceImage:
                'projects/debian-cloud/global/images/family/debian-11',
            },
            autoDelete: true,
            boot: true,
          },
        ],
        machineType: 'e2-standard-4',
        // The template connects the instance to the specified network and subnetwork.
        networkInterfaces: [
          {
            network,
            subnetwork,
          },
        ],
      },
    },
  });
  let operation = response.latestResponse;
  const operationsClient = new compute.GlobalOperationsClient();

  // Wait for the create operation to complete.
  while (operation.status !== 'DONE') {
    [operation] = await operationsClient.wait({
      operation: operation.name,
      project: projectId,
    });
  }

  console.log('Instance template created.');
}

createTemplateWithSubnet();

Python

import sys
from typing import Any

from google.api_core.extended_operation import ExtendedOperation
from google.cloud import compute_v1

def wait_for_extended_operation(
    operation: ExtendedOperation, verbose_name: str = "operation", timeout: int = 300
) -> Any:
    """
    This method will wait for the extended (long-running) operation to
    complete. If the operation is successful, it will return its result.
    If the operation ends with an error, an exception will be raised.
    If there were any warnings during the execution of the operation
    they will be printed to sys.stderr.

    Args:
        operation: a long-running operation you want to wait on.
        verbose_name: (optional) a more verbose name of the operation,
            used only during error and warning reporting.
        timeout: how long (in seconds) to wait for operation to finish.
            If None, wait indefinitely.

    Returns:
        Whatever the operation.result() returns.

    Raises:
        This method will raise the exception received from `operation.exception()`
        or RuntimeError if there is no exception set, but there is an `error_code`
        set for the `operation`.

        In case of an operation taking longer than `timeout` seconds to complete,
        a `concurrent.futures.TimeoutError` will be raised.
    """
    result = operation.result(timeout=timeout)

    if operation.error_code:
        print(
            f"Error during {verbose_name}: [Code: {operation.error_code}]: {operation.error_message}",
            file=sys.stderr,
            flush=True,
        )
        print(f"Operation ID: {operation.name}", file=sys.stderr, flush=True)
        raise operation.exception() or RuntimeError(operation.error_message)

    if operation.warnings:
        print(f"Warnings during {verbose_name}:\n", file=sys.stderr, flush=True)
        for warning in operation.warnings:
            print(f" - {warning.code}: {warning.message}", file=sys.stderr, flush=True)

    return result

def create_template_with_subnet(
    project_id: str, network: str, subnetwork: str, template_name: str
) -> compute_v1.InstanceTemplate:
    """
    Create an instance template that uses a provided subnet.

    Args:
        project_id: project ID or project number of the Cloud project you use.
        network: the network to be used in the new template. This value uses
            the following format: "projects/{project}/global/networks/{network}"
        subnetwork: the subnetwork to be used in the new template. This value
            uses the following format: "projects/{project}/regions/{region}/subnetworks/{subnetwork}"
        template_name: name of the new template to create.

    Returns:
        InstanceTemplate object that represents the new instance template.
    """
    # The template describes the size and source image of the book disk to
    # attach to the instance.
    disk = compute_v1.AttachedDisk()
    initialize_params = compute_v1.AttachedDiskInitializeParams()
    initialize_params.source_image = (
        "projects/debian-cloud/global/images/family/debian-11"
    )
    initialize_params.disk_size_gb = 250
    disk.initialize_params = initialize_params
    disk.auto_delete = True
    disk.boot = True

    template = compute_v1.InstanceTemplate()
    template.name = template_name
    template.properties = compute_v1.InstanceProperties()
    template.properties.disks = [disk]
    template.properties.machine_type = "e2-standard-4"

    # The template connects the instance to the specified network and subnetwork.
    network_interface = compute_v1.NetworkInterface()
    network_interface.network = network
    network_interface.subnetwork = subnetwork
    template.properties.network_interfaces = [network_interface]

    template_client = compute_v1.InstanceTemplatesClient()
    operation = template_client.insert(
        project=project_id, instance_template_resource=template
    )
    wait_for_extended_operation(operation, "instance template creation")

    return template_client.get(project=project_id, instance_template=template_name)

Wenn Sie mit dieser Vorlage eine Instanz für eine MIG (mit oder ohne Autoscaling) erstellen, wird die Instanz automatisch in der angegebenen Region und im angegebenen Subnetz erstellt. Auf diese Weise können Sie das Subnetz von neuen Instanzen kontrollieren, die für das Load-Balancing erstellt wurden.

Verwendung benutzerdefinierter und öffentlicher Images in Ihren Instanzvorlagen

Sie können entweder ein benutzerdefiniertes Image oder ein öffentliches Image für Ihre Instanzvorlagen verwenden:

  • Benutzerdefinierte Images. Weil MIGs darauf ausgerichtet sind, dass Instanzen oft hinzugefügt und entfernt werden, ist es sinnvoll, ein benutzerdefiniertes Image zu erstellen und dieses in der Instanzvorlage anzugeben. Sie können das Image mit den Anwendungen und Einstellungen vorbereiten, die Ihre VMs benötigen, sodass Sie diese Elemente bei einzelnen VMs der MIG nicht manuell konfigurieren müssen.

  • Öffentliche Images Sie können eine Instanzvorlage erstellen, die ein öffentliches Image und ein Startskript für die Vorbereitung der Instanz nach dem Start verwendet.

Benutzerdefinierte Images sind deterministischer und starten schneller als VMs mit Startskripts. Auf der anderen Seite sind Startskripts flexibler und ermöglichen Ihnen, die Anwendungen und Einstellungen in Ihren Instanzen leichter zu verändern.

Wenn Sie Images mithilfe von Image-Familien verwalten, können Sie den Namen der benutzerdefinierten oder öffentlichen Image-Familie in der Instanzvorlage angeben. Weitere Informationen zu Image-Familien finden Sie unter Best Practices für die Verwendung von Image-Familien in Compute Engine.

Nächste Schritte