Editar o tipo de máquina de uma instância da computação


Se a instância de máquina virtual (VM) não tiver um SSD local anexado e não fizer parte de um grupo de instâncias gerenciadas (MIG, na sigla em inglês), será possível mudar o tipo de máquina da instância depois de interrompê-la.

Se o tipo de máquina atual não for adequado para as cargas de trabalho executadas na VM, altere o tipo de máquina dessa VM. Por exemplo, é possível iniciar uma VM com um tipo de máquina menor durante a instalação, o desenvolvimento e o teste, e alterar a VM para usar um tipo de máquina maior quando você estiver pronto para cargas de trabalho de produção.

Use esse procedimento nas seguintes situações:

  • Para mudar para um tipo de máquina semelhante, mas com um número diferente de vCPUs ou memória na mesma série de máquinas, por exemplo:
    • Você pode mudar n2-highcpu-4 para n2-standard-4.
    • Você pode mudar c3d-standard-30 para c3d-highmem-30.
  • Ao mudar o tipo de máquina para usar uma série diferente. Isso é compatível apenas com séries de máquinas de primeira e segunda geração, excluindo as séries de máquinas T2A e A2. Por exemplo:
    • Você pode mudar n2-standard-4 para c2-standard-8.
    • Você pode mudar de n1-highmem-4 para n2d-standard-16.

Se você quiser alterar o tipo de máquina de uma VM que usa uma séries de máquinas de primeira ou segunda geração (N1, N2, M1 etc.) a um tipo de máquina para uma série de máquinas de terceira geração ou posterior (M3, C3, N4 etc.), é preciso usar o procedimento documentado em Mover a carga de trabalho para uma nova instância da computação.

É possível alterar o tipo de máquina sem afetar os seguintes recursos:

  • Chaves SSH da VM
  • As configurações da VM, como metadados
  • Os dados no Persistent Disk ou Hyperdisk anexado, incluindo aplicativos instalados e dados de aplicativos

Para mudar o tipo de máquina de VMs em um MIG, consulte Aplicar automaticamente as atualizações de configuração de VM em um MIG.

Antes de começar

  • Entenda como interromper uma VM.
  • Entenda os tipos de máquina.
  • Configure a autenticação, caso ainda não tenha feito isso. A autenticação é o processo de verificação da sua identidade para acesso a serviços e APIs do Google Cloud. Para executar códigos ou amostras de um ambiente de desenvolvimento local, autentique-se no Compute Engine selecionando uma das seguintes opções:

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

    Console

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

    Java

    Para usar os exemplos Java desta página em um ambiente de desenvolvimento local, instale e inicialize o gcloud CLI e e configure o Application Default Credentials com suas credenciais de usuário.

    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

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

      gcloud auth application-default login

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

    Confira mais informações em Set up authentication for a local development environment.

    Python

    Para usar os exemplos Python desta página em um ambiente de desenvolvimento local, instale e inicialize o gcloud CLI e e configure o Application Default Credentials com suas credenciais de usuário.

    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

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

      gcloud auth application-default login

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

    Confira mais informações em Set up authentication for a local development environment.

    REST

    Para usar as amostras da API REST nesta página em um ambiente de desenvolvimento local, use as credenciais fornecidas para gcloud CLI.

      Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init

    Para mais informações, consulte Autenticar para usar REST na documentação de autenticação do Google Cloud.

Funções exigidas

Para ter as permissões necessárias para alterar o tipo de máquina de uma VM, peça ao administrador para conceder a você os seguintes papéis do IAM no projeto:

Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.

Esses papéis predefinidos têm as permissões necessárias para alterar o tipo de máquina de uma VM. Para conferir as permissões exatas necessárias, expanda a seção Permissões necessárias:

Permissões necessárias

As permissões a seguir são necessárias para alterar o tipo de máquina de uma VM:

  • compute.instances.setMachineType na VM
  • compute.instances.start na VM
  • compute.instances.stop na VM

Essas permissões também podem ser concedidas com funções personalizadas ou outros papéis predefinidos.

Limitações

Implicações no faturamento

Cada tipo de máquina é faturado com uma taxa diferente, por isso entenda as implicações de preços da alteração dos tipos de máquina. Por exemplo, um tipo de máquina e2-standard-2 custa mais do que um tipo de máquina e2-micro.

Alterar um tipo de máquina também pode afetar os descontos por uso prolongado para essa VM. Os descontos por uso prolongado são calculados separadamente para categorias diferentes na mesma região. Se você alterar os tipos de máquina para que o novo tipo de máquina esteja em uma categoria diferente, o ambiente de execução subsequente da instância de máquina virtual será computado para o desconto de uso prolongado da nova categoria.

