Criar modelos de instância


Esta página descreve como criar e gerenciar modelos de instância . Os modelos de instância permitem especificar o tipo de máquina, a imagem do disco de inicialização, a rede e outras propriedades de VM que você deseja usar ao criar instâncias de máquina virtual (VM).

Você pode usar modelos de instância para fazer o seguinte:

Antes de começar

Limitações

  • A VPC compartilhada em interfaces diferentes de nic0 para modelos de instância é compatível com gcloud CLI e REST, mas não no console do Google Cloud.
  • Não é possível atualizar um modelo de instância existente nem alterar um modelo de instância depois de ele ter sido criado. Se um modelo de instância ficar desatualizado ou você precisar fazer alterações na configuração, crie um novo modelo de instância.
  • Se quiser especificar uma família de imagens em um modelo de instância, não será possível usar o console do Google Cloud. Você pode usar a Google Cloud CLI ou REST.
  • Se você quiser especificar discos regionais em vez de discos zonais em um modelo de instância, não poderá usar o console do Google Cloud. Você pode usar a Google Cloud CLI ou REST.
  • Você pode usar um modelo de instância para criar VMs com um disco de inicialização balanceado de hiperdisco que esteja em um pool de armazenamento , se o pool de armazenamento existir na mesma zona em que a VM foi criada. Você não pode usar modelos de instância globais para criar VMs com discos que não sejam de inicialização que estejam em um pool de armazenamento.

Crie um modelo de instância

A maioria das propriedades de VM que você pode especificar em uma solicitação para criar uma instância de VM individual também pode ser especificada para um modelo de instância, incluindo quaisquer metadados de VM, scripts de inicialização, discos permanentes e contas de serviço. Você deve especificar o tipo de máquina, o disco de inicialização e a rede.

Crie um modelo de instância regional ou global por meio do console do Google Cloud , da CLI do Google Cloud ou da API . Para criar um modelo de instância global, você também pode usar o Terraform ou as bibliotecas de cliente do Cloud .

Console

  1. No console do Google Cloud, acesse a página Modelos de instância .

    Vá para modelos de instância

    As etapas restantes aparecem no console do Google Cloud.

  2. Clique Criar modelo de instância .
  3. Selecione o local da seguinte forma:
    1. Se quiser usar o modelo de instância entre regiões, escolha Global .
    2. Se quiser reduzir a dependência entre regiões, escolha Regional .
  4. Se você escolheu regional, selecione a região onde deseja criar seu modelo de instância.
  5. Para os campos a seguir, aceite os valores padrão ou modifique-os conforme necessário. Os valores padrão mudam com base na família de máquinas selecionada.

    • Selecione um Tipo de máquina .
    • Para atualizar o tipo ou imagem do disco de inicialização, na seção Disco de inicialização seção, clique em Alterar .
    • Para atualizar as configurações da interface de rede ou do endereço IP, clique em Opções avançadas , clique em Rede e clique na interface de rede que deseja editar.
  6. Opcional: Se você escolher uma imagem compatível com VM protegida, altere as configurações de VM protegida da VM:

    1. Clique em Opções avançadas e, em seguida, clique na guia Segurança .
    2. Se você deseja desativar a inicialização segura, desmarque a caixa de seleção Ativar inicialização segura . A inicialização segura ajuda a proteger suas instâncias de VM contra malware e rootkits em nível de inicialização e de kernel. Para obter mais informações, consulte Inicialização segura .
    3. Se desejar desabilitar o módulo de plataforma confiável virtual (vTPM), desmarque a caixa de seleção Ativar vTPM . O vTPM permite a inicialização medida, que valida a pré-inicialização da VM e a integridade da inicialização. Para obter mais informações, consulte Módulo de plataforma confiável virtual (vTPM) .

    4. Se quiser desabilitar o monitoramento de integridade, desmarque a caixa de seleção Ativar monitoramento de integridade . O monitoramento de integridade permite monitorar a integridade de inicialização das instâncias de VM protegidas usando o Cloud Monitoring. Para obter mais informações, consulte Monitoramento de integridade .

  7. Opcional: em Opções avançadas , clique nas guias para personalizar ainda mais seu modelo. Por exemplo, você pode adicionar até 15 discos secundários sem inicialização.

  8. Opcional: clique em REST equivalente para visualizar o corpo da solicitação REST, que inclui a representação JSON do seu modelo de instância.

  9. Clique em Criar para criar o modelo.

