Crear plantillas de instancias


Esta página describe cómo crear y administrar plantillas de instancias . Las plantillas de instancia le permiten especificar el tipo de máquina, la imagen del disco de arranque, la red y otras propiedades de VM que desea usar al crear instancias de máquina virtual (VM).

Puede utilizar plantillas de instancias para hacer lo siguiente:

Antes de comenzar

Limitaciones

  • La VPC compartida en interfaces distintas de nic0 , por ejemplo, las plantillas, se admite en la CLI y REST de gcloud, pero no en la consola de Google Cloud.
  • No puede actualizar una plantilla de instancia existente ni cambiar una plantilla de instancia después de haberla creado. Si una plantilla de instancia queda obsoleta o necesita realizar cambios en la configuración, cree una nueva plantilla de instancia.
  • Si desea especificar una familia de imágenes en una plantilla de instancia, no puede usar la consola de Google Cloud. Puede utilizar Google Cloud CLI o REST en su lugar.
  • Si desea especificar discos regionales en lugar de discos zonales en una plantilla de instancia, no puede usar la consola de Google Cloud. Puede utilizar Google Cloud CLI o REST en su lugar.
  • Puede usar una plantilla de instancia para crear máquinas virtuales con un disco de inicio equilibrado de Hyperdisk que esté en un grupo de almacenamiento , si el grupo de almacenamiento existe en la misma zona en la que se creó la máquina virtual. No puede usar plantillas de instancias globales para crear máquinas virtuales con discos que no sean de arranque y que estén en un grupo de almacenamiento.

Crear una plantilla de instancia

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

Cree una plantilla de instancia regional o global a través de la consola de Google Cloud , la CLI de Google Cloud o la API . Para crear una plantilla de instancia global, también puede utilizar Terraform o las bibliotecas de cliente en la nube .

Consola

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

    Ir a plantillas de instancia

    Los pasos restantes aparecen en la consola de Google Cloud.

  2. Hacer clic Crear plantilla de instancia .
  3. Seleccione la Ubicación de la siguiente manera:
    1. Si desea utilizar la plantilla de instancia en todas las regiones, elija Global .
    2. Si desea reducir la dependencia entre regiones, elija Regional .
  4. Si elige regional, seleccione la región donde desea crear su plantilla de instancia.
  5. Para los siguientes campos, acepte los valores predeterminados o modifíquelos según sea necesario. Los valores predeterminados cambian según la familia de máquinas que seleccione.

    • Seleccione un Tipo de máquina .
    • Para actualizar el tipo o imagen del disco de arranque, en el Disco de arranque sección, haga clic en Cambiar .
    • Para actualizar la interfaz de red o la configuración de la dirección IP, haga clic en Opciones avanzadas , luego haga clic en Redes y luego haga clic en la interfaz de red que desea editar.
  6. Opcional: si elige una imagen que admita VM protegida, cambie la configuración de VM protegida de la VM:

    1. Haga clic en Opciones avanzadas y luego haga clic en la pestaña Seguridad .
    2. Si desea desactivar el arranque seguro, desactive la casilla de verificación Activar arranque seguro . Secure Boot ayuda a proteger sus instancias de VM contra malware y rootkits a nivel de arranque y de kernel. Para obtener más información, consulte Arranque seguro .
    3. Si desea desactivar el módulo de plataforma virtual confiable (vTPM), desmarque la casilla Activar vTPM . vTPM habilita el arranque medido, que valida la integridad del arranque y el prearranque de la VM. Para obtener más información, consulte Módulo de plataforma segura virtual (vTPM) .

    4. Si desea deshabilitar el monitoreo de integridad, desmarque la casilla de verificación Activar monitoreo de integridad . El monitoreo de integridad le permite monitorear la integridad del arranque de sus instancias de VM protegidas mediante Cloud Monitoring. Para obtener más información, consulte Monitoreo de integridad .

  7. Opcional: en Opciones avanzadas , haga clic en las pestañas para personalizar aún más su plantilla. Por ejemplo, puede agregar hasta 15 discos secundarios que no sean de arranque.

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

  9. Haga clic en Crear para crear la plantilla.

nube de gcloud

