Pare ou reinicie uma instância do Compute Engine

Este documento explica como parar ou reiniciar uma instância do Compute Engine. Para saber como suspender, parar ou repor uma instância, consulte o artigo Suspenda, pare ou reponha instâncias do Compute Engine.

A paragem de uma instância é útil quando deixa de a usar ou para modificar as respetivas propriedades, por exemplo, para alterar o respetivo tipo de máquina ou remover quaisquer discos anexados e montados. Depois de parar a instância, pode fazer o seguinte:

  • Reinicie-o para retomar a carga de trabalho.

  • Elimine-o se já não precisar dele.

Em alternativa, para automatizar a paragem ou o reinício de uma instância, consulte o seguinte:

Antes de começar

Funções necessárias

Para receber as autorizações de que precisa para parar ou reiniciar uma instância de computação, peça ao seu administrador para lhe conceder a função de IAM Administrador de instâncias do Compute (v1) (roles/compute.instanceAdmin.v1) 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.

Esta função predefinida contém as autorizações necessárias para parar ou reiniciar uma instância de computação. 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 parar ou reiniciar uma instância de computação:

  • Para parar uma instância: compute.instances.stop na instância
  • Para parar uma instância a partir do SO convidado: compute.instances.setMetadata na instância, se usar chaves SSH públicas ao nível da instância.
  • Para reiniciar uma instância: compute.instances.start na instância
  • Para reiniciar uma instância que usa chaves de encriptação: compute.instances.startWithEncryptionKey na instância

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

Pare uma instância

Quando para uma instância de computação ou o Compute Engine o faz para uma ação agendada, a instância retém os recursos anexados, as definições de configuração, os endereços IP internos, os endereços MAC e os metadados. No entanto, a instância perde os dados na memória e o estado da aplicação. Se precisar de manter estes estados, suspenda a instância.

Pode parar uma instância através dos seguintes métodos, consoante a instância tenha discos SSD locais anexados e como quer processar quaisquer scripts de encerramento:

  • Pare uma instância sem discos SSD locais

    Pode parar uma ou mais instâncias em simultâneo que não tenham discos SSD locais anexados. Todos os scripts de encerramento numa instância têm de terminar a execução no período de encerramento predefinido.

  • Pare uma instância com discos SSD local

    Quando para uma ou mais instâncias em simultâneo que tenham discos SSD locais anexados, pode optar por rejeitar ou preservar (pré-visualização) os dados nesses discos. Todos os scripts de encerramento na instância têm de terminar a execução dentro do período de encerramento predefinido.

  • Pare uma instância a partir do SO convidado

    Esta abordagem permite-lhe parar uma única instância apenas depois de os scripts de encerramento terem terminado a execução ou, se tiver ativado o encerramento normal, parar a instância sem a encerrar normalmente ou terminar um encerramento normal em curso. A menos que faça uma cópia de segurança manual dos dados de todos os discos SSD locais anexados para um volume de armazenamento duradouro, a paragem de uma instância a partir do respetivo SO convidado descarta todos os dados nesses discos.

Pare uma instância sem discos SSD locais

Consoante o que quer fazer quando para uma instância, use as seguintes opções:

  • Se ativou o encerramento normal na instância, pode parar a instância sem a encerrar normalmente ou terminar um encerramento normal em curso através da Trusted Cloud consola, da CLI gcloud ou da API REST.

  • Para parar várias instâncias em simultâneo, use a Trusted Cloud consola ou, para instâncias localizadas na mesma zona, a CLI gcloud.

Para parar uma ou mais instâncias, selecione uma das seguintes opções:

Consola

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

    Aceder às instâncias de VM

  2. Selecione as instâncias em execução que quer parar.

  3. Clique em Parar. Se não existir a opção Parar, clique em Mais ações > Parar.

  4. Na caixa de diálogo, faça o seguinte:

    1. Opcional: para parar as instâncias sem as encerrar corretamente, ou terminar um encerramento correto em curso, selecione a caixa de verificação Ignorar encerramento correto (se aplicável).

    2. Para confirmar, clique em Parar.

gcloud

Para parar uma ou mais instâncias na mesma zona, use o comando gcloud compute instances stop:

gcloud compute instances stop INSTANCE_NAMES \
    --zone=ZONE

Substitua o seguinte:

  • INSTANCE_NAMES: uma lista de nomes de instâncias separados por espaços, por exemplo, instance-01 instance-02 instance-03.

  • ZONE: a zona onde as instâncias estão localizadas.