gcloud

Para criar um modelo de instância regional ou global, use o comando instance-templates create . Para um modelo de instância regional, você deve usar o sinalizador --instance-template-region para definir a região do modelo.

Crie um modelo de instância regional usando o comando a seguir.

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

Substitua REGION pela região onde você deseja criar o modelo de instância regional.

Crie um modelo de instância global usando o seguinte comando:

gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME

Se você não fornecer configurações de modelo explícitas, gcloud compute usará os seguintes valores padrão:

  • Tipo de máquina: o tipo de máquina — por exemplo, n1-standard-1
  • Imagem: a imagem mais recente do Debian
  • Disco de inicialização: um novo disco de inicialização padrão com o nome da VM
  • Rede: a rede VPC padrão
  • Endereço IP: um endereço IPv4 externo efêmero
  • Tipo de pilha: IPV4_ONLY

Você também pode fornecer explicitamente essas definições de configuração. Por exemplo:

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

Você pode adicionar até 15 discos secundários sem inicialização. Especifique o sinalizador --create-disk para cada disco secundário criado. Para criar discos secundários a partir de uma imagem pública ou personalizada, especifique as propriedades image e image-project para cada disco no sinalizador --create-disk . Para criar um disco vazio, não inclua essas propriedades. Opcionalmente, inclua propriedades para o size e type do disco. Para especificar discos regionais, use a propriedade 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

Dica: Ao especificar o parâmetro disk replica-zones , os caracteres ^:^ especificam que o caractere de separação entre valores é dois pontos ( : ) em vez da vírgula esperada ( , ).

Substitua o seguinte:

  • INSTANCE_TEMPLATE_NAME : o nome do modelo
  • MACHINE_TYPE : o tipo de máquina das VMs
  • DISK_IMAGE_FAMILY : uma família de imagens para usar como disco que não é de inicialização

    Para mais informações sobre famílias de imagens, consulte as práticas recomendadas ao usar famílias de imagens no Compute Engine.

    Em vez disso, você pode usar o sinalizador --image= IMAGE para especificar uma versão específica de uma imagem.

    Para discos vazios, não especifique a propriedade image-family ou image .

  • DISK_IMAGE_PROJECT : o projeto de imagem que contém a imagem

    Para discos vazios, não especifique a propriedade image-project . Para obter mais informações sobre imagens públicas, consulte Imagens públicas .

  • SIZE_GB_DISK1 e SIZE_GB_DISK2 : o tamanho de cada disco secundário

  • DISK_NAME : opcional: o nome do disco exibido para o sistema operacional convidado após a criação da VM.

  • DISK_TYPE : Opcional: o tipo de disco a ser criado. Se não for especificado, o tipo de disco padrão usado dependerá do valor do sinalizador --machine-type .

  • ZONE e REMOTE_ZONE : a zona para criar o disco regional e a zona para replicá-lo.

    Para discos zonais, não inclua a propriedade replica-zones .

