Riavviare o reimpostare un'istanza Compute Engine

Questo documento spiega come riavviare o reimpostare un'istanza Compute Engine. Per scoprire di più sugli effetti della reimpostazione di un'istanza, nonché sulle differenze tra la sospensione, l'arresto o la reimpostazione di un'istanza, consulta Sospendi, arresta o reimposta le istanze Compute Engine.

Il riavvio o il ripristino di un'istanza può contribuire a garantire prestazioni e stabilità ottimali oppure a risolvere problemi come un sistema operativo guest bloccato, lento o in arresto anomalo. In base allo stato del sistema operativo guest dell'istanza, procedi in uno dei seguenti modi:

  • Riavvia l'istanza. Se il sistema operativo guest è lento o bloccato, il riavvio gli dà il tempo sufficiente per completare l'esecuzione delle attività prima di arrestarsi.

  • Reimposta l'istanza. Reimposta un'istanza solo se il sistema operativo guest si è arrestato in modo anomalo o non risponde e non hai altre opzioni. La reimpostazione di un'istanza non consente l'arresto normale del sistema operativo guest. Questa azione può eliminare i dati non salvati e potrebbe danneggiare i file system di qualsiasi disco.

Prima di iniziare

Ruoli obbligatori

Per ottenere le autorizzazioni necessarie per reimpostare o riavviare un'istanza di computing, chiedi all'amministratore di concederti il ruolo IAM Compute Instance Admin (v1) (roles/compute.instanceAdmin.v1) sull'istanza. Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

Questo ruolo predefinito contiene le autorizzazioni necessarie per reimpostare o riavviare un'istanza di computing. Per vedere quali sono esattamente le autorizzazioni richieste, espandi la sezione Autorizzazioni obbligatorie:

Autorizzazioni obbligatorie

Per reimpostare o riavviare un'istanza di computing sono necessarie le seguenti autorizzazioni:

  • Per reimpostare un'istanza: compute.instances.reset
  • Per riavviare un'istanza dal sistema operativo guest: compute.instances.setMetadata

Potresti anche ottenere queste autorizzazioni con ruoli personalizzati o altri ruoli predefiniti.

Riavvia un'istanza

Il riavvio di un'istanza di computing consente al sistema operativo guest nell'istanza di terminare l'esecuzione delle attività prima che Compute Engine invii il segnale di arresto ACPI. In questo modo si garantisce un arresto normale del sistema operativo guest.

Il riavvio di un'istanza cancella la memoria utilizzata dall'istanza. Se utilizzi dischi RAM con le tue istanze e devi conservare i dati, esegui il backup prima di riavviare l'istanza.

Per riavviare un'istanza, seleziona una delle seguenti opzioni:

Linux

  1. Se non l'hai ancora fatto, connettiti all'istanza.

  2. Per riavviare l'istanza, esegui questo comando:

    sudo reboot
    

Windows

  1. Se non l'hai già fatto, connettiti all'istanza utilizzando uno dei seguenti metodi:

  2. Per riavviare l'istanza, esegui questo comando:

    shutdown /r /t 0
    
  3. (Facoltativo) Per monitorare il processo di arresto e riavvio dell'istanza, attiva il menu Windows Boot Manager.

Reimposta un'istanza

Il ripristino di un'istanza cancella tutti i dati nella memoria dell'istanza, inclusi eventuali file temporanei archiviati sui dischi RAM. Questi dati vengono persi definitivamente e Compute Engine non crea backup prima di reimpostare l'istanza.

Puoi reimpostare più istanze contemporaneamente o istanze singole. Per più istanze, utilizza la console Trusted Cloud o, per istanze situate nella stessa zona, Google Cloud CLI. Per le istanze singole, seleziona una delle seguenti opzioni:

Console

  1. Nella console Trusted Cloud , vai alla pagina Istanze VM.

    Vai a Istanze VM

  2. Seleziona le istanze da reimpostare.

  3. Fai clic su Reimposta, quindi fai di nuovo clic su Reimposta per confermare.

gcloud

Per reimpostare una o più istanze in esecuzione in una singola zona, utilizza il comando gcloud compute instances reset:

gcloud compute instances reset INSTANCE_NAMES \
    --zone=ZONE

Sostituisci quanto segue:

  • INSTANCE_NAMES: un elenco separato da spazi dei nomi delle istanze, ad esempio instance-01 instance-02 instance-03.

  • ZONE: la zona in cui si trovano le istanze.

Vai

import (
	"context"
	"fmt"
	"io"

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

// resetInstance resets a running Google Compute Engine instance (with unencrypted disks).
func resetInstance(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.ResetInstanceRequest{
		Project:  projectID,
		Zone:     zone,
		Instance: instanceName,
	}

	op, err := instancesClient.Reset(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to reset 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 reset\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.ResetInstanceRequest;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class ResetInstance {

  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 reset.
     */
    String project = "your-project-id";
    String zone = "zone-name";
    String instanceName = "instance-name";

    resetInstance(project, zone, instanceName);
  }

  // Resets a running Google Compute Engine instance (with unencrypted disks).
  public static void resetInstance(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()) {

      ResetInstanceRequest resetInstanceRequest = ResetInstanceRequest.newBuilder()
          .setProject(project)
          .setZone(zone)
          .setInstance(instanceName)
          .build();

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

      if (response.getStatus() == Status.DONE) {
        System.out.println("Instance reset 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 resetInstance() {
  const instancesClient = new compute.InstancesClient();

  const [response] = await instancesClient.reset({
    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 reset.');
}

resetInstance();

PHP

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

/**
 * Reset a running 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 reset.
  *
 * @throws \Google\ApiCore\ApiException if the remote call fails.
 * @throws \Google\ApiCore\ValidationException if local error occurs before remote call.
 */
function reset_instance(
    string $projectId,
    string $zone,
    string $instanceName
) {
    // Stop the Compute Engine instance using InstancesClient.
    $instancesClient = new InstancesClient();
    $request = (new ResetInstanceRequest())
        ->setInstance($instanceName)
        ->setProject($projectId)
        ->setZone($zone);
    $operation = $instancesClient->reset($request);

    // Wait for the operation to complete.
    $operation->pollUntilComplete();
    if ($operation->operationSucceeded()) {
        printf('Instance %s reset successfully' . PHP_EOL, $instanceName);
    } else {
        $error = $operation->getError();
        printf('Failed to reset 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 reset_instance(project_id: str, zone: str, instance_name: str) -> None:
    """
    Resets 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 reset.
    """
    instance_client = compute_v1.InstancesClient()

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

    wait_for_extended_operation(operation, "instance reset")

REST

Per reimpostare un'istanza in esecuzione, invia una richiesta POST al metodo instances.reset:

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

Sostituisci quanto segue:

  • INSTANCE_NAME: il nome dell'istanza

  • PROJECT_ID: l'ID del progetto in cui si trova l'istanza

  • ZONE: la zona in cui si trova l'istanza

Passaggi successivi