Opcionalmente, se tiver ativado o encerramento gradual numa ou mais instâncias, pode parar as instâncias sem as encerrar gradualmente ou terminar manualmente um encerramento gradual em curso. Para tal, use o comando gcloud beta compute instances stop com a flag --no-graceful-shutdown:

gcloud beta compute instances stop INSTANCE_NAMES \
    --no-graceful-shutdown \
    --zone=ZONE

Ir

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	computepb "cloud.google.com/go/compute/apiv1/computepb"
)

// stopInstance stops a started Google Compute Engine instance
func stopInstance(w io.Writer, projectID, zone, instanceName string) error {
	// projectID := "your_project_id"
	// zone := "europe-central2-b"
	// instanceName := "your_instance_name"

	ctx := context.Background()
	instancesClient, err := compute.NewInstancesRESTClient(ctx)
	if err != nil {
		return fmt.Errorf("NewInstancesRESTClient: %w", err)
	}
	defer instancesClient.Close()

	req := &computepb.StopInstanceRequest{
		Project:  projectID,
		Zone:     zone,
		Instance: instanceName,
	}

	op, err := instancesClient.Stop(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to stop instance: %w", err)
	}

	if err = op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %w", err)
	}

	fmt.Fprintf(w, "Instance stopped\n")

	return nil
}

Java


import com.google.api.gax.longrunning.OperationFuture;
import com.google.cloud.compute.v1.InstancesClient;
import com.google.cloud.compute.v1.Operation;
import com.google.cloud.compute.v1.Operation.Status;
import com.google.cloud.compute.v1.StopInstanceRequest;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class StopInstance {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    /* project: project ID or project number of the Cloud project your instance belongs to.
       zone: name of the zone your instance belongs to.
       instanceName: name of the instance your want to stop.
     */
    String project = "your-project-id";
    String zone = "zone-name";
    String instanceName = "instance-name";

    stopInstance(project, zone, instanceName);
  }

  // Stops a started Google Compute Engine instance.
  public static void stopInstance(String project, String zone, String instanceName)
      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()) {

      StopInstanceRequest stopInstanceRequest = StopInstanceRequest.newBuilder()
          .setProject(project)
          .setZone(zone)
          .setInstance(instanceName)
          .build();

      OperationFuture<Operation, Operation> operation = instancesClient.stopAsync(
          stopInstanceRequest);
      Operation response = operation.get(3, TimeUnit.MINUTES);

      if (response.getStatus() == Status.DONE) {
        System.out.println("Instance stopped successfully ! ");
      }
    }
  }
}

Node.js

/**
 * TODO(developer): Uncomment and replace these variables before running the sample.
 */
// const projectId = 'YOUR_PROJECT_ID';
// const zone = 'europe-central2-b'
// const instanceName = 'YOUR_INSTANCE_NAME'

const compute = require('@google-cloud/compute');

async function stopInstance() {
  const instancesClient = new compute.InstancesClient();

  const [response] = await instancesClient.stop({
    project: projectId,
    zone,
    instance: instanceName,
  });
  let operation = response.latestResponse;
  const operationsClient = new compute.ZoneOperationsClient();

  // Wait for the operation to complete.
  while (operation.status !== 'DONE') {
    [operation] = await operationsClient.wait({
      operation: operation.name,
      project: projectId,
      zone: operation.zone.split('/').pop(),
    });
  }

  console.log('Instance stopped.');
}

stopInstance();

PHP

use Google\Cloud\Compute\V1\Client\InstancesClient;
use Google\Cloud\Compute\V1\StopInstanceRequest;

/**
 * Stops a running Google Compute Engine instance.
 *
 * @param string $projectId Project ID or project number of the Cloud project your instance belongs to.
 * @param string $zone Name of the zone your instance belongs to.
 * @param string $instanceName Name of the instance you want to stop.
  *
 * @throws \Google\ApiCore\ApiException if the remote call fails.
 * @throws \Google\ApiCore\ValidationException if local error occurs before remote call.
 */
function stop_instance(
    string $projectId,
    string $zone,
    string $instanceName
) {
    // Stop the Compute Engine instance using InstancesClient.
    $instancesClient = new InstancesClient();
    $request = (new StopInstanceRequest())
        ->setInstance($instanceName)
        ->setProject($projectId)
        ->setZone($zone);
    $operation = $instancesClient->stop($request);

    // Wait for the operation to complete.
    $operation->pollUntilComplete();
    if ($operation->operationSucceeded()) {
        printf('Instance %s stopped successfully' . PHP_EOL, $instanceName);
    } else {
        $error = $operation->getError();
        printf('Failed to stop instance: %s' . PHP_EOL, $error?->getMessage());
    }
}

