Crear plantillas de instancia


En esta página se explica cómo crear y gestionar plantillas de instancias. Las plantillas de instancias te permiten especificar el tipo de máquina, la imagen del disco de arranque, la red y otras propiedades de la máquina virtual que quieras usar al crear instancias de máquina virtual.

Puede usar plantillas de instancia para hacer lo siguiente:

Antes de empezar

  • Consulta cuándo y por qué deberías crear plantillas de instancias deterministas.
  • Consulta información sobre las plantillas de instancia regionales y globales.
  • Si aún no lo has hecho, configura la autenticación. La autenticación verifica tu identidad para acceder a Google Cloud servicios y APIs. Para ejecutar código o ejemplos desde un entorno de desarrollo local, puedes autenticarte en Compute Engine seleccionando una de las siguientes opciones:

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. Instala Google Cloud CLI. Después de la instalación, inicializa la CLI de Google Cloud ejecutando el siguiente comando:

      gcloud init

      Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

    2. Set a default region and zone.

    Terraform

    Para usar las muestras de Terraform de esta página en un entorno de desarrollo local, instala e inicializa la CLI de gcloud y, a continuación, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

      Instala Google Cloud CLI.

      Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

      If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

      If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

    Para obtener más información, consulta Set up authentication for a local development environment.

    Go

    Para usar las Go muestras de esta página en un entorno de desarrollo local, instala e inicializa la CLI de gcloud y, a continuación, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

      Instala Google Cloud CLI.

      Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

      If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

      If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

    Para obtener más información, consulta Set up authentication for a local development environment.

    Java

    Para usar las Java muestras de esta página en un entorno de desarrollo local, instala e inicializa la CLI de gcloud y, a continuación, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

      Instala Google Cloud CLI.

      Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

      If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

      If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

    Para obtener más información, consulta Set up authentication for a local development environment.

    Node.js

    Para usar las Node.js muestras de esta página en un entorno de desarrollo local, instala e inicializa la CLI de gcloud y, a continuación, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

      Instala Google Cloud CLI.

      Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

      If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

      If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

    Para obtener más información, consulta Set up authentication for a local development environment.

    Python

    Para usar las Python muestras de esta página en un entorno de desarrollo local, instala e inicializa la CLI de gcloud y, a continuación, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

      Instala Google Cloud CLI.

      Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

      If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

      If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

    Para obtener más información, consulta Set up authentication for a local development environment.

    REST

    Para usar las muestras de la API REST de esta página en un entorno de desarrollo local, debes usar las credenciales que proporciones a la CLI de gcloud.

      Instala Google Cloud CLI.

      Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

    Para obtener más información, consulta el artículo Autenticarse para usar REST de la documentación sobre autenticación de Google Cloud .

Limitaciones

  • La VPC compartida en interfaces que no sean nic0 para plantillas de instancia se admite en la CLI de gcloud y en REST, pero no en la consola deGoogle Cloud .
  • No puedes actualizar una plantilla de instancia ni cambiarla después de crearla. Si una plantilla de instancia se queda obsoleta o necesitas cambiar la configuración, crea una nueva plantilla de instancia.
  • Si quieres especificar una familia de imágenes en una plantilla de instancia, no puedes usar la consola. Google Cloud También puedes usar Google Cloud CLI o REST.
  • Si quieres especificar discos regionales en lugar de zonales en una plantilla de instancia, no puedes usar la consola. Google Cloud Puedes usar Google Cloud CLI o REST en su lugar.
  • Puedes usar una plantilla de instancia para crear VMs con un disco de arranque Hyperdisk Balanced que esté en un grupo de almacenamiento, si el grupo de almacenamiento está en la misma zona en la que se crea la VM. No puedes usar plantillas de instancia globales para crear VMs con discos que no sean de arranque y que estén en un pool de almacenamiento.

Crear una plantilla de instancia

La mayoría de las propiedades de las VMs que puede especificar en una solicitud para crear una instancia de VM individual también se pueden especificar en una plantilla de instancia, incluidos los metadatos de la VM, los scripts de inicio, los discos persistentes y las cuentas de servicio. Debes especificar el tipo de máquina, el disco de arranque y la red.

Crea una plantilla de instancia regional o global mediante laGoogle Cloud console, CLI de Google Cloud o la API. Para crear una plantilla de instancia global, también puedes usar Terraform o las bibliotecas de cliente de Cloud.