Se você escolher uma imagem compatível com VM protegida , poderá alterar opcionalmente as configurações de VM protegida da instância usando uma das seguintes sinalizações:

  • --no-shielded-secure-boot : desativa a inicialização segura

    A inicialização segura ajuda a proteger suas instâncias de VM contra malware e rootkits em nível de inicialização e de kernel. Para obter mais informações, consulte Inicialização segura .

  • --no-shielded-vtpm : desativa o módulo de plataforma confiável virtual (vTPM)

    O vTPM habilita a inicialização medida, que valida a pré-inicialização da VM e a integridade da inicialização. Para obter mais informações, consulte Módulo de plataforma confiável virtual (vTPM) .

  • --no-shielded-integrity-monitoring : desativa o monitoramento de integridade

    O monitoramento de integridade permite monitorar a integridade de inicialização das instâncias de VM protegidas usando o Cloud Monitoring. Para obter mais informações, consulte Monitoramento de integridade .

Para obter uma lista de todos os subcomandos e sinalizadores disponíveis, consulte a referência instance-templates .

Um modelo com as configurações padrão pode ter a seguinte aparência:

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

Terraforma

Para criar um modelo de instância, você pode usar o recurso google_compute_instance_template .

O exemplo do Terraform a seguir é semelhante ao seguinte comando da CLI 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 saber como aplicar ou remover uma configuração do Terraform, consulte Comandos básicos do 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());
    }
  }
}

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

Pitão

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 criar um modelo de instância regional, faça uma solicitação POST para o método regionInstanceTemplates.insert da seguinte forma:

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

Para criar um modelo de instância global, faça uma solicitação POST para o método instanceTemplates.insert :

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

Você pode adicionar até 15 discos secundários sem inicialização usando a propriedade disks , com um campo para cada disco adicional. Para cada disco adicional, você pode fazer o seguinte:

  • Crie discos adicionais com uma imagem pública ou personalizada.
  • Para adicionar um disco vazio, defina a entrada initializeParams sem valor sourceImage .
  • Para criar discos regionais, defina a entrada initializeParams com a propriedade replicaZones .

No corpo da solicitação, forneça as propriedades do modelo:

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

Substitua o seguinte:

  • PROJECT_ID : o ID do seu projeto
  • REGION : a região onde você deseja criar seu modelo de instância regional
  • INSTANCE_TEMPLATE_NAME : o nome do modelo de instância
  • ZONE : a zona onde as VMs estão localizadas
  • MACHINE_TYPE : o tipo de máquina das VMs

  • IMAGE_PROJECT : o projeto de imagem que contém a imagem

    Para obter mais informações sobre imagens públicas, consulte Imagens públicas .

  • IMAGE ou IMAGE_FAMILY : especifique um dos seguintes:
    • IMAGE : uma versão específica da imagem

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

    • IMAGE_FAMILY : uma família de imagens

      Isso cria a VM a partir da imagem do sistema operacional mais recente e não obsoleta. Por exemplo, se você especificar "sourceImage": "projects/debian-cloud/global/images/family/debian-10" , o Compute Engine criará uma VM a partir da versão mais recente da imagem do sistema operacional na família de imagens Debian 10.

      Para mais informações sobre famílias de imagens, consulte as práticas recomendadas ao usar famílias de imagens no Compute Engine.

  • DISK_NAME : opcional: o nome do disco exibido para o sistema operacional convidado após a criação da VM.

  • PROJECT_NAME : o projeto associado à VM

  • REMOTE_ZONE : a zona onde o disco regional deve ser replicado

Você pode especificar uma das seguintes opções para a propriedade disks :

  • Especifique initializeParams para criar discos de inicialização para cada instância. Você pode criar discos usando imagens públicas ou personalizadas (ou famílias de imagens ) usando a propriedade sourceImage , conforme mostrado no exemplo anterior. Para adicionar discos vazios, não especifique sourceImage . Você também pode adicionar até 15 discos secundários sem inicialização usando a propriedade initializeParams para cada disco adicional.

  • Especifique source para anexar um disco de inicialização existente. Se você anexar um disco de inicialização existente, poderá criar apenas uma instância do seu modelo.

Opcionalmente, você pode especificar as propriedades diskSizeGb , diskType e labels para initializeParams e a propriedade diskSizeGb para source .