Python

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 stop_instance(project_id: str, zone: str, instance_name: str) -> None:
    """
    Stops a running Google Compute Engine instance.
    Args:
        project_id: project ID or project number of the Cloud project your instance belongs to.
        zone: name of the zone your instance belongs to.
        instance_name: name of the instance your want to stop.
    """
    instance_client = compute_v1.InstancesClient()

    operation = instance_client.stop(
        project=project_id, zone=zone, instance=instance_name
    )
    wait_for_extended_operation(operation, "instance stopping")

REST

Para parar uma instância, faça um pedido POST ao método instances.stop:

POST https://compute.s3nsapis.fr/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/stop

Substitua o seguinte:

  • INSTANCE_NAME: o nome da instância.

  • PROJECT_ID: o ID do projeto onde a instância se encontra.

  • ZONE: a zona onde a instância está localizada.

Opcionalmente, se tiver ativado o encerramento normal numa instância, pode parar a instância sem a encerrar normalmente ou terminar manualmente um encerramento normal em curso. Para o fazer, apresente uma POSTsolicitação ao métodoinstances.stop. No URL do pedido, inclua o parâmetro de consulta noGracefulShutdown=true:

POST https://compute.s3nsapis.fr/compute/beta/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/stop?noGracefulShutdown=true

Pare uma instância com discos SSD locais

Consoante o que pretende fazer quando para uma instância de computação, use as seguintes opções:

  • Se ativou o encerramento normal na instância, pode parar a instância sem a encerrar normalmente ou terminar um encerramento normal em curso através da Trusted Cloud consola, da CLI gcloud ou da API REST.

  • Para preservar os dados dos discos SSD locais associados a uma instância (exceto tipos de máquinas que usam SSD de titânio), pare a instância através da CLI gcloud ou da API REST.

  • Para parar várias instâncias em simultâneo, use a Trusted Cloud consola ou, para instâncias localizadas na mesma zona, a CLI gcloud.

Para parar uma ou mais instâncias com discos SSD locais anexados, selecione uma das seguintes opções:

Consola

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

    Aceder às instâncias de VM

  2. Selecione as instâncias em execução que quer parar.

  3. Clique em Parar. Se não existir a opção Parar, clique em Mais ações > Parar.

  4. Na caixa de diálogo, faça o seguinte:

    1. Opcional: para parar as instâncias sem as encerrar corretamente, ou terminar um encerramento correto em curso, selecione a caixa de verificação Ignorar encerramento correto (se aplicável).

    2. Para confirmar, clique em Parar.

gcloud

Quando parar uma ou mais instâncias na mesma zona que tenham discos SSD locais anexados, especifique se quer rejeitar ou preservar os dados do SSD local da seguinte forma:

  • Para rejeitar os dados do SSD local, use o comando gcloud compute instances stop com a flag --discard-local-ssd=true:

    gcloud compute instances stop INSTANCE_NAMES \
        --discard-local-ssd=true \
        --zone=ZONE
    
  • Para preservar os dados do SSD local, use o comando gcloud beta compute instances stop com a flag --discard-local-ssd=false:

    gcloud beta compute instances stop INSTANCE_NAMES \
        --discard-local-ssd=false \
        --zone=ZONE
    

Substitua o seguinte:

  • INSTANCE_NAMES: uma lista de nomes de instâncias separados por espaços, por exemplo, instance-01 instance-02 instance-03.

  • ZONE: a zona onde as instâncias estão localizadas.

Opcionalmente, se tiver ativado o encerramento gradual em uma ou mais instâncias, pode parar as instâncias sem as encerrar gradualmente ou terminar um encerramento gradual em curso. Para tal, use o comando gcloud beta compute instances stop com a flag --no-graceful-shutdown:

gcloud beta compute instances stop INSTANCE_NAMES \
    --discard-local-ssd=DISCARD_LOCAL_SSD \
    --no-graceful-shutdown \
    --zone=ZONE

Substitua DISCARD_LOCAL_SSD por true para rejeitar os dados nos discos SSD locais ou false para preservar os dados.

REST

Quando parar uma instância com discos SSD locais associados, especifique se quer rejeitar ou preservar os dados do SSD local da seguinte forma:

  • Para rejeitar dados do SSD local, faça um pedido POST ao método instances.stop. No URL do pedido, inclua o parâmetro de consulta discardLocalSsd definido como true:

    POST https://compute.s3nsapis.fr/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/stop?discardLocalSsd=true
    
  • Para preservar os dados do SSD local, faça um pedido ao método beta.instances.stop.POST No URL do pedido, inclua o parâmetro de consulta discardLocalSsd definido como false:

    POST https://compute.s3nsapis.fr/compute/beta/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/stop?discardLocalSsd=false
    