Consola

  1. En la consola, ve a la página Plantillas de instancia. Google Cloud

    Ir a Plantillas de instancia

    Los pasos restantes aparecen en la Google Cloud consola.

  2. Haz clic en Crear plantilla de instancia.
  3. Selecciona la ubicación de la siguiente manera:
    1. Si quieres usar la plantilla de instancia en varias regiones, elige Global.
    2. Si quieres reducir la dependencia entre regiones, elige Regional.
  4. Si has elegido la opción regional, selecciona la región en la que quieras crear tu plantilla de instancia.
  5. En los siguientes campos, acepte los valores predeterminados o modifíquelos según sea necesario. Los valores predeterminados cambian en función de la familia de máquinas que selecciones.

    • Selecciona un Tipo de máquina.
    • Para actualizar el tipo o la imagen del disco de arranque, en la sección Disco de arranque, haz clic en Cambiar.
    • Para actualizar la interfaz de red o la configuración de la dirección IP, haz clic en Opciones avanzadas, luego en Redes y, a continuación, en la interfaz de red que quieras editar.
  6. Opcional: Si has elegido una imagen que admite VMs blindadas, cambia los ajustes de VM blindada de la VM:

    1. Haz clic en Opciones avanzadas y, a continuación, en la pestaña Seguridad.
    2. Si quieres inhabilitar el arranque seguro, desmarca la casilla Activar arranque seguro. El arranque seguro sirve para proteger tus instancias de VM frente al malware y los rootkits en los niveles de arranque y kernel. Para obtener más información, consulta Arranque seguro.
    3. Si quieres inhabilitar el módulo de plataforma segura virtual (vTPM), desmarca la casilla Activar vTPM. El vTPM habilita el arranque medido, que valida la integridad de la VM antes y durante el arranque. Para obtener más información, consulta Módulo de plataforma segura virtual (vTPM).

    4. Si quieres inhabilitar la monitorización de integridad, desmarca la casilla Activar monitorización de integridad. La monitorización de integridad te permite supervisar la integridad del arranque de tus instancias de VM blindadas mediante Cloud Monitoring. Para obtener más información, consulta Monitorización de la integridad.

  7. Opcional: En Opciones avanzadas, haz clic en las pestañas para personalizar aún más tu plantilla. Por ejemplo, puedes añadir hasta 15 discos secundarios que no sean de arranque.

  8. Opcional: Haz clic en REST equivalente para ver el cuerpo de la solicitud REST, que incluye la representación JSON de tu plantilla de instancia.

  9. Haga clic en Crear para crear la plantilla.

gcloud

Para crear una plantilla de instancia regional o global, usa el comando instance-templates create. En el caso de las plantillas de instancia regionales, debe usar la marca --instance-template-region para definir la región de la plantilla.

Crea una plantilla de instancia regional con el siguiente comando.

gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME \
    --instance-template-region=REGION

Sustituye REGION por la región en la que quieras crear la plantilla de instancia regional.

Crea una plantilla de instancia global con el siguiente comando:

gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME

Si no proporciona ajustes de plantilla explícitos, gcloud compute usará los siguientes valores predeterminados:

  • Tipo de máquina: el tipo de máquina (por ejemplo, n1-standard-1)
  • Imagen: la imagen de Debian más reciente
  • Disco de arranque: un nuevo disco de arranque estándar con el nombre de la VM
  • Red: la red de VPC predeterminada
  • Dirección IP: una dirección IPv4 externa efímera
  • Tipo de pila: IPV4_ONLY

También puedes proporcionar estos ajustes de configuración de forma explícita. Por ejemplo:

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

Puedes añadir hasta 15 discos secundarios que no sean de arranque. Especifica la marca --create-disk para cada disco secundario que crees. Para crear discos secundarios a partir de una imagen pública o personalizada, especifica las propiedades image y image-project de cada disco en la marca --create-disk. Para crear un disco en blanco, no incluyas estas propiedades. También puede incluir propiedades para el disco size y type. Para especificar discos regionales, use la propiedad replica-zones.

gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME \
    --machine-type=MACHINE_TYPE \
    --create-disk=image-family=DISK_IMAGE_FAMILY,image-project=DISK_IMAGE_PROJECT,size=SIZE_GB_DISK1 \
    --create-disk=device-name=DISK_NAME,type=DISK_TYPE,size=SIZE_GB_DISK2,replica-zones=^:^ZONE:REMOTE_ZONE,boot=false

Nota: Al especificar el parámetro replica-zones del disco, los caracteres ^:^ indican que el carácter de separación entre los valores es dos puntos (:) en lugar de la coma (,).

Haz los cambios siguientes:

  • INSTANCE_TEMPLATE_NAME: el nombre de la plantilla
  • MACHINE_TYPE: el tipo de máquina de las VMs
  • DISK_IMAGE_FAMILY: una familia de imágenes que se usará como disco que no es de arranque.

    Para obtener más información sobre las familias de imágenes, consulta las prácticas recomendadas para usar familias de imágenes en Compute Engine.

    En su lugar, puedes usar la marca --image=IMAGE para especificar una versión concreta de una imagen.

    En el caso de los discos en blanco, no especifique la propiedad image-family ni image.

  • DISK_IMAGE_PROJECT: el proyecto de imagen que contiene la imagen

    En el caso de los discos en blanco, no especifiques la propiedad image-project. Para obtener más información sobre las imágenes públicas, consulta Imágenes públicas.

  • SIZE_GB_DISK1 y SIZE_GB_DISK2: el tamaño de cada disco secundario

  • DISK_NAME: Opcional: el nombre del disco que se muestra al sistema operativo invitado después de crear la VM.

  • DISK_TYPE: opcional, el tipo de disco que se va a crear. Si no se especifica, el tipo de disco predeterminado que se usa depende del valor de la marca --machine-type.

  • ZONE y REMOTE_ZONE: la zona en la que se creará el disco regional y la zona en la que se replicará.

    En el caso de los discos zonales, no incluyas la propiedad replica-zones.