Para crear una plantilla de instancia regional o global, use el comando instance-templates create . Para una plantilla de instancia regional, debe usar el indicador --instance-template-region para establecer la región de la plantilla.

Cree una plantilla de instancia regional usando el siguiente comando.

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

Reemplace REGION con la región donde desea crear la plantilla de instancia regional.

Cree una plantilla de instancia global usando el siguiente comando:

gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME

Si no proporcionas configuraciones de plantilla explícitas, gcloud compute usa los siguientes valores predeterminados:

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

También puede proporcionar explícitamente estos ajustes de configuración. Por ejemplo:

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

Puede agregar hasta 15 discos secundarios que no sean de arranque. Especifique el indicador --create-disk para cada disco secundario que cree. Para crear discos secundarios a partir de una imagen pública o personalizada, especifique las propiedades de image y image-project para cada disco en el indicador --create-disk . Para crear un disco en blanco, no incluya estas propiedades. Opcionalmente, incluya propiedades para el size y type de disco. Para especificar discos regionales, utilice 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

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

Reemplace lo siguiente:

  • INSTANCE_TEMPLATE_NAME : el nombre de la plantilla
  • MACHINE_TYPE : el tipo de máquina de las VM
  • DISK_IMAGE_FAMILY : una familia de imágenes para usar como disco sin arranque

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

    En su lugar, puede utilizar la bandera --image= IMAGE para especificar una versión específica de una imagen.

    Para discos en blanco, no especifique la image-family o la propiedad image .

  • DISK_IMAGE_PROJECT : el proyecto de imagen que contiene la imagen

    Para discos en blanco, no especifique la propiedad image-project . Para obtener más información sobre imágenes públicas, consulte 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 en el sistema operativo invitado después de crear la VM.

  • DISK_TYPE : Opcional: el tipo de disco a crear. Si no se especifica, el tipo de disco predeterminado que se utiliza depende del valor del indicador --machine-type .

  • ZONE y REMOTE_ZONE : la zona para crear el disco regional y la zona para replicarlo.

    Para discos zonales, no incluya la propiedad replica-zones .

Si elige una imagen que admita VM protegida , opcionalmente puede cambiar la configuración de VM protegida de la instancia usando una de las siguientes opciones:

  • --no-shielded-secure-boot : desactiva el arranque seguro

    Secure Boot ayuda a proteger sus instancias de VM contra malware y rootkits a nivel de arranque y de kernel. Para obtener más información, consulte Arranque seguro .

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

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

  • --no-shielded-integrity-monitoring : desactiva el monitoreo de integridad

    El monitoreo de integridad le permite monitorear la integridad del arranque de sus instancias de VM blindadas mediante Cloud Monitoring. Para obtener más información, consulte Monitoreo de integridad .

Para obtener una lista de todos los subcomandos e indicadores disponibles, consulte la referencia instance-templates .

Una plantilla con los ajustes de configuración predeterminados podría verse como la siguiente:

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-12
    kind: compute#attachedDisk
    mode: READ_WRITE
    type: PERSISTENT
  machineType: c3-standard-4
  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

Terraformar

Para crear una plantilla de instancia, puede utilizar el recurso google_compute_instance_template .

El siguiente ejemplo de Terraform es similar al siguiente comando CLI de gcloud:

gcloud compute instance-templates create my-instance-template \
    --machine-type=c3-standard-4 \
    --image-family=debian-12 \
    --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"

    # 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 aprender cómo aplicar o eliminar una configuración de Terraform, consulte Comandos básicos de Terraform .

Ir

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());
    }
  }
}

Nodo.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();

Pitón

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)

DESCANSAR

Para crear una plantilla de instancia regional, realice 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, realice una solicitud POST al método instanceTemplates.insert :

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

Puede agregar hasta 15 discos secundarios que no sean de arranque mediante la propiedad disks , con un campo para cada disco adicional. Para cada disco adicional, puede hacer lo siguiente:

  • Cree discos adicionales con una imagen pública o personalizada.
  • Para agregar un disco en blanco, defina la entrada initializeParams sin valor sourceImage .
  • Para crear discos regionales, defina 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"
          ]
        }
      }
    ]
  }
}