Substitua o seguinte:

  • PROJECT_ID: o ID do projeto onde a instância se encontra.

  • ZONE: a zona onde a instância está localizada.

  • INSTANCE_NAME: o nome da instância.

Opcionalmente, se tiver ativado o encerramento normal numa instância, pode parar a instância sem a encerrar normalmente ou terminar manualmente um encerramento normal em curso. Para o fazer, apresente uma POSTsolicitação ao métodoinstances.stop. No URL do pedido, inclua o parâmetro de consulta noGracefulShutdown=true:

POST https://compute.s3nsapis.fr/compute/beta/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/stop?discardLocalSsd=DISCARD_LOCAL_SSD&noGracefulShutdown=true

Substitua DISCARD_LOCAL_SSD por true para rejeitar os dados nos discos SSD locais ou false para preservar os dados.

Pare uma instância a partir do SO convidado

Se uma instância de computação tiver discos SSD locais anexados, o encerramento do SO convidado elimina automaticamente os dados do SSD local. Para preservar estes dados, copie-os manualmente para uma opção de armazenamento persistente antes de parar a instância.

Para impedir que uma instância seja iniciada no SO convidado, selecione uma das seguintes opções:

Linux

  1. Se ainda não o tiver feito, estabeleça ligação à instância.

  2. Para parar a instância, selecione um dos seguintes métodos:

    • Para um encerramento limpo que permita à instância executar scripts de encerramento antes de encerrar o SO convidado, execute o seguinte comando:

      sudo shutdown -h now
      
    • Caso contrário, para forçar o encerramento, execute o seguinte comando:

      sudo poweroff
      

Windows

  1. Se ainda não o fez, estabeleça ligação à instância através de um dos seguintes métodos:

  2. Para parar a instância, selecione um dos seguintes métodos:

    • Para parar a instância de forma limpa e permitir que a instância execute scripts de encerramento antes de encerrar o SO convidado, execute o seguinte comando:

      shutdown /s
      
    • Para forçar o encerramento, execute o seguinte comando:

      shutdown /f
      

Reinicie uma instância

Pode reiniciar uma instância de computação que tenha sido totalmente parada, ou seja, quando o estado da instância é TERMINATED.

Se optou por preservar os dados dos seus discos SSD locais quando parou a instância, pode ter de voltar a montar os discos SSD locais depois de a reiniciar. Para mais informações sobre como montar discos SSD locais, consulte o artigo Formatar e montar um dispositivo SSD local.

Para reiniciar uma instância, use um dos seguintes métodos, consoante a instância tenha discos encriptados anexados:

Reinicie uma instância sem discos encriptados

Para reiniciar várias instâncias em simultâneo em diferentes zonas, use a Trusted Cloud consola. Para instâncias localizadas na mesma zona, pode usar a CLI gcloud. Caso contrário, para outros cenários de reinício, selecione uma das seguintes opções:

Consola

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

    Aceder às instâncias de VM

  2. Selecione uma ou mais instâncias.

  3. Clique em Iniciar / Retomar.

gcloud

Para reiniciar uma ou mais instâncias na mesma zona, use o comando gcloud compute instances start:

gcloud compute instances start INSTANCE_NAMES \
    --zone=ZONE

Substitua o seguinte:

  • INSTANCE_NAMES: uma lista de nomes de instâncias separados por espaços, por exemplo, instance-01 instance-02 instance-03.

  • ZONE: a zona onde as instâncias estão localizadas.

Ir

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	computepb "cloud.google.com/go/compute/apiv1/computepb"
)

// startInstance starts a stopped Google Compute Engine instance (with unencrypted disks).
func startInstance(w io.Writer, projectID, zone, instanceName string) error {
	// projectID := "your_project_id"
	// zone := "europe-central2-b"
	// instanceName := "your_instance_name"

	ctx := context.Background()
	instancesClient, err := compute.NewInstancesRESTClient(ctx)
	if err != nil {
		return fmt.Errorf("NewInstancesRESTClient: %w", err)
	}
	defer instancesClient.Close()

	req := &computepb.StartInstanceRequest{
		Project:  projectID,
		Zone:     zone,
		Instance: instanceName,
	}

	op, err := instancesClient.Start(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to start instance: %w", err)
	}

	if err = op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %w", err)
	}

	fmt.Fprintf(w, "Instance started\n")

	return nil
}