Si has elegido una imagen que admite VM blindada, puedes cambiar la configuración de VM blindada de la instancia con una de las siguientes marcas:

  • --no-shielded-secure-boot: desactiva Arranque seguro

    El arranque seguro sirve para proteger tus instancias de VM frente al malware y los rootkits en los niveles de arranque y kernel. Para obtener más información, consulta Arranque seguro.

  • --no-shielded-vtpm: desactiva el módulo de plataforma segura virtual (vTPM)

    El vTPM habilita el arranque medido, que valida la integridad de la VM antes y durante el arranque. Para obtener más información, consulta Módulo de plataforma segura virtual (vTPM).

  • --no-shielded-integrity-monitoring: desactiva la monitorización de integridad

    La monitorización de integridad te permite supervisar la integridad del arranque de tus instancias de VM blindadas mediante Cloud Monitoring. Para obtener más información, consulta Monitorización de la integridad.

Para ver una lista de todos los subcomandos y las marcas disponibles, consulta la referencia de instance-templates.

Terraform

Para crear una plantilla de instancia, usa uno de los siguientes recursos:

En el siguiente ejemplo se crea una plantilla de instancia global:

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"

    # default access config, defining external IP configuration
    access_config {
      network_tier = "PREMIUM"
    }
  }

  # To avoid embedding secret keys or user credentials in the instances, Google recommends that you use custom service accounts with the following access scopes.
  service_account {
    scopes = [
      "https://www.googleapis.com/auth/cloud-platform"
    ]
  }
}

Para saber cómo aplicar o quitar una configuración de Terraform, consulta Comandos básicos de Terraform.

Go

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	computepb "cloud.google.com/go/compute/apiv1/computepb"
	"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: %w", 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: %w", err)
	}

	if err = op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %w", 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)
              .setDiskType("pd-balanced")
              .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)
              .setDiskType("pd-balanced")
              .setSourceImage("projects/debian-cloud/global/images/family/debian-11").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

