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


Se sua instância de máquina virtual (VM) não tiver SSD local anexado e não fizer parte de um grupo de instâncias gerenciadas (MIG), você poderá alterar o tipo de máquina de sua instância após interrompê- la.

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

Você 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 dentro da mesma série de máquinas, por exemplo:
    • Você pode alterar n2-highcpu-4 para n2-standard-4 .
    • Você pode alterar c3d-standard-30 para c3d-highmem-30 .
  • Para alterar o tipo de máquina, use uma série de máquina diferente. Isso é compatível apenas com as 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 alterar n2-standard-4 para c2-standard-8 .
    • Você 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.), você deverá usar o procedimento documentado em Mover sua carga de trabalho para uma nova instância de computação .

Você pode alterar o tipo de máquina sem afetar os seguintes recursos:

  • As chaves SSH da VM
  • As configurações da VM, como metadados da VM
  • Os dados no disco permanente ou hiperdisco anexado, incluindo aplicativos instalados e dados de aplicativos

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

Antes de começar

  • Entenda como parar uma VM .
  • Entenda os tipos de máquinas .
  • Se ainda não o fez, configure a autenticação. Autenticação é o processo pelo qual sua identidade é verificada para acesso a Google Cloud serviços e APIs. Para executar códigos ou amostras em um ambiente de desenvolvimento local, você pode se autenticar 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. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    3. To initialize the gcloud CLI, run the following command:

      gcloud init
    4. 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, confirm that you have configured the gcloud CLI to use Workforce Identity Federation.

    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. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    3. To initialize the gcloud CLI, run the following command:

      gcloud init
    4. 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, confirm that you have configured the gcloud CLI to use Workforce Identity Federation.

    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.

      After installing the Google Cloud CLI, initialize it by running the following command:

      gcloud init

      If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

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

Funções obrigatórias

Para obter 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 obter mais informações sobre a concessão de funções, consulte Gerenciar acesso a projetos, pastas e organizações .

Estas funções predefinidas contêm as permissões necessárias para alterar o tipo de máquina de uma VM. Para ver as permissões exatas necessárias, expanda a seção Permissões necessárias :

Permissões necessárias

As seguintes permissões 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

Você também poderá obter essas permissões com funções personalizadas ou outras funções predefinidas .

Limitações

Implicações de faturamento

Cada tipo de máquina é cobrado com uma taxa diferente, portanto, certifique-se de compreender as implicações de preços da alteração dos tipos de máquina. Por exemplo, uma máquina do tipo e2-standard-2 custa mais do que uma máquina do tipo e2-micro .

A alteração de um tipo de máquina também pode afetar os descontos por uso prolongado dessa VM. Os descontos por uso prolongado são calculados separadamente para diferentes categorias 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 tempo de execução subsequente da VM contará para o desconto por uso sustentado da nova categoria.

Por exemplo, suponha que você tenha uma VM com tipo de máquina n2-standard-2 em execução por meio mês. Você então 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 tempo de execução da VM para o desconto de uso sustentado da vCPU com otimização de memória e da categoria de memória.

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

Mude para um tipo de máquina menor

Se você passar de um tipo de máquina com mais recursos para um tipo de máquina com menos recursos, como passar de um tipo de máquina e2-standard-8 para um e2-standard-2 , poderá enfrentar problemas de recursos de hardware ou limitações de desempenho porque tipos de máquinas menores são menos potentes que tipos de máquinas maiores. Certifique-se de que seu novo tipo de máquina seja capaz de suportar qualquer aplicativo ou serviço em execução na sua VM atual ou que você atualize seus serviços e aplicativos para execução em tipos de máquina menores.

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

Melhores práticas

Aqui estão algumas práticas recomendadas para ajudá-lo a alterar com êxito o tipo de máquina VM.

  • Faça backups regulares dos dados do disco permanente usando snapshots . Considere tirar um snapshot dos dados do disco permanente antes de alterar o tipo de máquina. Se quiser ter certeza de que o novo tipo de máquina é capaz de suportar os dados na VM existente, você pode tirar um instantâneo do disco permanente e usá-lo para iniciar uma segunda VM com o novo tipo de máquina para confirmar se a VM foi inicializada com sucesso.

  • Adicione discos adicionais ao arquivo /etc/fstab . Se você tiver discos adicionais anexados à sua VM, certifique-se de que eles sejam 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áquinas quando eles estiverem disponíveis para reservá-los em uma zona. As reservas ajudam a garantir que os recursos estejam disponíveis quando você precisar deles.

Para criar uma reserva, siga os seguintes passos:

  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 que o número de VMs que você deseja alterar. Opcionalmente, para evitar que outras VMs consumam esta 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, certifique-se de que a reserva tenha capacidade suficiente .

Alterar um tipo de máquina

Você só pode alterar o tipo de máquina de uma VM interrompida. Uma VM é considerada parada somente quando está no estado TERMINATED . Não é possível alterar o tipo de máquina de uma VM em execução.

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

Console

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

    Acesse as instâncias de VM

  2. Na coluna Nome , clique no nome da VM para a qual você deseja alterar o tipo de máquina.

  3. Na página de detalhes da instância de VM , conclua as etapas a seguir:

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

    4. Para salvar suas alterações, clique em Salvar .

    5. Reinicie a VM.

gcloud

  1. Pare 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 da VM. O tipo de máquina pode ser um dos seguintes:

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

    gcloud compute instances start VM_NAME
    

    Substitua VM_NAME pelo nome da VM que você alterou.

Java

Java

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

Para autenticar no Compute Engine, configure as credenciais padrão do aplicativo. Para obter mais informações, consulte Configurar 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());
    }
  }
}

Pitão

Python

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

Para autenticar no Compute Engine, configure as credenciais padrão do aplicativo. Para obter mais informações, consulte Configurar 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")

DESCANSAR

  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 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 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 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 usando o 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 você alterou

O que vem a seguir