Java


import com.google.api.gax.longrunning.OperationFuture;
import com.google.cloud.compute.v1.InstancesClient;
import com.google.cloud.compute.v1.Operation;
import com.google.cloud.compute.v1.Operation.Status;
import com.google.cloud.compute.v1.StartInstanceRequest;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class StartInstance {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    /* project: project ID or project number of the Cloud project your instance belongs to.
       zone: name of the zone your instance belongs to.
       instanceName: name of the instance your want to start. */
    String project = "your-project-id";
    String zone = "zone-name";
    String instanceName = "instance-name";

    startInstance(project, zone, instanceName);
  }

  // Starts a stopped Google Compute Engine instance (with unencrypted disks).
  public static void startInstance(String project, String zone, String instanceName)
      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()) {

      // Create the request.
      StartInstanceRequest startInstanceRequest = StartInstanceRequest.newBuilder()
          .setProject(project)
          .setZone(zone)
          .setInstance(instanceName)
          .build();

      OperationFuture<Operation, Operation> operation = instancesClient.startAsync(
          startInstanceRequest);

      // Wait for the operation to complete.
      Operation response = operation.get(3, TimeUnit.MINUTES);

      if (response.getStatus() == Status.DONE) {
        System.out.println("Instance started successfully ! ");
      }
    }
  }
}

Node.js

/**
 * TODO(developer): Uncomment and replace these variables before running the sample.
 */
// const projectId = 'YOUR_PROJECT_ID';
// const zone = 'europe-central2-b'
// const instanceName = 'YOUR_INSTANCE_NAME'

const compute = require('@google-cloud/compute');

async function startInstance() {
  const instancesClient = new compute.InstancesClient();

  const [response] = await instancesClient.start({
    project: projectId,
    zone,
    instance: instanceName,
  });
  let operation = response.latestResponse;
  const operationsClient = new compute.ZoneOperationsClient();

  // Wait for the operation to complete.
  while (operation.status !== 'DONE') {
    [operation] = await operationsClient.wait({
      operation: operation.name,
      project: projectId,
      zone: operation.zone.split('/').pop(),
    });
  }

  console.log('Instance started.');
}

startInstance();

PHP

use Google\Cloud\Compute\V1\Client\InstancesClient;
use Google\Cloud\Compute\V1\StartInstanceRequest;

/**
 * Starts a stopped Google Compute Engine instance (with unencrypted disks).
 *
 * @param string $projectId Project ID or project number of the Cloud project your instance belongs to.
 * @param string $zone Name of the zone your instance belongs to.
 * @param string $instanceName Name of the instance you want to stop.
  *
 * @throws \Google\ApiCore\ApiException if the remote call fails.
 * @throws \Google\ApiCore\ValidationException if local error occurs before remote call.
 */
function start_instance(
    string $projectId,
    string $zone,
    string $instanceName
) {
    // Start the Compute Engine instance using InstancesClient.
    $instancesClient = new InstancesClient();
    $request = (new StartInstanceRequest())
        ->setInstance($instanceName)
        ->setProject($projectId)
        ->setZone($zone);
    $operation = $instancesClient->start($request);

    // Wait for the operation to complete.
    $operation->pollUntilComplete();
    if ($operation->operationSucceeded()) {
        printf('Instance %s started successfully' . PHP_EOL, $instanceName);
    } else {
        $error = $operation->getError();
        printf('Failed to start instance: %s' . PHP_EOL, $error?->getMessage());
    }
}

Python

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 start_instance(project_id: str, zone: str, instance_name: str) -> None:
    """
    Starts a stopped Google Compute Engine instance (with unencrypted disks).
    Args:
        project_id: project ID or project number of the Cloud project your instance belongs to.
        zone: name of the zone your instance belongs to.
        instance_name: name of the instance your want to start.
    """
    instance_client = compute_v1.InstancesClient()

    operation = instance_client.start(
        project=project_id, zone=zone, instance=instance_name
    )

    wait_for_extended_operation(operation, "instance start")

REST

Para reiniciar uma instância, faça um pedido POST ao método instances.start:

 POST https://compute.s3nsapis.fr/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/start

Substitua o seguinte:

  • INSTANCE_NAME: o nome da instância a reiniciar.

  • PROJECT_ID: o ID do projeto onde a instância se encontra.

  • ZONE: a zona onde a instância está localizada.

Reinicie uma instância com discos encriptados

Quando reinicia uma instância de computação parada que tem discos anexados encriptados com chaves de encriptação fornecidas pelo cliente, tem de fornecer as informações da chave de encriptação.