Reemplace lo siguiente:

  • PROJECT_ID : ID de tu proyecto
  • REGION : la región donde desea crear su plantilla de instancia regional
  • INSTANCE_TEMPLATE_NAME : el nombre de la plantilla de instancia
  • ZONE : la zona donde se encuentran las VM
  • MACHINE_TYPE : el tipo de máquina de las VM

  • IMAGE_PROJECT : el proyecto de imagen que contiene la imagen.

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

  • IMAGE o IMAGE_FAMILY : especifique uno de los siguientes:
    • 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

      Esto crea la máquina virtual a partir de la imagen del sistema operativo más reciente y no obsoleta. Por ejemplo, si especifica "sourceImage": "projects/debian-cloud/global/images/family/debian-10" , Compute Engine crea una VM a partir de la última versión de la imagen del sistema operativo en la familia de imágenes de Debian 10.

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

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

  • PROJECT_NAME : el proyecto asociado con la VM

  • REMOTE_ZONE : la zona donde se debe replicar el disco regional

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

  • Especifique initializeParams para crear discos de arranque para cada instancia. Puede crear discos utilizando imágenes públicas o personalizadas (o familias de imágenes ) utilizando la propiedad sourceImage , como se muestra en el ejemplo anterior. Para agregar discos en blanco, no especifique una sourceImage . También puede agregar hasta 15 discos secundarios que no sean de arranque mediante la propiedad initializeParams para cada disco adicional.

  • Especifique source para adjuntar un disco de arranque existente. Si adjunta un disco de arranque existente, solo podrá crear una instancia a partir de su plantilla.

Opcionalmente, puede especificar las propiedades diskSizeGb , diskType y labels para initializeParams y la propiedad diskSizeGb para source .

Si elige una imagen que admita la VM protegida , opcionalmente puede cambiar la configuración de la VM protegida mediante los siguientes elementos del cuerpo de la solicitud booleana:

  • enableSecureBoot : activa o desactiva el arranque seguro

    Secure Boot ayuda a proteger sus instancias de VM contra malware y rootkits a nivel de arranque y de kernel. Para obtener más información, consulte Arranque seguro .

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

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

  • enableIntegrityMonitoring : activa o desactiva el monitoreo de integridad

    El monitoreo de integridad le permite monitorear y verificar la integridad del arranque en tiempo de ejecución de sus instancias de VM protegidas mediante el uso de informes de Cloud Monitoring. Para obtener más información, consulte Monitoreo de integridad .

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

Crear una plantilla de instancia basada en una instancia existente

Puedes usar REST o la CLI de gcloud para guardar la configuración de una instancia de VM existente como una plantilla de instancia. Opcionalmente, puede anular cómo se definen los discos de origen en la plantilla.

Si necesita anular otras propiedades, primero cree una plantilla de instancia basada en una instancia existente y luego cree una plantilla similar con anulaciones adicionales.

nube de gcloud

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

Para crear una plantilla de instancia regional, use 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, utilice el siguiente comando:

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

Para anular cómo se definen los discos de la instancia de origen, agregue uno o más indicadores --configure-disk .

El siguiente ejemplo crea una plantilla de instancia global a partir de una instancia existente y anula el disco de la instancia de origen con las especificaciones que usted proporciona.

  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

Reemplace lo siguiente:

  • INSTANCE_TEMPLATE_NAME es el nombre de la plantilla a crear.
  • SOURCE_INSTANCE es el nombre de la instancia que se utilizará 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 desea anular dentro de la plantilla.
  • INSTANTIATE_OPTIONS especifica si se incluye el disco y qué imagen 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 de lectura y escritura persistentes). Especifique esta opción si desea utilizar la misma imagen de origen o familia de imágenes de origen que se utilizó para crear el disco en la instancia de VM de origen.
    • custom-image (válida solo para discos de arranque y otros discos de lectura y escritura persistentes). Si desea conservar las aplicaciones y la configuración de las máquinas virtuales de origen en su plantilla de instancia, puede crear una imagen personalizada y luego especificarla cuando cree la plantilla. Si se especifica, proporcione la ruta o URL de la imagen personalizada, como se muestra en el siguiente ejemplo. Alternativamente, puede especificar una familia de imágenes usando 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 SSD locales). Si se especifica, cuando se utiliza la plantilla para crear una nueva instancia, el disco se crea sin formato. Debe formatear y montar el disco en un script de inicio antes de poder usarlo en una configuración escalable.

    • do-not-include (válido solo para discos persistentes que no son 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 establece la eliminación automática en true y reemplaza data-disk-b con 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

Ir

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());
    }
  }
}