Se você escolher uma imagem compatível com VM protegida , poderá alterar opcionalmente as configurações de VM protegida da VM usando os seguintes itens do corpo da solicitação booleana:

  • enableSecureBoot : ativa ou desativa a inicialização segura

    A inicialização segura ajuda a proteger suas instâncias de VM contra malware e rootkits em nível de inicialização e de kernel. Para obter mais informações, consulte Inicialização segura .

  • enableVtpm : ativa ou desativa o módulo de plataforma confiável virtual (vTPM)

    O vTPM habilita a inicialização medida, que valida a pré-inicialização da VM e a integridade da inicialização. Para obter mais informações, consulte Módulo de plataforma confiável virtual (vTPM) .

  • enableIntegrityMonitoring : ativa ou desativa o monitoramento de integridade

    O monitoramento de integridade permite monitorar e verificar a integridade da inicialização do tempo de execução das instâncias de VM protegida usando relatórios do Cloud Monitoring. Para obter mais informações, consulte Monitoramento de integridade .

Para saber mais sobre parâmetros de solicitação, consulte o método instanceTemplates.insert .

Crie um modelo de instância com base em uma instância existente

Você pode usar REST ou CLI gcloud para salvar a configuração de uma instância de VM existente como um modelo de instância. Opcionalmente, você pode substituir a forma como os discos de origem são definidos no modelo.

Se você precisar substituir outras propriedades, primeiro crie um modelo de instância com base em uma instância existente e, em seguida, crie um modelo semelhante com substituições adicionais.

gcloud

Use o comando gcloud compute instance-templates create com os sinalizadores --source-instance e --source-instance-zone . Se quiser criar um modelo de instância regional, você também deverá usar o sinalizador --instance-template-region para especificar a região do modelo de instância.

Para criar um modelo de instância regional, use o seguinte comando:

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

Para criar um modelo de instância global, use o seguinte comando:

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

Para substituir como os discos da instância de origem são definidos, adicione um ou mais sinalizadores --configure-disk .

O exemplo a seguir cria um modelo de instância global a partir de uma instância existente e substitui o disco da instância de origem pelas especificações fornecidas por você.

  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

Substitua o seguinte:

  • INSTANCE_TEMPLATE_NAME é o nome do modelo a ser criado.
  • SOURCE_INSTANCE é o nome da instância a ser usada como modelo para o novo modelo.
  • SOURCE_INSTANCE_ZONE é a zona que contém a instância de origem.
  • SOURCE_DISK é o nome de um disco de instância de origem que você deseja substituir no modelo.
  • INSTANTIATE_OPTIONS especifica se o disco deve ser incluído e qual imagem usar. Os valores válidos dependem do tipo de disco:

    • source-image ou source-image-family (válido apenas para inicialização e outros discos persistentes de leitura e gravação). Especifique esta opção se quiser usar a mesma imagem de origem ou família de imagens de origem que foi usada para criar o disco na instância de VM de origem.
    • custom-image (válida apenas para inicialização e outros discos persistentes de leitura e gravação). Se quiser manter aplicativos e configurações das VMs de origem em seu modelo de instância, você poderá criar uma imagem personalizada e especificá-la ao criar o modelo. Se especificado, forneça o caminho ou URL da imagem personalizada, conforme mostrado no exemplo a seguir. Alternativamente, você pode especificar uma família de imagens usando o seguinte 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 apenas para discos somente leitura).

    • blank (válido apenas para discos permanentes sem inicialização e SSDs locais). Se especificado, então, quando o modelo for usado para criar uma nova instância, o disco será criado não formatado. Você deve formatar e montar o disco em um script de inicialização antes de poder usá-lo em uma configuração escalável.

    • do-not-include (válido apenas para discos permanentes sem inicialização e discos somente leitura).

  • AUTO_DELETE especifica se o disco será excluído automaticamente quando a instância for excluída. Os valores válidos são: false , no , true e yes .