from __future__ import annotations

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:
    """
    Waits 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)

REST

Para crear una plantilla de instancia regional, haz una solicitud POST al método regionInstanceTemplates.insert de la siguiente manera:

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

Para crear una plantilla de instancia global, envía una solicitud POST al método instanceTemplates.insert:

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

Puedes añadir hasta 15 discos secundarios que no sean de arranque mediante la propiedad disks, con un campo para cada disco adicional. En cada disco adicional, puedes hacer lo siguiente:

  • Crea discos adicionales con una imagen pública o personalizada.
  • Para añadir un disco en blanco, define la entrada initializeParams sin el valor sourceImage.
  • Para crear discos regionales, define la entrada initializeParams con la propiedad replicaZones.

En el cuerpo de la solicitud, proporcione las propiedades de la plantilla:

{
  "name": "INSTANCE_TEMPLATE_NAME",
  "properties": {
    "machineType": "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"
        }
      },
      {
        "type": "PERSISTENT",
        "boot": false,
        "deviceName": "DISK_NAME",
        "initializeParams":
        {
          "replicaZones": [
              "projects/PROJECT_NAME/zones/ZONE",
              "projects/PROJECT_NAME/zones/REMOTE_ZONE"
          ]
        }
      }
    ]
  }
}

Haz los cambios siguientes:

  • PROJECT_ID: tu ID de proyecto
  • REGION: la región en la que quieres crear tu plantilla de instancia regional
  • INSTANCE_TEMPLATE_NAME: el nombre de la plantilla de instancia
  • ZONE: la zona en la que se encuentran las VMs
  • MACHINE_TYPE: el tipo de máquina de las VMs

  • IMAGE_PROJECT: el proyecto de imagen que contiene la imagen

    Para obtener más información sobre las imágenes públicas, consulta Imágenes públicas.

  • IMAGE o IMAGE_FAMILY: especifique una de las siguientes opciones:
    • IMAGE: una versión específica de la imagen

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

    • IMAGE_FAMILY: una familia de imágenes

      De esta forma, se crea la VM a partir de la imagen de SO más reciente que no esté obsoleta. Por ejemplo, si especificas "sourceImage": "projects/debian-cloud/global/images/family/debian-10", Compute Engine crea una VM a partir de la versión más reciente de la imagen del SO de la familia de imágenes de Debian 10.

      Para obtener más información sobre las familias de imágenes, consulta las prácticas recomendadas para usar familias de imágenes en Compute Engine.

  • DISK_NAME: Opcional: el nombre del disco que se muestra al sistema operativo invitado después de crear la VM.

  • PROJECT_NAME: el proyecto asociado a la VM

  • REMOTE_ZONE: la zona en la que se debe replicar el disco regional

Puedes especificar una de las siguientes opciones para la propiedad disks:

  • Especifica initializeParams para crear discos de arranque para cada instancia. Puedes crear discos usando imágenes públicas o personalizadas (o familias de imágenes) con la propiedad sourceImage, como se muestra en el ejemplo anterior. Para añadir discos en blanco, no especifiques ningún sourceImage. También puedes añadir hasta 15 discos secundarios que no sean de arranque mediante la propiedad initializeParams para cada disco adicional.

  • Especifica source para adjuntar un disco de arranque. Si adjuntas un disco de arranque, solo puedes crear una instancia a partir de tu plantilla.

También puedes especificar las propiedades diskSizeGb, diskType y labels de initializeParams, así como la propiedad diskSizeGb de source.

Si has elegido una imagen que admite VM blindada, puedes cambiar de forma opcional la configuración de VM blindada de la VM mediante los siguientes elementos booleanos del cuerpo de la solicitud:

  • enableSecureBoot: activa o desactiva Arranque seguro.

    El arranque seguro sirve para proteger tus instancias de VM frente al malware y los rootkits en los niveles de arranque y kernel. Para obtener más información, consulta Arranque seguro.

  • enableVtpm: activa o desactiva el módulo de plataforma segura virtual (vTPM)

    El vTPM habilita el arranque medido, que valida la integridad de preinicio e inicio de la VM. Para obtener más información, consulta Módulo de plataforma segura virtual (vTPM).

  • enableIntegrityMonitoring: activa o desactiva la monitorización de la integridad

    La monitorización de integridad te permite supervisar y verificar la integridad del arranque del entorno de ejecución de tus instancias de VM blindadas mediante los informes de Cloud Monitoring. Para obtener más información, consulta Monitorización de la integridad.

Para obtener más información sobre los parámetros de solicitud, consulta el método instanceTemplates.insert.

Crear una plantilla de instancia a partir de una instancia ya creada

Puedes usar REST o la CLI de gcloud para guardar la configuración de una instancia de VM como plantilla de instancia. También puede anular opcionalmente la forma en que se definen los discos de origen en la plantilla.

Si necesitas anular otras propiedades, primero crea una plantilla de instancia basada en una instancia ya creada y, a continuación, crea una plantilla similar con las anulaciones adicionales.

gcloud

Usa el comando gcloud compute instance-templates create con las marcas --source-instance y --source-instance-zone. Si quieres crear una plantilla de instancia regional, también debes usar la marca --instance-template-region para especificar la región de la plantilla de instancia.

Para crear una plantilla de instancia regional, usa el siguiente comando:

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

Para crear una plantilla de instancia global, usa el siguiente comando:

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

Para anular la forma en que se definen los discos de la instancia de origen, añade una o varias marcas --configure-disk.

En el siguiente ejemplo se crea una plantilla de instancia global a partir de una instancia ya creada y se sustituye el disco de la instancia de origen por las especificaciones que proporciones.

  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

Haz los cambios siguientes:

  • INSTANCE_TEMPLATE_NAME es el nombre de la plantilla que se va a crear.
  • SOURCE_INSTANCE es el nombre de la instancia que se usará como modelo para la nueva plantilla.
  • SOURCE_INSTANCE_ZONE es la zona que contiene la instancia de origen.
  • SOURCE_DISK es el nombre de un disco de instancia de origen que quieres anular en la plantilla.
  • INSTANTIATE_OPTIONS especifica si se debe incluir el disco y qué imagen se debe usar. Los valores válidos dependen del tipo de disco:

    • source-image o source-image-family (solo es válido para el arranque y otros discos de lectura y escritura persistentes). Especifica esta opción si quieres usar la misma imagen de origen o familia de imágenes de origen que se usó para crear el disco en la instancia de VM de origen.
    • custom-image (solo es válido para discos de arranque y otros discos persistentes de lectura y escritura). Si quieres conservar las aplicaciones y los ajustes de las VMs de origen en tu plantilla de instancia, puedes crear una imagen personalizada y, a continuación, especificarla al crear la plantilla. Si se especifica, proporcione la ruta o la URL de la imagen personalizada, como se muestra en el siguiente ejemplo. También puedes especificar una familia de imágenes con el siguiente formato:

      --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 (válido solo para discos de solo lectura).

    • blank (válido solo para discos persistentes que no son de arranque y SSDs locales). Si se especifica, cuando se utilice la plantilla para crear una instancia, el disco se creará sin formato. Debes formatear y montar el disco en una secuencia de comandos de inicio para poder usarlo en una configuración escalable.

    • do-not-include (solo es válido para discos persistentes que no sean de arranque y discos de solo lectura).

  • AUTO_DELETE especifica si el disco se elimina automáticamente cuando se elimina la instancia. Los valores válidos son: false, no, true y yes.

Por ejemplo, el siguiente comando crea una plantilla de instancia basada en my-source-instance, con la opción de usar la imagen original de data-disk-a, pero define la eliminación automática en true y sustituye data-disk-b por una imagen personalizada.

 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

Go

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	computepb "cloud.google.com/go/compute/apiv1/computepb"
	"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: %w", 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: %w", err)
	}

	if err = op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %w", 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

from __future__ import annotations

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:
    """
    Waits 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)