Para reiniciar várias instâncias em simultâneo em diferentes zonas, use a Trusted Cloud consola. Para instâncias localizadas na mesma zona, pode usar a CLI gcloud. Caso contrário, para outros cenários de reinício, selecione uma das seguintes opções:

Consola

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

    Aceder às instâncias de VM

  2. Selecione as instâncias a reiniciar.

  3. Clique em Iniciar / Retomar.

  4. Especifique as chaves de encriptação para cada um dos discos encriptados anexados às instâncias e, de seguida, clique em Iniciar.

gcloud

Para reiniciar uma ou mais instâncias que usam discos encriptados na mesma zona, use o comando gcloud compute instances start com a flag --csek-key-file. Se estiver a usar uma chave envolvida em RSA, use o comando gcloud beta compute instances start com a flag --csek-key-file:

gcloud compute instances start INSTANCE_NAMES \
    --csek-key-file=ENCRYPTION_KEY_FILE \
    --zone=ZONE

Substitua o seguinte:

  • INSTANCE_NAMES: uma lista de nomes de instâncias separados por espaços, por exemplo, instance-01 instance-02 instance-03.

  • ENCRYPTION_KEY_FILE: o caminho relativo para o ficheiro JSON que contém a chave de encriptação fornecida pelo cliente. Só pode reiniciar várias instâncias em simultâneo se as instâncias usarem a mesma chave de encriptação fornecida pelo cliente.

  • ZONE: a zona onde as instâncias estão localizadas.

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

// startInstanceWithEncKey starts a stopped Google Compute Engine instance (with encrypted disks).
func startInstanceWithEncKey(w io.Writer, projectID, zone, instanceName, key string) error {
	// projectID := "your_project_id"
	// zone := "europe-central2-b"
	// instanceName := "your_instance_name"
	// key := "your_encryption_key"

	ctx := context.Background()
	instancesClient, err := compute.NewInstancesRESTClient(ctx)
	if err != nil {
		return fmt.Errorf("NewInstancesRESTClient: %w", err)
	}
	defer instancesClient.Close()

	instanceReq := &computepb.GetInstanceRequest{
		Project:  projectID,
		Zone:     zone,
		Instance: instanceName,
	}

	instance, err := instancesClient.Get(ctx, instanceReq)
	if err != nil {
		return fmt.Errorf("unable to get instance: %w", err)
	}

	req := &computepb.StartWithEncryptionKeyInstanceRequest{
		Project:  projectID,
		Zone:     zone,
		Instance: instanceName,
		InstancesStartWithEncryptionKeyRequestResource: &computepb.InstancesStartWithEncryptionKeyRequest{
			Disks: []*computepb.CustomerEncryptionKeyProtectedDisk{
				{
					Source: proto.String(instance.GetDisks()[0].GetSource()),
					DiskEncryptionKey: &computepb.CustomerEncryptionKey{
						RawKey: proto.String(key),
					},
				},
			},
		},
	}

	op, err := instancesClient.StartWithEncryptionKey(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to start instance with encryption key: %w", err)
	}

	if err = op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %w", err)
	}

	fmt.Fprintf(w, "Instance with encryption key started\n")

	return nil
}

Java