Nodo.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();

Pitón

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)

DESCANSAR

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

En su solicitud, debe especificar el campo sourceInstance . Para anular cómo se definen los discos de la instancia de origen, agregue uno o más campos diskConfigs .

Por ejemplo, realice la siguiente llamada para crear una plantilla de instancia global a partir de una instancia existente.

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

Reemplace lo siguiente:

  • PROJECT_ID : ID de tu 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 : el nombre de un disco de instancia de origen que desea anular dentro de la plantilla
  • INSTANTIATE_OPTIONS : especifica si se incluye el disco y qué imagen 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 de lectura y escritura persistentes).
    • custom-image (válida solo para discos de arranque y otros discos de lectura y escritura persistentes). Si desea conservar las aplicaciones y la configuración de las máquinas virtuales de origen en su plantilla de instancia, puede crear una imagen personalizada y luego especificarla cuando cree la plantilla. Si se especifica, proporcione la ruta o URL de la imagen personalizada, como se muestra en el siguiente ejemplo. Alternativamente, puede especificar una familia de imágenes usando 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 SSD locales). Si se especifica, cuando se utiliza la plantilla para crear una nueva instancia, el disco se crea sin formato. Debe formatear y montar el disco en un script de inicio antes de poder usarlo en una configuración escalable.

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

El siguiente ejemplo crea una nueva plantilla de instancia basada en my-source-instance . En la plantilla de instancia, la imagen de data-disk-a se reemplaza con 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"
      }
    ]
  }
}

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

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

Otros discos persistentes de lectura/escritura
  • [Predeterminado] Utilice la misma imagen de origen/familia de imágenes de origen que se utilizó 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/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) como se describe en el ejemplo anterior o especifique una familia de imágenes utilizando el siguiente formato:

    projects/exampleproject/global/images/family/ IMAGE_FAMILY_NAME

  • Utilice un disco en blanco en la plantilla en su lugar. Cuando la plantilla se utiliza para crear una nueva instancia, este disco se crea sin formato. Debe formatear y montar el disco en un script de inicio antes de poder usarlo en una configuración escalable.
  • No incluyas el disco.
Discos de sólo lectura
  • [Predeterminado] Incluye el disco en modo de solo lectura.
  • No incluyas el disco.
SSD locales
  • [Predeterminado] Incluya un SSD local en blanco. Cuando la plantilla se utiliza para crear una nueva instancia, este disco se crea sin formato. Debe formatear y montar el disco en un script de inicio antes de poder usarlo en una configuración escalable.

Para cada disco, también puede anular el atributo auto-delete para especificar si el disco debe eliminarse cuando se elimina su instancia asociada.

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

Crear una plantilla de instancia basada en una plantilla existente

No puedes actualizar una plantilla de instancia existente. Pero, si una plantilla de instancia queda obsoleta o si necesita realizar cambios, puede crear otra con propiedades similares usando la consola.

  1. Vaya a la página de plantillas de instancia .

    Ir a plantillas de instancia

  2. Haga clic en la plantilla de instancia que desea copiar y actualizar.

  3. Haga clic en Crear similar .

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

  5. Haga clic en Crear .

Crear una plantilla de instancia para máquinas virtuales con GPU

Al crear una plantilla de instancia, puede configurarla para crear máquinas virtuales que tengan GPU adjuntas especificando lo siguiente:

Consola