REST

Para crear una plantilla de instancia regional, usa el método regionInstanceTemplates.insert. Para crear una plantilla de instancia global, usa el método instanceTemplates.insert.

En su solicitud, debe especificar el campo sourceInstance. Para anular la forma en que se definen los discos de la instancia de origen, añade uno o varios campos diskConfigs.

Por ejemplo, haz la siguiente llamada para crear una plantilla de instancia global a partir de una instancia ya creada.

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
      }
    ]
  }
}

Haz los cambios siguientes:

  • PROJECT_ID: tu ID de proyecto
  • INSTANCE_TEMPLATE_NAME: el nombre de la nueva plantilla
  • SOURCE_INSTANCE_ZONE: la zona de la instancia de origen
  • SOURCE_INSTANCE: el nombre de la instancia de origen que se usará como modelo para esta plantilla de instancia.
  • SOURCE_DISK: nombre de un disco de instancia de origen que quieras sustituir en la plantilla
  • INSTANTIATE_OPTIONS: especifica si se debe incluir el disco y qué imagen se debe usar.

    Los valores válidos dependen del tipo de disco:

    • source-image o source-image-family (válido solo para discos de arranque y otros discos persistentes de lectura y escritura).
    • custom-image (solo es válido para discos de arranque y otros discos persistentes de lectura y escritura). Si quieres conservar las aplicaciones y los ajustes de las VMs de origen en tu plantilla de instancia, puedes crear una imagen personalizada y, a continuación, especificarla al crear la plantilla. Si se especifica, proporcione la ruta o la URL de la imagen personalizada, como se muestra en el siguiente ejemplo. También puedes especificar una familia de imágenes con el siguiente formato:

        "diskConfigs": [
          {
            "deviceName": DATA_DISK_NAME,
            "instantiateFrom": custom-image,
            "customImage": "projects/PROJECT_ID/global/images/family/IMAGE_FAMILY_NAME"
          }
        ]
      
    • attach-read-only (válido solo para discos de solo lectura).

    • blank (válido solo para discos persistentes que no son de arranque y SSDs locales). Si se especifica, cuando se utilice la plantilla para crear una instancia, el disco se creará sin formato. Debes formatear y montar el disco en una secuencia de comandos de inicio para poder usarlo en una configuración escalable.

    • do-not-include (solo es válido para discos persistentes que no sean de arranque y discos de solo lectura).

En el siguiente ejemplo se crea una plantilla de instancia basada en my-source-instance. En la plantilla de instancia, la imagen de data-disk-a se sustituye por projects/cos-cloud/global/images/cos-89-16108-403-15.

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"
      }
    ]
  }
}

En la siguiente tabla se muestra cómo se definen las opciones para anular discos en la plantilla.

Tipo de disco Opciones
Disco de arranque
  • [Predeterminado] Usa la misma imagen de origen o familia de imágenes que se usó para crear el disco de arranque en la instancia de origen.
  • Utilice la URL de cualquier imagen (personalizada o pública) tal como se describe en el ejemplo anterior o especifique una familia de imágenes con el siguiente formato:
  • projects/exampleproject/global/images/family/IMAGE_FAMILY_NAME

Otros discos persistentes de lectura/escritura
  • [Predeterminado] Usa la misma imagen de origen o familia de imágenes de origen que se usó para crear el disco en la instancia de origen. Nota: Si el disco de la instancia de origen no tiene una propiedad de imagen de origen o de familia de imágenes de origen, se incluye en la plantilla como un disco en blanco.
  • Utilice la URL de cualquier imagen (personalizada o pública) tal como se describe en el ejemplo anterior o especifique una familia de imágenes con el siguiente formato:

    projects/exampleproject/global/images/family/IMAGE_FAMILY_NAME

  • Usa un disco en blanco en la plantilla. Cuando se usa la plantilla para crear una instancia, este disco se crea sin formato. Debes formatear y montar el disco en una secuencia de comandos de inicio para poder usarlo en una configuración escalable.
  • No incluyas el disco.
Disco(s) de solo lectura
  • [Predeterminado] Incluye el disco en modo de solo lectura.
  • No incluyas el disco.
SSD(s) local(es)
  • [Predeterminado] Incluye un SSD local en blanco. Cuando se usa la plantilla para crear una instancia, este disco se crea sin formato. Debes formatear y montar el disco en una secuencia de comandos de inicio para poder usarlo en una configuración escalable.