import com.google.api.gax.longrunning.OperationFuture;
import com.google.cloud.compute.v1.CustomerEncryptionKey;
import com.google.cloud.compute.v1.CustomerEncryptionKeyProtectedDisk;
import com.google.cloud.compute.v1.GetInstanceRequest;
import com.google.cloud.compute.v1.Instance;
import com.google.cloud.compute.v1.InstancesClient;
import com.google.cloud.compute.v1.InstancesStartWithEncryptionKeyRequest;
import com.google.cloud.compute.v1.Operation;
import com.google.cloud.compute.v1.Operation.Status;
import com.google.cloud.compute.v1.StartWithEncryptionKeyInstanceRequest;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class StartEncryptedInstance {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    /* project: project ID or project number of the Cloud project your instance belongs to.
       zone: name of the zone your instance belongs to.
       instanceName: name of the instance your want to start.
       key: bytes object representing a raw base64 encoded key to your machines boot disk.
            For more information about disk encryption see:
            https://cloud.google.com/compute/docs/disks/customer-supplied-encryption#specifications
     */
    String project = "your-project-id";
    String zone = "zone-name";
    String instanceName = "instance-name";
    String key = "raw-key";

    startEncryptedInstance(project, zone, instanceName, key);
  }

  // Starts a stopped Google Compute Engine instance (with encrypted disks).
  public static void startEncryptedInstance(String project, String zone, String instanceName,
      String key)
      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()) {

      GetInstanceRequest getInstanceRequest = GetInstanceRequest.newBuilder()
          .setProject(project)
          .setZone(zone)
          .setInstance(instanceName).build();

      Instance instance = instancesClient.get(getInstanceRequest);

      // Prepare the information about disk encryption.
      CustomerEncryptionKeyProtectedDisk protectedDisk = CustomerEncryptionKeyProtectedDisk
          .newBuilder()
          /* Use raw_key to send over the key to unlock the disk
             To use a key stored in KMS, you need to provide:
             `kms_key_name` and `kms_key_service_account`
           */
          .setDiskEncryptionKey(CustomerEncryptionKey.newBuilder()
              .setRawKey(key).build())
          .setSource(instance.getDisks(0).getSource())
          .build();

      InstancesStartWithEncryptionKeyRequest startWithEncryptionKeyRequest =
          InstancesStartWithEncryptionKeyRequest.newBuilder()
              .addDisks(protectedDisk).build();

      StartWithEncryptionKeyInstanceRequest encryptionKeyInstanceRequest =
          StartWithEncryptionKeyInstanceRequest.newBuilder()
              .setProject(project)
              .setZone(zone)
              .setInstance(instanceName)
              .setInstancesStartWithEncryptionKeyRequestResource(startWithEncryptionKeyRequest)
              .build();

      OperationFuture<Operation, Operation> operation = instancesClient.startWithEncryptionKeyAsync(
          encryptionKeyInstanceRequest);
      Operation response = operation.get(3, TimeUnit.MINUTES);

      if (response.getStatus() == Status.DONE) {
        System.out.println("Encrypted instance started successfully ! ");
      }
    }
  }

}

Node.js

/**
 * TODO(developer): Uncomment and replace these variables before running the sample.
 */
// const projectId = 'YOUR_PROJECT_ID';
// const zone = 'europe-central2-b'
// const instanceName = 'YOUR_INSTANCE_NAME'
// const key = 'YOUR_KEY_STRING'

const compute = require('@google-cloud/compute');

async function startInstanceWithEncryptionKey() {
  const instancesClient = new compute.InstancesClient();

  const [instance] = await instancesClient.get({
    project: projectId,
    zone,
    instance: instanceName,
  });

  const [response] = await instancesClient.startWithEncryptionKey({
    project: projectId,
    zone,
    instance: instanceName,
    instancesStartWithEncryptionKeyRequestResource: {
      disks: [
        {
          source: instance.disks[0].source,
          diskEncryptionKey: {
            rawKey: key,
          },
        },
      ],
    },
  });
  let operation = response.latestResponse;
  const operationsClient = new compute.ZoneOperationsClient();

  // Wait for the operation to complete.
  while (operation.status !== 'DONE') {
    [operation] = await operationsClient.wait({
      operation: operation.name,
      project: projectId,
      zone: operation.zone.split('/').pop(),
    });
  }

  console.log('Instance with encryption key started.');
}

startInstanceWithEncryptionKey();

PHP

use Google\Cloud\Compute\V1\Client\InstancesClient;
use Google\Cloud\Compute\V1\CustomerEncryptionKey;
use Google\Cloud\Compute\V1\CustomerEncryptionKeyProtectedDisk;
use Google\Cloud\Compute\V1\GetInstanceRequest;
use Google\Cloud\Compute\V1\InstancesStartWithEncryptionKeyRequest;
use Google\Cloud\Compute\V1\StartWithEncryptionKeyInstanceRequest;

/**
 * Starts a stopped Google Compute Engine instance (with encrypted disks).
 *
 * @param string $projectId Project ID or project number of the Cloud project your instance belongs to.
 * @param string $zone Name of the zone your instance belongs to.
 * @param string $instanceName Name of the instance you want to stop.
 * @param string $key Bytes object representing a raw base64 encoded key to your instance's boot disk.
 *                    For more information about disk encryption see:
 *                    https://cloud.google.com/compute/docs/disks/customer-supplied-encryption#specifications
 *
 * @throws \Google\ApiCore\ApiException if the remote call fails.
 * @throws \Google\ApiCore\ValidationException if local error occurs before remote call.
 */