Por exemplo, o comando a seguir cria um modelo de instância baseado em my-source-instance , com a opção de usar a imagem original de data-disk-a , mas definir auto-delete como true e substituir data-disk-b por uma imagem 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());
    }
  }
}

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

Pitão

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 criar um modelo de instância regional, use o método regionInstanceTemplates.insert ou, para criar um modelo de instância global, use o método instanceTemplates.insert .

Na sua solicitação, você deve especificar o campo sourceInstance . Para substituir como os discos da instância de origem são definidos, adicione um ou mais campos diskConfigs .

Por exemplo, faça a chamada a seguir para criar um modelo de instância global a partir de uma instância 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
      }
    ]
  }
}

Substitua o seguinte:

  • PROJECT_ID : o ID do seu projeto
  • INSTANCE_TEMPLATE_NAME : o nome do novo modelo
  • SOURCE_INSTANCE_ZONE : a zona da instância de origem
  • SOURCE_INSTANCE : o nome da instância de origem a ser usada como modelo para este modelo de instância
  • SOURCE_DISK : o nome de um disco de instância de origem que você deseja substituir no modelo
  • INSTANTIATE_OPTIONS : especifica se o disco deve ser incluído e qual imagem usar

    Os valores válidos dependem do tipo de disco:

    • source-image ou source-image-family (válido apenas para inicialização e outros discos persistentes de leitura e gravação).
    • custom-image (válida apenas para inicialização e outros discos persistentes de leitura e gravação). Se quiser manter aplicativos e configurações das VMs de origem em seu modelo de instância, você poderá criar uma imagem personalizada e especificá-la ao criar o modelo. Se especificado, forneça o caminho ou URL da imagem personalizada, conforme mostrado no exemplo a seguir. Alternativamente, você pode especificar uma família de imagens usando o seguinte formato:

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

    • blank (válido apenas para discos permanentes sem inicialização e SSDs locais). Se especificado, então, quando o modelo for usado para criar uma nova instância, o disco será criado não formatado. Você deve formatar e montar o disco em um script de inicialização antes de poder usá-lo em uma configuração escalável.

    • do-not-include (válido apenas para discos permanentes sem inicialização e discos somente leitura).

O exemplo a seguir cria um novo modelo de instância baseado em my-source-instance . No modelo de instância, a imagem para data-disk-a é substituída 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"
      }
    ]
  }
}

A tabela a seguir mostra como as opções para substituir discos são definidas no modelo.

Tipo de disco Opções
Disco de inicialização
  • [Padrão] Use a mesma imagem de origem ou família de imagens usada para criar o disco de inicialização na instância de origem.
  • Use o URL de qualquer imagem (personalizada ou pública) conforme descrito no exemplo anterior ou especifique uma família de imagens usando o seguinte formato:
  • projects/exampleproject/global/images/family/ IMAGE_FAMILY_NAME

Outros discos permanentes de leitura/gravação
  • [Padrão] Use a mesma imagem de origem/família de imagens de origem que foi usada para criar o disco na instância de origem. Observação: se o disco da instância de origem não tiver uma propriedade de imagem de origem/família de imagens de origem, ele será incluído no modelo como um disco em branco.
  • Use o URL de qualquer imagem (personalizada ou pública) conforme descrito no exemplo anterior ou especifique uma família de imagens usando o seguinte formato:

    projects/exampleproject/global/images/family/ IMAGE_FAMILY_NAME

  • Use um disco vazio no modelo. Quando o modelo é usado para criar uma nova instância, esse disco é criado sem formatação. Você deve formatar e montar o disco em um script de inicialização antes de poder usá-lo em uma configuração escalável.
  • Não inclua o disco.
Disco(s) somente leitura
  • [Padrão] Inclui o disco no modo somente leitura.
  • Não inclua o disco.