En cada disco, también puede anular el atributo auto-delete para especificar si el disco se debe eliminar cuando se elimine la instancia asociada.

De forma predeterminada, si no se especifican opciones de anulación, la configuración del disco de la plantilla coincide con la de la instancia de origen.

Crear una plantilla de instancia a partir de una plantilla ya creada

No puedes actualizar una plantilla de instancia. Sin embargo, si una plantilla de instancia se queda obsoleta o necesitas hacer cambios, puedes crear otra con propiedades similares mediante la consola.

  1. Ve a la página Plantillas de instancias.

    Ir a Plantillas de instancia

  2. Haz clic en la plantilla de instancia que quieras copiar y actualizar.

  3. Haz clic en Crear similar.

  4. Actualice la configuración de la nueva plantilla.

  5. Haz clic en Crear.

Crear una plantilla de instancia para VMs con GPU

Al crear una plantilla de instancia, puede configurarla para crear VMs que tengan GPUs conectadas especificando lo siguiente:

Consola

Para crear una plantilla de instancia para máquinas virtuales con GPU, sigue estos pasos:

  1. En la consola, ve a la página Plantillas de instancia. Google Cloud

    Ir a Plantillas de instancia

  2. Haz clic en Crear plantilla de instancia.

  3. En el campo Nombre, introduce un nombre para la plantilla de instancia.

  4. En la sección Ubicación, seleccione una de las siguientes opciones:

    • Para crear una plantilla de instancia global, selecciona Global (opción predeterminada).

    • Para crear una plantilla de instancia regional, selecciona Regional y, a continuación, la región en la que quieras crear la plantilla de instancia.

  5. En la sección Configuración de la máquina, haga lo siguiente:

    1. Haz clic en la pestaña GPUs.

    2. En el menú Tipo de GPU, selecciona el tipo de GPU.

    3. En el menú Número de GPUs, selecciona el número de GPUs.

    4. Opcional: Si tu modelo de GPU es compatible con estaciones de trabajo virtuales (vWS) NVIDIA RTX para cargas de trabajo de gráficos y tienes previsto ejecutar cargas de trabajo que utilizan un gran número de gráficos, selecciona Habilitar estación de trabajo virtual (NVIDIA GRID).

    5. En la sección Tipo de máquina, selecciona un tipo de máquina.

  6. Opcional: Para cambiar el tipo o la imagen del disco de arranque predeterminado, en la sección Disco de arranque, haz clic en Cambiar. A continuación, sigue las instrucciones para cambiar el disco de arranque.

  7. Haz clic en Crear.

gcloud

Para crear una plantilla de instancia para VMs con GPU, usa el comando instance-templates create con la marca --maintenance-policy definida como TERMINATE.

Por ejemplo, para crear una plantilla de instancia global para VMs con GPU, usa el siguiente comando:

gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME \
    --image-project=IMAGE_PROJECT \
    --image-family=IMAGE_FAMILY \
    --machine-type=MACHINE_TYPE \
    --maintenance-policy=TERMINATE

Haz los cambios siguientes:

  • INSTANCE_TEMPLATE_NAME: el nombre de la plantilla de instancia.

  • IMAGE_PROJECT: el proyecto de imagen que contiene la imagen; por ejemplo, debian-cloud. Para obtener más información sobre los proyectos de imágenes admitidos, consulta Imágenes públicas.

  • IMAGE_FAMILY o IMAGE: especifique una de las siguientes opciones:

    • IMAGE_FAMILY: una familia de imágenes. Especifica la imagen del SO más reciente y no obsoleta. Por ejemplo, si especificas debian-10, se usará la versión más reciente de la familia de imágenes de Debian 10. Para obtener más información sobre cómo usar familias de imágenes, consulta las prácticas recomendadas para familias de imágenes.

    • IMAGE: una versión específica de la imagen del SO. Por ejemplo, debian-10-buster-v20200309. Si decides especificar una versión concreta de la imagen del SO, debes sustituir la marca --image-family por la marca --image.

  • MACHINE_TYPE: el tipo de máquina de las VMs. Si especificas un tipo de máquina N1, incluye la marca --accelerator para especificar el número y el tipo de GPUs que quieres asociar a tus VMs.

Por ejemplo, supongamos que quieres crear una plantilla de instancia global para VMs con GPU que especifique las siguientes propiedades:

  • Un tipo de máquina predefinido N1 con 2 vCPUs.

  • Una GPU NVIDIA T4 para asociar a las VMs.

  • Debian como proyecto de imagen.

  • Debian 10 como familia de imágenes.

Para crear la plantilla de instancia de ejemplo, usa el siguiente comando:

gcloud compute instance-templates create instance-template-gpu \
    --accelerator=count=1,type=nvidia-tesla-t4 \
    --machine-type=n1-standard-2 \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --maintenance-policy=TERMINATE

Terraform

