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

Se a sua instância de máquina virtual (VM) não tiver um SSD local associado e não fizer parte de um grupo de instâncias geridas (GIG), pode alterar o tipo de máquina da sua instância depois de a parar.

Se o tipo de máquina existente não for adequado para as cargas de trabalho que executa na VM, altere o tipo de máquina dessa VM. Por exemplo, pode iniciar uma VM com um tipo de máquina mais pequeno durante a configuração, o desenvolvimento e os testes, e alterar a VM para usar um tipo de máquina maior quando estiver tudo pronto para as cargas de trabalho de produção.

Pode usar este 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:
    • Pode alterar n2-highcpu-4 para n2-standard-4.
    • Pode alterar c3d-standard-30 para c3d-highmem-30.
  • Para alterar o tipo de máquina de modo a usar uma série de máquinas diferente. Isto só é suportado para a primeira e segunda geração da série de máquinas, excluindo a série de máquinas T2A e A2. Por exemplo:
    • Pode alterar n2-standard-4 para c2-standard-8.
    • Pode alterar n1-highmem-4 para n2d-standard-16.

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

Pode alterar o tipo de máquina sem afetar os seguintes recursos:

  • As chaves SSH da VM
  • As configurações de VM, como os metadados de VM
  • Os dados no Persistent Disk ou Hyperdisk anexado, incluindo as aplicações instaladas e os dados das aplicações

Para alterar o tipo de máquina das VMs num GIG, consulte o artigo Aplique automaticamente atualizações de configuração de VMs num GIG.

Antes de começar

  • Saiba como parar uma VM.
  • Compreenda os tipos de máquinas.
  • Se ainda não o tiver feito, configure a autenticação. A autenticação valida a sua identidade para aceder a Google Cloud serviços e APIs. Para executar código ou exemplos a partir de um ambiente de desenvolvimento local, pode autenticar-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 Java exemplos nesta página num ambiente de desenvolvimento local, instale e inicialize a CLI gcloud e, em seguida, configure as Credenciais predefinidas da aplicação com as suas credenciais de utilizador.

      Instale a CLI Google Cloud.

      Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro tem de iniciar sessão na CLI gcloud com a sua identidade federada.

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

      gcloud auth application-default login

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

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

    Para mais informações, consulte Set up authentication for a local development environment.

    Python

    Para usar os Python exemplos nesta página num ambiente de desenvolvimento local, instale e inicialize a CLI gcloud e, em seguida, configure as Credenciais predefinidas da aplicação com as suas credenciais de utilizador.

      Instale a CLI Google Cloud.

      Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro tem de iniciar sessão na CLI gcloud com a sua identidade federada.

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

      gcloud auth application-default login

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

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

    Para mais informações, consulte Set up authentication for a local development environment.

    REST

    Para usar os exemplos da API REST nesta página num ambiente de desenvolvimento local, usa as credenciais que fornece à CLI gcloud.

      Instale a CLI Google Cloud.

      Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro tem de iniciar sessão na CLI gcloud com a sua identidade federada.

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

Funções necessárias

Para obter as autorizações de que precisa para alterar o tipo de máquina de uma VM, peça ao seu administrador que lhe conceda as seguintes funções da IAM no projeto:

Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

Estas funções predefinidas contêm as autorizações necessárias para alterar o tipo de máquina de uma VM. Para ver as autorizações exatas que são necessárias, expanda a secção Autorizações necessárias:

Autorizações necessárias

São necessárias as seguintes autorizações 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

Também pode conseguir estas autorizações com funções personalizadas ou outras funções predefinidas.

Limitações

Implicações de faturação

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

A alteração de um tipo de máquina também pode afetar os descontos por utilização contínua dessa VM. Os descontos por utilização sustentada são calculados separadamente para diferentes categorias na mesma região. Se alterar os tipos de máquinas para que o novo tipo de máquina esteja numa categoria diferente, o tempo de execução subsequente da VM conta para o desconto por utilização sustentada da nova categoria.

Por exemplo, suponha que tem uma VM com o n2-standard-2 tipo de máquina em execução durante meio mês. Em seguida, decide alterar o tipo de máquina para m1-ultramem-40. Depois de fazer essa alteração, o Compute Engine começa a contabilizar o tempo de execução da VM para o desconto por utilização contínua da categoria de memória e vCPU otimizadas para memória.

Na fatura, veria um desconto por utilização contínua aplicado ao tipo de máquina n2-standard-2 de antes de fazer a alteração do tipo de máquina e um desconto por utilização contínua separado para m1-ultramem-40, se a VM permanecer em execução em m1-ultramem-40 durante, pelo menos, 25% do resto do mês.

Mude para um tipo de máquina mais pequeno