SSD(s) locais
  • [Padrão] Inclui um SSD local em branco. Quando o modelo é usado para criar uma nova instância, esse disco é criado sem formatação. Você deve formatar e montar o disco em um script de inicialização antes de poder usá-lo em uma configuração escalável.

Para cada disco, você também pode substituir o atributo auto-delete para especificar se o disco deve ser excluído quando sua instância associada for excluída.

Por padrão, se nenhuma opção de substituição for especificada, a configuração do disco no modelo corresponderá à instância de origem.

Crie um modelo de instância com base em um modelo existente

Não é possível atualizar um modelo de instância existente. Porém, se um modelo de instância ficar desatualizado ou se você precisar fazer alterações, você poderá criar outro com propriedades semelhantes usando o console.

  1. Acesse a página Modelos de instância .

    Vá para modelos de instância

  2. Clique no modelo de instância que você deseja copiar e atualizar.

  3. Clique em Criar semelhante .

  4. Atualize a configuração no novo modelo.

  5. Clique em Criar .

Crie um modelo de instância para VMs GPU

Ao criar um modelo de instância, você pode configurá-lo para criar VMs que tenham GPUs anexadas especificando o seguinte:

Console

Para criar um modelo de instância para VMs de GPU, faça o seguinte:

  1. No console do Google Cloud, acesse a página Modelos de instância .

    Vá para modelos de instância

  2. Clique em Criar modelo de instância .

  3. No campo Nome , insira um nome para o modelo de instância.

  4. Na seção Localização , selecione uma das seguintes opções:

    • Para criar um modelo de instância global, selecione Global (padrão).

    • Para criar um modelo de instância regional, selecione Regional e selecione a região onde deseja criar o modelo de instância.

  5. Na seção Configuração da máquina , faça o seguinte:

    1. Clique na guia GPUs .

    2. No menu Tipo de GPU , selecione o tipo de GPU.

    3. No menu Número de GPUs , selecione o número de GPUs.

    4. Opcional: se o seu modelo de GPU suportar estações de trabalho virtuais NVIDIA RTX (vWS) para cargas de trabalho gráficas e você planeja executar cargas de trabalho com uso intensivo de gráficos, selecione Habilitar estação de trabalho virtual (NVIDIA GRID) .

    5. Na seção Tipo de máquina , selecione um tipo de máquina.

  6. Opcional: Para alterar o tipo ou imagem do disco de inicialização do valor padrão, na seção Disco de inicialização , clique em Alterar . Em seguida, siga as instruções para alterar o disco de inicialização.

  7. Clique em Criar .

gcloud

Para criar um modelo de instância para VMs GPU, use o comando instance-templates create com o sinalizador --maintenance-policy definido como TERMINATE .

Por exemplo, para criar um modelo de instância global para VMs de GPU, use o seguinte comando:

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

Substitua o seguinte:

  • INSTANCE_TEMPLATE_NAME : o nome do modelo de instância.

  • IMAGE_PROJECT : o projeto de imagem que contém a imagem; por exemplo, debian-cloud . Para obter mais informações sobre os projetos de imagem suportados, consulte Imagens públicas .

  • IMAGE_FAMILY ou IMAGE : especifique um dos seguintes:

    • IMAGE_FAMILY : uma família de imagens . Isso especifica a imagem do sistema operacional mais recente e não obsoleta. Por exemplo, se você especificar debian-10 , a versão mais recente da família de imagens Debian 10 será usada. Para obter mais informações sobre o uso de famílias de imagens, consulte Práticas recomendadas para famílias de imagens .

    • IMAGE : uma versão específica da imagem do SO; por exemplo, debian-10-buster-v20200309 . Se você optar por especificar uma versão específica da imagem do sistema operacional, deverá substituir o sinalizador --image-family pelo sinalizador --image .

  • MACHINE_TYPE : o tipo de máquina das VMs. Se você especificar um tipo de máquina N1, inclua o sinalizador --accelerator para especificar o número e o tipo de GPUs a serem anexadas às suas VMs.