Para crear una plantilla de instancia, usa uno de los siguientes recursos:

En el siguiente ejemplo se crea una plantilla de instancia global que especifica un tipo de máquina predefinido N1 con 2 vCPUs y una GPU NVIDIA T4 conectada:

resource "google_compute_instance_template" "default" {
  name         = "gpu-template"
  machine_type = "n1-standard-2"

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

  network_interface {
    network = "default"
  }

  guest_accelerator {
    type  = "nvidia-tesla-t4"
    count = 1
  }

  scheduling {
    on_host_maintenance = "TERMINATE"
  }
}

Para saber cómo aplicar o quitar una configuración de Terraform, consulta Comandos básicos de Terraform.

REST

Para crear una plantilla de instancia para VMs con GPU, envía una solicitud POST al método instanceTemplates.insert. En el cuerpo de la solicitud, incluye el campo onHostMaintenance y asigna el valor TERMINATE.

Por ejemplo, para crear una plantilla de instancia global para VMs con GPU, haz una solicitud POST como la siguiente:

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

{
  "name": "INSTANCE_TEMPLATE_NAME",
  "properties": {
    "disks": [
      {
        "type": "PERSISTENT",
        "boot": true,
        "mode": "READ_WRITE",
        "initializeParams": {
          "sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE"
        }
      }
    ],
    "machineType": "MACHINE_TYPE",
    "networkInterfaces": [
      {
        "accessConfigs": [
          {
            "name": "external-IP",
            "type": "ONE_TO_ONE_NAT"
          }
        ],
        "network": "global/networks/default"
      }
    ],
    "scheduling": {
      "onHostMaintenance": "TERMINATE"
    }
  }
}

Haz los cambios siguientes:

  • PROJECT_ID: el ID del proyecto en el que quieres crear la plantilla de instancia.

  • INSTANCE_TEMPLATE_NAME: el nombre de la plantilla de instancia.

  • IMAGE_PROJECT: el proyecto de imagen que contiene la imagen; por ejemplo, debian-cloud. Para obtener más información sobre los proyectos de imágenes admitidos, consulta Imágenes públicas.

  • IMAGE o IMAGE_FAMILY: especifique una de las siguientes opciones:

    • IMAGE: una versión específica de la imagen del SO. Por ejemplo, debian-10-buster-v20200309.

    • IMAGE_FAMILY: una familia de imágenes. Especifica la imagen del SO más reciente y no obsoleta. Por ejemplo, si especificas family/debian-10, se usará la versión más reciente de la familia de imágenes de Debian 10. Para obtener más información sobre cómo usar familias de imágenes, consulta las prácticas recomendadas para familias de imágenes.

  • MACHINE_TYPE: el tipo de máquina de las VMs. Si especificas un tipo de máquina N1, incluye el campo guestAccelerators para especificar el número y el tipo de GPUs que quieres conectar a tus VMs.

Por ejemplo, supongamos que quieres crear una plantilla de instancia global para VMs con GPU que especifique las siguientes propiedades:

  • Un tipo de máquina predefinido N1 con 2 vCPUs.

  • Una GPU NVIDIA T4 para asociar a las VMs.

  • Debian como proyecto de imagen.

  • Debian 10 como familia de imágenes.

Para crear la plantilla de instancia de ejemplo, haz una solicitud POST de la siguiente manera:

POST https://compute.googleapis.com/compute/v1/projects/example-project/global/instanceTemplates

{
  "name": "instance-template-gpu",
  "properties": {
    "disks": [
      {
        "type": "PERSISTENT",
        "boot": true,
        "mode": "READ_WRITE",
        "initializeParams": {
          "sourceImage": "projects/debian-cloud/global/images/family/debian-10"
        }
      }
    ],
    "guestAccelerators": [
      {
        "acceleratorType": "nvidia-tesla-t4",
        "acceleratorCount": 1
      }
    ],
    "machineType": "n1-standard-2",
    "networkInterfaces": [
      {
        "accessConfigs": [
          {
            "name": "external-IP",
            "type": "ONE_TO_ONE_NAT"
          }
        ],
        "network": "global/networks/default"
      }
    ],
    "scheduling": {
      "onHostMaintenance": "TERMINATE"
    }
  }
}

Para ver más opciones de configuración al crear una plantilla de instancia, consulta el artículo Crear una plantilla de instancia de este documento.

Crear una plantilla de instancia con una imagen de contenedor

Puedes especificar una imagen de contenedor en una plantilla de instancia. De forma predeterminada, Compute Engine también incluye en la plantilla una imagen de Container-Optimized OS con Docker instalado. Cuando usas la plantilla para crear una instancia, el contenedor se inicia automáticamente cuando se inicia la instancia.