function start_instance_with_encryption_key(
    string $projectId,
    string $zone,
    string $instanceName,
    string $key
) {
    // Initiate the InstancesClient.
    $instancesClient = new InstancesClient();

    // Get data about the instance.
    $request = (new GetInstanceRequest())
        ->setInstance($instanceName)
        ->setProject($projectId)
        ->setZone($zone);
    $instanceData = $instancesClient->get($request);

    // Use `setRawKey` to send over the key to unlock the disk
    // To use a key stored in KMS, you need to use `setKmsKeyName` and `setKmsKeyServiceAccount`
    $customerEncryptionKey = (new CustomerEncryptionKey())
        ->setRawKey($key);

    /** @var \Google\Cloud\Compute\V1\AttachedDisk */
    $disk = $instanceData->getDisks()[0];

    // Prepare the information about disk encryption.
    $diskData = (new CustomerEncryptionKeyProtectedDisk())
        ->setSource($disk->getSource())
        ->setDiskEncryptionKey($customerEncryptionKey);

    // Set request with one disk.
    $instancesStartWithEncryptionKeyRequest = (new InstancesStartWithEncryptionKeyRequest())
        ->setDisks(array($diskData));

    // Start the instance with encrypted disk.
    $request2 = (new StartWithEncryptionKeyInstanceRequest())
        ->setInstance($instanceName)
        ->setInstancesStartWithEncryptionKeyRequestResource($instancesStartWithEncryptionKeyRequest)
        ->setProject($projectId)
        ->setZone($zone);
    $operation = $instancesClient->startWithEncryptionKey($request2);

    // Wait for the operation to complete.
    $operation->pollUntilComplete();
    if ($operation->operationSucceeded()) {
        printf('Instance %s started successfully' . PHP_EOL, $instanceName);
    } else {
        $error = $operation->getError();
        printf('Starting instance failed: %s' . PHP_EOL, $error?->getMessage());
    }
}

Python

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 start_instance_with_encryption_key(
    project_id: str, zone: str, instance_name: str, key: bytes
) -> None:
    """
    Starts a stopped Google Compute Engine instance (with encrypted disks).
    Args:
        project_id: project ID or project number of the Cloud project your instance belongs to.
        zone: name of the zone your instance belongs to.
        instance_name: name of the instance your want to start.
        key: bytes object representing a raw base64 encoded key to your machines boot disk.
            For more information about disk encryption see:
            https://cloud.google.com/compute/docs/disks/customer-supplied-encryption#specifications
    """
    instance_client = compute_v1.InstancesClient()

    instance_data = instance_client.get(
        project=project_id, zone=zone, instance=instance_name
    )

    # Prepare the information about disk encryption
    disk_data = compute_v1.CustomerEncryptionKeyProtectedDisk()
    disk_data.source = instance_data.disks[0].source
    disk_data.disk_encryption_key = compute_v1.CustomerEncryptionKey()
    # Use raw_key to send over the key to unlock the disk
    # To use a key stored in KMS, you need to provide `kms_key_name` and `kms_key_service_account`
    disk_data.disk_encryption_key.raw_key = key
    enc_data = compute_v1.InstancesStartWithEncryptionKeyRequest()
    enc_data.disks = [disk_data]

    operation = instance_client.start_with_encryption_key(
        project=project_id,
        zone=zone,
        instance=instance_name,
        instances_start_with_encryption_key_request_resource=enc_data,
    )

    wait_for_extended_operation(operation, "instance start (with encrypted disk)")

REST

Para reiniciar uma instância que usa discos encriptados, faça um pedido POST ao método instances.startWithEncryptionKey:

POST  https://compute.s3nsapis.fr/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/startWithEncryptionKey

{
  "disks": [
    {
      "source": "DISK_URL",
      "diskEncryptionKey": {
        "ENCRYPTION_TYPE": "ENCRYPTION_KEY"
      }
    }
  ]
}

Substitua o seguinte:

  • PROJECT_ID: o ID do projeto onde a instância se encontra.

  • ZONE: a zona onde a instância está localizada.

  • INSTANCE_NAME: o nome da instância.

  • DISK_URL: o URL do recurso correspondente ao nome completo do recurso do disco anexado que está encriptado com uma chave de encriptação fornecida pelo cliente.

  • ENCRYPTION_TYPE: o tipo de encriptação de disco que está a usar, que pode ser um dos seguintes: rawKey, kmsKeyName ou rsaEncryptedKey. Se usar o tipo rsaEncryptedKey, faça um pedido POST ao método beta.instances.startWithEncryptionKey.

  • ENCRYPTION_KEY: a chave de encriptação usada para encriptar os discos persistentes anexados à instância. As chaves rawKey ou rsaEncryptedKey têm de estar codificadas em base64. Além disso, para preparar uma chave rsaEncryptedKey, consulte o artigo Encriptação de chaves RSA.

O que se segue?