Para crear una plantilla de instancia para máquinas virtuales con GPU, haga lo siguiente:

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

    Ir a plantillas de instancia

  2. Haga clic en Crear plantilla de instancia .

  3. En el campo Nombre , ingrese 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, seleccione Global (predeterminado).

    • Para crear una plantilla de instancia regional, seleccione Regional y luego seleccione la región donde desea crear la plantilla de instancia.

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

    1. Haga clic en la pestaña GPU .

    2. En el menú tipo de GPU , seleccione el tipo de GPU.

    3. En el menú Número de GPU , seleccione la cantidad de GPU.

    4. Opcional: si su modelo de GPU admite estaciones de trabajo virtuales NVIDIA RTX (vWS) para cargas de trabajo de gráficos y planea ejecutar cargas de trabajo con uso intensivo de gráficos, seleccione Habilitar estación de trabajo virtual (NVIDIA GRID) .

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

  6. Opcional: Para cambiar el tipo o imagen del disco de inicio del valor predeterminado, en la sección Disco de inicio , haga clic en Cambiar . Luego, siga las indicaciones para cambiar el disco de arranque.

  7. Haga clic en Crear .

nube de gcloud

Para crear una plantilla de instancia para máquinas virtuales con GPU, utilice el comando instance-templates create con el indicador --maintenance-policy establecido en TERMINATE .

Por ejemplo, para crear una plantilla de instancia global para VM con GPU, use 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

Reemplace lo siguiente:

  • 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, consulte Imágenes públicas .

  • IMAGE_FAMILY o IMAGE : especifique uno de los siguientes:

    • IMAGE_FAMILY : una familia de imágenes . Esto especifica la imagen del sistema operativo más reciente y no obsoleta. Por ejemplo, si especifica debian-10 , se utiliza la última versión de la familia de imágenes de Debian 10. Para obtener más información sobre el uso de familias de imágenes, consulte Mejores prácticas de familias de imágenes .

    • IMAGE : una versión específica de la imagen del sistema operativo; por ejemplo, debian-10-buster-v20200309 . Si elige especificar una versión específica de la imagen del sistema operativo, debe reemplazar el indicador --image-family por el indicador --image .

  • MACHINE_TYPE : el tipo de máquina de las VM. Si especifica un tipo de máquina N1, incluya el indicador --accelerator para especificar la cantidad y el tipo de GPU que se conectarán a sus máquinas virtuales.

Por ejemplo, supongamos que desea crear una plantilla de instancia global para máquinas virtuales con GPU que especifique las siguientes propiedades:

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

  • Una GPU NVIDIA T4 para conectar a las máquinas virtuales.

  • Debian como proyecto de imagen.

  • Debian 10 como familia de imágenes.

Para crear la plantilla de instancia de ejemplo, utilice 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

Terraformar

Para crear una plantilla de instancia para máquinas virtuales con GPU, utilice el recurso google_compute_region_instance_template .

Por ejemplo, para crear una plantilla de instancia global, que especifica un tipo de máquina predefinida N1 con 2 vCPU y una GPU NVIDIA T4 conectada, utilice el siguiente recurso:

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 aprender cómo aplicar o eliminar una configuración de Terraform, consulte Comandos básicos de Terraform .

DESCANSAR

Para crear una plantilla de instancia para máquinas virtuales con GPU, realice una solicitud POST al método instanceTemplates.insert . En el cuerpo de la solicitud, incluya el campo onHostMaintenance y configúrelo en TERMINATE .

Por ejemplo, para crear una plantilla de instancia global para VM con GPU, realice una solicitud POST de la siguiente manera:

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

Reemplace lo siguiente:

  • PROJECT_ID : el ID del proyecto en el que desea 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, consulte Imágenes públicas .

  • IMAGE o IMAGE_FAMILY : especifique uno de los siguientes:

    • IMAGE : una versión específica de la imagen del sistema operativo; por ejemplo, debian-10-buster-v20200309 .

    • IMAGE_FAMILY : una familia de imágenes . Esto especifica la imagen del sistema operativo más reciente y no obsoleta. Por ejemplo, si especifica family/debian-10 , se utiliza la última versión de la familia de imágenes de Debian 10. Para obtener más información sobre el uso de familias de imágenes, consulte Mejores prácticas de familias de imágenes .

  • MACHINE_TYPE : el tipo de máquina de las VM. Si especifica un tipo de máquina N1, incluya el campo guestAccelerators para especificar la cantidad y el tipo de GPU que se conectarán a sus máquinas virtuales.

Por ejemplo, supongamos que desea crear una plantilla de instancia global para máquinas virtuales con GPU que especifique las siguientes propiedades:

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

  • Una GPU NVIDIA T4 para conectar a las máquinas virtuales.

  • Debian como proyecto de imagen.

  • Debian 10 como familia de imágenes.