Consola

  1. Ve a la página Plantillas de instancias.

    Ir a Plantillas de instancia

  2. Haz clic en Crear plantilla de instancia.

  3. En la sección Contenedor, haga clic en Implementar contenedor.

  4. En el cuadro de diálogo Configurar contenedor, especifica la imagen de contenedor que quieras usar.

    • Puedes especificar una imagen de Container Registry o Artifact Registry. Por ejemplo:
      • gcr.io/cloud-marketplace/google/nginx1:TAG, donde TAG es la etiqueta definida para una versión específica de la imagen de contenedor de NGINX disponible en Google Cloud Marketplace.
      • us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 selecciona una imagen de ejemplo hello-app almacenada en Artifact Registry.
    • Si usas una imagen de contenedor de Docker Hub, especifica siempre el nombre completo de la imagen Docker. Por ejemplo, especifica el siguiente nombre de imagen para desplegar una imagen de contenedor de Apache: docker.io/httpd:2.4.
  5. También puedes hacer clic en Opciones avanzadas del contenedor. Para obtener más información, consulta Configurar las opciones para ejecutar tu contenedor.

  6. Haz clic en Crear.

gcloud

Usa el comando gcloud compute instance-templates create-with-container:

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

Haz los cambios siguientes:

  • INSTANCE_TEMPLATE_NAME: nombre de la plantilla que se va a crear.
  • CONTAINER_IMAGE: nombre completo de la imagen del contenedor que se va a usar.

Por ejemplo, el siguiente comando crea una plantilla de instancia llamada nginx-vm. Una instancia de VM creada a partir de esta plantilla se inicia y ejecuta la imagen de contenedor gcr.io/cloud-marketplace/google/nginx1:TAG, cuando se inicia la VM.

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

Sustituye TAG por la etiqueta definida para una versión específica de la imagen de contenedor de NGINX disponible en Google Cloud Marketplace.

También puedes configurar opciones para ejecutar tu contenedor.

Crear una plantilla de instancia que especifique una subred

gcloud

Para crear una plantilla de instancia regional o global, usa el comando instance-templates create. Usa la marca --subnet para colocar las instancias que se creen a partir de la plantilla en la subred que elijas. La marca --subnet requiere la marca --region.

Si quieres crear una plantilla de instancia regional, debes usar la marca --instance-template-region para definir la región de la plantilla. Asegúrate de usar una subred de la misma región en la que quieras crear la plantilla de instancia regional.

gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME \
    --region=REGION \
    --subnet=SUBNET_NAME_OR_URL \
    --stack-type=STACK_TYPE \
    --instance-template-region=INSTANCE_TEMPLATE_REGION

Haz los cambios siguientes:

  • INSTANCE_TEMPLATE_NAME: el nombre de la plantilla de instancia
  • REGION: la región de la subred
  • SUBNET_NAME_OR_URL: el nombre de la subred o su URL

  • STACK_TYPE: opcional: indica si IPv6 está habilitado en la interfaz de red predeterminada. Se pueden usar los siguientes valores: IPV4_ONLY, IPV4_IPV6 o IPV6_ONLY. Si no incluye esta marca, el valor predeterminado es IPV4_ONLY.

  • INSTANCE_TEMPLATE_REGION: la región en la que quieres crear la plantilla de instancia. Esta región debe ser la misma que REGION.

En el siguiente ejemplo se crea una plantilla llamada template-qa que solo crea instancias en la subred subnet-us-qa.

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

El resultado debería ser similar al siguiente:

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 "cloud.google.com/go/compute/apiv1/computepb"
	"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: %w", 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: %w", err)
	}

	if err = op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %w", 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

from __future__ import annotations

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:
    """
    Waits 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)

Si usas esta plantilla para crear instancias de un MIG (con o sin escalado automático), se creará automáticamente la instancia en la región y la subred especificadas. De esta forma, puede controlar la subred de las nuevas instancias creadas para el balanceo de carga.

Usar imágenes personalizadas o públicas en plantillas de instancia

Puedes usar una imagen personalizada o una imagen pública para tus plantillas de instancia:

  • Imágenes personalizadas. Como los MIGs se han diseñado para añadir y quitar instancias con frecuencia, es útil crear una imagen personalizada y especificarla en la plantilla de instancia. Puedes preparar tu imagen con las aplicaciones y los ajustes que necesiten tus VMs para no tener que configurar manualmente esos elementos en VMs concretas del MIG.

  • Imágenes públicas. Puedes crear una plantilla de instancia que use una imagen pública y una secuencia de comandos de inicio para preparar la instancia después de que empiece a ejecutarse.

Las imágenes personalizadas son más deterministas y se inician más rápido que las máquinas virtuales con secuencias de comandos de inicio. Sin embargo, las secuencias de comandos de inicio son más flexibles, lo que te ayuda a actualizar las aplicaciones y los ajustes de tus instancias.

Si gestionas imágenes mediante familias de imágenes, puedes especificar el nombre de tu familia de imágenes personalizada o pública en la plantilla de instancia. Para obtener más información sobre las familias de imágenes, consulta las prácticas recomendadas para usar familias de imágenes en Compute Engine.

.

Siguientes pasos