Por exemplo, suponha que você tenha uma VM com o tipo de máquina n2-standard-2 em execução por meio mês. Você decide alterar o tipo de máquina para m1-ultramem-40. Depois que você fizer essa alteração, o Compute Engine começará a contar o ambiente de execução da instância de máquina virtual para o desconto por uso prolongado da vCPU e da categoria de memória.

Na sua fatura, você veria um desconto de uso prolongado aplicado ao tipo de máquina n2-standard-2 de antes de você fazer a alteração do tipo de máquina e um desconto de uso prolongado separado para m1-ultramem-40, se sua instância permanecer em execução em m1-ultramem-40 por pelo menos 25% do restante do mês.

Migrar para um tipo de máquina menor

Se você mudar de um tipo de máquina com mais recursos para um tipo de máquina com menos recursos, como mover de um tipo de máquina e2-standard-8 para um e2-standard-2, é possível ter problemas de recursos de hardware ou limitações de desempenho porque os tipos de máquinas menores são menos eficientes do que os tipos de máquinas maiores. Verifique se o novo tipo de máquina é compatível com os aplicativos ou serviços que estão sendo executados na VM atual ou se você atualizou os serviços e aplicativos para que eles sejam executados em tipos de máquinas menores.

Analise as recomendações de redimensionamento antes de alterar o tipo de máquina. Para informações sobre recomendações de dimensionamento do Compute Engine, consulte Como aplicar recomendações de tipo de máquina para instâncias de VM.

Práticas recomendadas

Veja algumas práticas recomendadas para ajudar você a alterar o tipo de máquina da VM.

  • Faça backups regulares dos dados do disco permanente usando snapshots. Crie um snapshot dos dados de discos permanentes antes de alterar o tipo de máquina. Se você quiser ter certeza de que o novo tipo de máquina é capaz de aceitar os dados na VM existente, é possível capturar um snapshot do disco permanente e usá-lo para iniciar uma segunda VM com o novo tipo de máquina para confirmar se a VM foi iniciada com sucesso.

  • Adicione mais discos ao arquivo /etc/fstab. Se você tiver outros discos anexados à sua VM, verifique se eles foram adicionados ao arquivo /etc/fstab para que sejam montados automaticamente quando a VM for reinicializada.

  • Crie uma reserva antes de alterar o tipo de máquina. Para evitar erros relacionados à disponibilidade de recursos, crie Reservas do Compute Engine para os novos tipos de máquina quando estão disponíveis para reservá-los em uma zona. As reservas ajudam a garantir que os recursos estejam disponíveis quando você precisa deles.

Para criar uma reserva, siga estas etapas:

  1. Crie uma reserva (ou identifique reservas existentes) com propriedades idênticas às VMs planejadas. A contagem de VMs da reserva precisa ser igual ou maior do que o número de VMs que você quer mudar. Se quiser evitar que outras VMs consumam essa reserva, use a opção specificReservationRequired.

  2. Verifique se as VMs planejadas poderão consumir a reserva:

    1. Verifique se as VMs têm a afinidade de reserva correta.
    2. Imediatamente antes de alterar as VMs, verifique se a reserva tem capacidade suficiente.

Alterar um tipo de máquina

Só é possível alterar o tipo de máquina de uma instância interrompida. Uma VM é considerada interrompida somente quando a VM está no estado TERMINATED. Não é possível alterar o tipo de máquina de uma VM em execução.

Se você estiver fazendo upgrade do seu tipo de máquina para a geração mais recente, consulte Avaliar as opções de migração de VM antes de continuar.

Console

  1. No console do Google Cloud, acesse a página Instâncias de VMs.

    Acessar instâncias de VM

  2. Na coluna Nome, clique no nome da instância para a qual você quer alterar o tipo de máquina.

  3. Na página Detalhes da instância, siga estas etapas:

    1. Se a VM estiver em execução, selecione Parar no menu na parte de cima da página.
    2. Para editar a VM, clique em Editar.
    3. Na seção Configuração da máquina, selecione o tipo de máquina que você quer usar ou crie um tipo de máquina personalizado.

    4. Para salvar as alterações, clique em Save.

    5. Reinicie a VM.

gcloud

  1. Interrompa a VM usando o comando gcloud compute instances stop:

    gcloud compute instances stop VM_NAME
    

    Substitua VM_NAME pela VM que contém o tipo de máquina a ser alterado.

  2. Altere o tipo de máquina usando o comando gcloud compute instances set-machine-type:

    gcloud compute instances set-machine-type VM_NAME \
        --machine-type NEW_MACHINE_TYPE
    

    Substitua NEW_MACHINE_TYPE pelo novo tipo de máquina para a VM. O tipo de máquina pode ser um dos seguintes:

  3. Interrompa a VM usando o comando gcloud compute instances start:

    gcloud compute instances start VM_NAME
    

    Substitua VM_NAME pelo nome da VM alterada.

Java

Java