Se mudar de um tipo de máquina com mais recursos para um tipo de máquina com menos recursos, como mudar de um tipo de máquina e2-standard-8 para um tipo de máquina e2-standard-2, pode ter problemas de recursos de hardware ou limitações de desempenho, porque os tipos de máquinas mais pequenos são menos potentes do que os tipos de máquinas maiores. Certifique-se de que o novo tipo de máquina consegue suportar todas as aplicações ou serviços que estão a ser executados na sua VM atual ou que atualiza os seus serviços e aplicações para serem executados nos tipos de máquinas mais pequenos.

Reveja as recomendações de ajuste de tamanho antes de alterar o tipo de máquina. Para ver informações sobre as recomendações de dimensionamento do Compute Engine, consulte o artigo Aplicação de recomendações de tipo de máquina para instâncias de VM.

Práticas recomendadas

Seguem-se algumas práticas recomendadas para ajudar a alterar o tipo de máquina virtual com êxito.

  • Faça cópias de segurança regulares dos dados do disco persistente através de capturas de ecrã. Considere tirar uma captura de ecrã dos dados do disco persistente antes de alterar o tipo de máquina. Se quiser certificar-se de que o novo tipo de máquina consegue suportar os dados na VM existente, pode tirar uma captura instantânea do disco persistente e usá-la para iniciar uma segunda VM com o novo tipo de máquina para confirmar que a VM é iniciada com êxito.

  • Adicione discos adicionais ao ficheiro /etc/fstab. Se tiver discos adicionais anexados à sua VM, certifique-se de que são adicionados ao ficheiro /etc/fstab para que sejam montados automaticamente quando a VM for reiniciada.

  • Crie uma reserva antes de alterar o tipo de máquina. Para evitar erros relacionados com a disponibilidade de recursos, crie reservas do Compute Engine para os novos tipos de máquinas quando estiverem disponíveis para os reservar numa zona. As reservas ajudam a garantir que os recursos estão disponíveis quando precisa deles.

Para criar uma reserva, conclua os seguintes passos:

  1. Crie uma reserva (ou identifique reservas existentes) com propriedades idênticas às VMs planeadas. O número de VMs da reserva tem de ser igual ou superior ao número de VMs que quer alterar. Opcionalmente, para impedir que outras VMs consumam esta reserva, use a opção specificReservationRequired.

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

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

Altere um tipo de máquina

Só pode alterar o tipo de máquina de uma VM parada. Uma VM é considerada parada apenas quando está no estado TERMINATED. Não pode alterar o tipo de máquina de uma VM em execução.

Se estiver a atualizar o tipo de máquina para a geração mais recente, reveja o artigo Avalie as opções de migração de VMs antes de continuar.

Consola

  1. Na Google Cloud consola, aceda à página Instâncias de VM.

    Aceder às instâncias de VM

  2. Na coluna Nome, clique no nome da MV para a qual quer alterar o tipo de máquina.

  3. Na página Detalhes da instância de VM, conclua os seguintes passos:

    1. Se a VM estiver em execução, clique em Parar para parar a VM. Se não existir a opção Parar, clique em Mais ações > Parar.
    2. Para editar a VM, clique em Editar.
    3. Na secção Configuração da máquina, selecione o tipo de máquina que quer usar ou crie um tipo de máquina personalizado.

    4. Para guardar as alterações, clique em Guardar.

    5. Reinicie a VM.

gcloud

  1. Pare a VM com 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 alterar.

  2. Altere o tipo de máquina através do 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. Inicie a VM com o comando gcloud compute instances start:

    gcloud compute instances start VM_NAME
    

    Substitua VM_NAME pelo nome da VM que alterou.

Java

Java

Antes de experimentar este exemplo, siga as Javainstruções de configuração no guia de início rápido do Compute Engine com bibliotecas cliente. Para mais informações, consulte a documentação de referência da API Java Compute Engine.

Para se autenticar no Compute Engine, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure 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 experimentar este exemplo, siga as Pythoninstruções de configuração no guia de início rápido do Compute Engine com bibliotecas cliente. Para mais informações, consulte a documentação de referência da API Python Compute Engine.

Para se autenticar no Compute Engine, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure 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 através do método instances.stop:

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

    Substitua o seguinte:

    • PROJECT_ID: o ID do projeto

    • ZONE: a zona que contém a VM

    • VM_NAME: a VM que contém o tipo de máquina a alterar

  2. Altere o tipo de máquina através do método instances.setMachineType:

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

    No corpo do pedido, indique o machineType atualizado:

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

    Substitua o seguinte:

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

    • NEW_MACHINE_TYPE: o novo tipo de máquina para a VM

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

  3. Inicie a VM através do método instances.start:

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

    Substitua o seguinte:

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

O que se segue?