Por exemplo, suponha que você queira criar um modelo de instância global para VMs de GPU que especifique as seguintes propriedades:

  • Um tipo de máquina predefinido N1 com 2 vCPUs.

  • Uma GPU NVIDIA T4 para anexar às VMs.

  • Debian como projeto de imagem.

  • Debian 10 como família de imagens.

Para criar o modelo de instância de exemplo, use o seguinte 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

Terraforma

Para criar um modelo de instância para VMs GPU, use o recurso google_compute_region_instance_template .

Por exemplo, para criar um modelo de instância global, que especifica um tipo de máquina predefinido N1 com 2 vCPUs e uma GPU NVIDIA T4 anexada, use o seguinte 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 saber como aplicar ou remover uma configuração do Terraform, consulte Comandos básicos do Terraform .

DESCANSAR

Para criar um modelo de instância para VMs GPU, faça uma solicitação POST para o método instanceTemplates.insert . No corpo da solicitação, inclua o campo onHostMaintenance e defina-o como TERMINATE .

Por exemplo, para criar um modelo de instância global para VMs GPU, faça uma solicitação POST da seguinte forma:

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

Substitua o seguinte:

  • PROJECT_ID : o ID do projeto no qual você deseja criar o modelo de instância.

  • INSTANCE_TEMPLATE_NAME : o nome do modelo de instância.

  • IMAGE_PROJECT : o projeto de imagem que contém a imagem; por exemplo, debian-cloud . Para obter mais informações sobre os projetos de imagem suportados, consulte Imagens públicas .

  • IMAGE ou IMAGE_FAMILY : especifique um dos seguintes:

    • IMAGE : uma versão específica da imagem do SO; por exemplo, debian-10-buster-v20200309 .

    • IMAGE_FAMILY : uma família de imagens . Isso especifica a imagem do sistema operacional mais recente e não obsoleta. Por exemplo, se você especificar family/debian-10 , a versão mais recente da família de imagens Debian 10 será usada. Para obter mais informações sobre o uso de famílias de imagens, consulte Práticas recomendadas para famílias de imagens .

  • MACHINE_TYPE : o tipo de máquina das VMs. Se você especificar um tipo de máquina N1, inclua o campo guestAccelerators para especificar o número e o tipo de GPUs a serem anexadas às suas VMs.

Por exemplo, suponha que você queira criar um modelo de instância global para VMs de GPU que especifique as seguintes propriedades:

  • Um tipo de máquina predefinido N1 com 2 vCPUs.

  • Uma GPU NVIDIA T4 para anexar às VMs.

  • Debian como projeto de imagem.

  • Debian 10 como família de imagens.

Para criar o modelo de instância de exemplo, faça uma solicitação POST da seguinte maneira:

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 obter mais opções de configuração ao criar um modelo de instância, consulte Criar um modelo de instância neste documento.

Crie um modelo de instância com uma imagem de contêiner

Você pode especificar uma imagem de contêiner em um modelo de instância. Por padrão, o Compute Engine também inclui no modelo uma imagem do Container-Optimized OS com o Docker instalado. Quando você usa o modelo para criar uma nova instância, o contêiner é iniciado automaticamente assim que a instância é inicializada.

Console

  1. Acesse a página Modelos de instância .

    Vá para modelos de instância

  2. Clique em Criar modelo de instância .

  3. Na seção Contêiner , clique em Implantar Contêiner .

  4. Na caixa de diálogo Configurar contêiner , especifique a imagem do contêiner a ser usada.

    • Você pode especificar uma imagem do Container Registry ou do Artifact Registry . Por exemplo:
      • gcr.io/cloud-marketplace/google/nginx1: TAG , onde TAG é a tag definida para uma versão específica da imagem de contêiner NGINX disponível no Google Cloud Marketplace.
      • us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 seleciona uma imagem de amostra hello-app armazenada no Artifact Registry.
    • Se você usar uma imagem de contêiner do Docker Hub, sempre especifique o nome completo da imagem do Docker. Por exemplo, especifique o seguinte nome de imagem para implementar uma imagem de contêiner Apache: docker.io/httpd:2.4 .
  5. Opcionalmente, clique em Opções avançadas de contêiner . Para obter mais informações, consulte Configurando opções para executar seu Container .

  6. Clique em Criar .