Para crear la plantilla de instancia de ejemplo, realice 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 obtener más opciones de configuración al crear una plantilla de instancia, consulte Crear una plantilla de instancia en este documento.

Crear una plantilla de instancia con una imagen de contenedor

Puede especificar una imagen de contenedor en una plantilla de instancia. De forma predeterminada, Compute Engine también incluye en la plantilla una imagen del sistema operativo optimizado para contenedores con Docker instalado. Cuando utiliza la plantilla para crear una nueva instancia, el contenedor se inicia automáticamente cuando se inicia la instancia.

Consola

  1. Vaya a la página de plantillas de instancia .

    Ir a plantillas de instancia

  2. Haga 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 , especifique la imagen del contenedor que se utilizará.

    • Puede especificar una imagen desde 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 del contenedor NGINX disponible en Google Cloud Marketplace.
      • us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 selecciona una imagen de muestra hello-app almacenada en Artifact Registry.
    • Si utiliza una imagen de contenedor de Docker Hub, especifique siempre el nombre completo de la imagen de Docker. Por ejemplo, especifique el siguiente nombre de imagen para implementar una imagen de contenedor Apache: docker.io/httpd:2.4 .
  5. Opcionalmente, haga clic en Opciones avanzadas de contenedor . Para obtener más información, consulte Configuración de opciones para ejecutar su contenedor .

  6. Haga clic en Crear .

nube de 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

Reemplace lo siguiente:

  • INSTANCE_TEMPLATE_NAME : el nombre de la plantilla a crear.
  • CONTAINER_IMAGE : el nombre completo de la imagen del contenedor que se utilizará.

Por ejemplo, el siguiente comando crea una nueva plantilla de instancia denominada nginx-vm . Una instancia de VM creada a partir de esta plantilla inicia y ejecuta la imagen del 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

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

También puede configurar opciones para ejecutar su contenedor .

Crear una plantilla de instancia que especifique una subred

nube de gcloud

Para crear una plantilla de instancia regional o global, use el comando instance-templates create . Utilice el indicador --subnet para colocar instancias creadas a partir de la plantilla en la subred de su elección. El indicador --subnet requiere el indicador --region .

Si desea crear una plantilla de instancia regional, debe usar el indicador --instance-template-region para establecer la región de la plantilla. Asegúrese de utilizar una subred de la misma región donde desea 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

Reemplace lo siguiente:

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

  • STACK_TYPE : Opcional: si IPv6 está habilitado en la interfaz de red predeterminada. Se pueden utilizar los siguientes valores: IPV4_ONLY , IPV4_IPV6 o IPV6_ONLY ( Vista previa ). Si no incluye esta bandera, el valor predeterminado es IPV4_ONLY .

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

El siguiente ejemplo 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 es 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

Ir

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());
    }
  }
}

Nodo.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();

Pitón

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)

El uso de esta plantilla para crear instancias para un MIG (con o sin ajuste de escala automático ) crea automáticamente la instancia en la región y subred especificadas. Esto le permite controlar la subred de nuevas instancias creadas para el equilibrio de carga.

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

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

  • Imágenes personalizadas. Como los MIG están diseñados para agregar y eliminar instancias con frecuencia, resulta útil crear una imagen personalizada y especificarla en la plantilla de instancia. Puede preparar su imagen con las aplicaciones y configuraciones que sus máquinas virtuales necesitan, de modo que no tenga que configurar manualmente esos elementos en máquinas virtuales individuales en el MIG.

  • Imágenes públicas. Puede crear una plantilla de instancia que utilice una imagen pública y un script de inicio para preparar la instancia después de que comience a ejecutarse.

Las imágenes personalizadas son más deterministas y se inician más rápidamente que las VM con scripts de inicio. Sin embargo, los scripts de inicio son más flexibles, lo que le ayuda a actualizar las aplicaciones y la configuración en sus instancias.

Si administra imágenes utilizando familias de imágenes , puede especificar el nombre de su familia de imágenes públicas o personalizadas en la plantilla de instancia. Para obtener más información sobre familias de imágenes, consulta las mejores prácticas al usar familias de imágenes en Compute Engine.

¿Qué sigue?