Antes de testar esta amostra, siga as instruções de configuração do Java no Guia de início rápido do Compute Engine: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Java do Compute Engine.

Para autenticar-se no Compute Engine, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.


import com.google.cloud.compute.v1.Instance;
import com.google.cloud.compute.v1.Instance.Status;
import com.google.cloud.compute.v1.InstancesClient;
import com.google.cloud.compute.v1.InstancesSetMachineTypeRequest;
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 ChangeInstanceMachineType {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Cloud project you want to use.
    String projectId = "your-project-id";
    // Name of the zone your instance belongs to.
    String zone = "zone-name";
    // Name of the VM you want to modify.
    String instanceName = "instance-name";
    // The new machine type you want to use for the VM.
    // For example: "e2-standard-8", "e2-custom-4-2048" or "m1-ultramem-40"
    // More about machine types: https://cloud.google.com/compute/docs/machine-resource
    String newMachineType = "e2-standard-8";
    changeMachineType(projectId, zone, instanceName, newMachineType);
  }

  // Changes the machine type of VM.
  // The VM needs to be in the 'TERMINATED' state for this operation to be successful.
  public static void changeMachineType(String projectId, String zone, String instanceName,
      String newMachineType)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the `instancesClient.close()` method on the client to safely
    // clean up any remaining background resources.
    try (InstancesClient instancesClient = InstancesClient.create()) {

      Instance instance = instancesClient.get(projectId, zone, instanceName);
      if (!instance.getStatus().equals(Status.TERMINATED.name())) {
        throw new Error(String.format(
            "Only machines in TERMINATED state can have their machine type changed. "
                + "%s is in %s state.", instance.getName(), instance.getStatus()));
      }

      InstancesSetMachineTypeRequest machineTypeRequest =
          InstancesSetMachineTypeRequest.newBuilder()
              .setMachineType(String.format("projects/%s/zones/%s/machineTypes/%s",
                  projectId, zone, newMachineType))
              .build();

      Operation response = instancesClient
          .setMachineTypeAsync(projectId, zone, instanceName, machineTypeRequest)
          .get(3, TimeUnit.MINUTES);

      if (response.hasError()) {
        System.out.println("Machine type update failed! " + response);
        return;
      }
      System.out.println("Machine type update - operation status: " + response.getStatus());
    }
  }
}

Python

Python

Antes de testar esta amostra, siga as instruções de configuração do Python no Guia de início rápido do Compute Engine: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Python do Compute Engine.

Para autenticar-se no Compute Engine, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

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 change_machine_type(
    project_id: str, zone: str, instance_name: str, new_machine_type: str
) -> None:
    """
    Changes the machine type of VM. The VM needs to be in the 'TERMINATED' state for this operation to be successful.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        zone: name of the zone your instance belongs to.
        instance_name: name of the VM you want to modify.
        new_machine_type: the new machine type you want to use for the VM.
            For example: `e2-standard-8`, `e2-custom-4-2048` or `m1-ultramem-40`
            More about machine types: https://cloud.google.com/compute/docs/machine-resource
    """
    client = compute_v1.InstancesClient()
    instance = client.get(project=project_id, zone=zone, instance=instance_name)

    if instance.status != compute_v1.Instance.Status.TERMINATED.name:
        raise RuntimeError(
            f"Only machines in TERMINATED state can have their machine type changed. "
            f"{instance.name} is in {instance.status}({instance.status_message}) state."
        )

    machine_type = compute_v1.InstancesSetMachineTypeRequest()
    machine_type.machine_type = (
        f"projects/{project_id}/zones/{zone}/machineTypes/{new_machine_type}"
    )
    operation = client.set_machine_type(
        project=project_id,
        zone=zone,
        instance=instance_name,
        instances_set_machine_type_request_resource=machine_type,
    )

    wait_for_extended_operation(operation, "changing machine type")

REST

  1. Pare a VM usando o método instances.stop:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/stop
    

    Substitua:

    • PROJECT_ID: o ID do projeto

    • ZONE: a zona que contém a VM

    • VM_NAME: a instância que contém o tipo de máquina a ser alterado.

  2. Altere o tipo de máquina usando o método instances.setMachineType:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setMachineType
    

    No corpo da solicitação, forneça o machineType atualizado:

    {
        machineType: "zones/MACHINE_TYPE_ZONE/machineTypes/NEW_MACHINE_TYPE"
    }
    

    Substitua:

    • MACHINE_TYPE_ZONE: a zona que contém o tipo de máquina.

    • NEW_MACHINE_TYPE: o novo tipo de máquina para a instância.

      O tipo de máquina pode ser um dos seguintes:

  3. Pare a VM usando o método instances.start:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/start
    

    Substitua:

    • PROJECT_ID: o ID do projeto
    • ZONE: a zona que contém a VM
    • VM_NAME: o nome da VM que você alterou.

A seguir