gcloud

Use o comando gcloud compute instance-templates create-with-container :

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

Substitua o seguinte:

  • INSTANCE_TEMPLATE_NAME : o nome do modelo a ser criado.
  • CONTAINER_IMAGE : o nome completo da imagem do contêiner a ser usada.

Por exemplo, o comando a seguir cria um novo modelo de instância denominado nginx-vm . Uma instância de VM criada a partir deste modelo inicia e executa a imagem do contêiner, gcr.io/cloud-marketplace/google/nginx1: TAG , quando a VM é iniciada.

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

Substitua TAG pela tag definida para uma versão específica da imagem de contêiner NGINX disponível no Google Cloud Marketplace.

Você também pode configurar opções para executar seu contêiner .

Crie um modelo de instância que especifique uma sub-rede

gcloud

Para criar um modelo de instância regional ou global, use o comando instance-templates create . Use o sinalizador --subnet para colocar instâncias criadas a partir do modelo na sub-rede de sua escolha. O sinalizador --subnet requer o sinalizador --region .

Se quiser criar um modelo de instância regional, você deverá usar o sinalizador --instance-template-region para definir a região do modelo. Certifique-se de usar uma sub-rede da mesma região onde deseja criar o modelo de instância 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

Substitua o seguinte:

  • INSTANCE_TEMPLATE_NAME : o nome do modelo de instância
  • REGION : a região da sub-rede
  • SUBNET_NAME_OR_URL : o nome da sub-rede ou seu URL

  • STACK_TYPE : Opcional: se o IPv6 está habilitado na interface de rede padrão. Os seguintes valores podem ser usados: IPV4_ONLY , IPV4_IPV6 ou IPV6_ONLY ( Preview ). Se você não incluir esse sinalizador, o valor padrão será IPV4_ONLY .

  • INSTANCE_TEMPLATE_REGION : a região onde você deseja criar o modelo de instância. Esta região deve ser igual a REGION .

O exemplo a seguir cria um modelo chamado template-qa que cria apenas instâncias na sub-rede subnet-us-qa .

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

A saída é semelhante à seguinte:

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

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

Pitão

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)

Usar este modelo para criar instâncias para um MIG (com ou sem escalonamento automático ) cria automaticamente a instância na região e sub-rede especificadas. Isso permite controlar a sub-rede de novas instâncias criadas para balanceamento de carga.

Use imagens personalizadas ou públicas em seus modelos de instância

Você pode usar uma imagem personalizada ou pública para seus modelos de instância:

  • Imagens personalizadas. Como os MIGs são projetados para adicionar e remover instâncias com frequência, é útil criar uma imagem personalizada e especificá-la no modelo de instância. Você pode preparar sua imagem com os aplicativos e configurações que suas VMs precisam, para não precisar configurar manualmente esses itens em VMs individuais no MIG.

  • Imagens públicas. Você pode criar um modelo de instância que use uma imagem pública e um script de inicialização para preparar a instância depois que ela começar a ser executada.

As imagens personalizadas são mais determinísticas e iniciam mais rapidamente do que as VMs com scripts de inicialização. No entanto, os scripts de inicialização são mais flexíveis, o que ajuda a atualizar os aplicativos e as configurações nas suas instâncias.

Se você estiver gerenciando imagens usando famílias de imagens , poderá especificar o nome da sua família de imagens personalizada ou pública no modelo de instância. Para mais informações sobre famílias de imagens, consulte as práticas recomendadas ao usar famílias de imagens no Compute Engine.

O que vem a seguir