Crea ed esegui script di arresto che eseguono comandi subito prima dell'arresto o del riavvio di un'istanza di macchina virtuale (VM). Questa opzione è utile se ti basi su script automatici per avviare e arrestare le istanze; concede alle istanze il tempo di eseguire operazioni di pulizia o altre attività, come l'esportazione dei log o la sincronizzazione con altri sistemi.
Gli script di arresto sono particolarmente utili per le VM in un gruppo di istanze gestite con un gestore della scalabilità automatica. Se il gestore della scalabilità automatica arresta una VM nel gruppo, lo script di arresto viene eseguito prima dell'arresto della VM ed esegue le azioni che hai definito. Lo script viene eseguito durante il periodo di arresto limitato prima dell'arresto della VM. Ad esempio, lo script di arresto potrebbe copiare i dati elaborati in Cloud Storage o eseguire il backup di eventuali log.
Gli script di arresto funzionano in modo molto simile agli script di avvio. Gran parte della documentazione relativa agli script di avvio si applica anche agli script di arresto.
Per le attività di arresto e riavvio, le VM eseguono sempre gli script di arresto come segue:
- Per le VM Linux, utilizzando l'utente
root. - Per le VM Windows, utilizzando l'account
System.
Prerequisiti
Per eseguire gli script archiviati nei metadati su un'istanza VM, l'ambiente guest deve essere installato e in esecuzione.
- L'ambiente guest include l'agente guest (ad esempio google-guest-agent su Linux) che legge i contenuti o l'URL dello script dai metadati dell'istanza e avvia l'esecuzione.
- Tutte le immagini Compute Engine pubbliche vengono fornite con l'ambiente guest preinstallato.
- Se crei un'immagine personalizzata, devi installare manualmente l'ambiente guest di Google per assicurarti che gli script dei metadati e altre funzionalità di Google Cloud funzionino correttamente.
Prima di iniziare
- Scopri di più sugli script di avvio.
- Scopri cos'è il server di metadati.
-
Se non l'hai ancora fatto, configura l'autenticazione.
L'autenticazione verifica la tua identità per l'accesso ad API e servizi Google Cloud . Per eseguire codice o esempi da un ambiente di sviluppo locale, puoi autenticarti su Compute Engine selezionando una delle seguenti opzioni:
Seleziona la scheda in base a come prevedi di utilizzare gli esempi in questa pagina:
Console
Quando utilizzi la console Google Cloud per accedere ai servizi e alle API Google Cloud , non devi configurare l'autenticazione.
gcloud
-
Installa Google Cloud CLI. Dopo l'installazione, inizializza Google Cloud CLI eseguendo il comando seguente:
gcloud initSe utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.
-
- Imposta una regione e una zona predefinite.
-
Installa Google Cloud CLI.
-
Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.
-
Se utilizzi una shell locale, crea le credenziali di autenticazione locale per il tuo account utente:
gcloud auth application-default login
Non è necessario farlo se utilizzi Cloud Shell.
Se viene restituito un errore di autenticazione e utilizzi un provider di identità (IdP) esterno, verifica di aver eseguito l'accesso a gcloud CLI con la tua identità federata.
Terraform
Per utilizzare gli esempi di Terraform in questa pagina in un ambiente di sviluppo locale, installa e inizializza gcloud CLI, quindi configura Credenziali predefinite dell'applicazione con le tue credenziali utente.
Per saperne di più, consulta Configura l'autenticazione per un ambiente di sviluppo locale.
REST
Per utilizzare gli esempi di API REST in questa pagina in un ambiente di sviluppo locale, utilizzi le credenziali che fornisci a gcloud CLI.
Installa Google Cloud CLI.
Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.
Per saperne di più, consulta Autenticati per usare REST nella documentazione sull'autenticazione di Google Cloud .
Autorizzazioni richieste per questa attività
Per eseguire questa attività, devi disporre delle seguenti autorizzazioni:
- Tutte le autorizzazioni necessarie per creare un'istanza
compute.instances.setMetadatasull'istanza
Specifiche
Le sezioni seguenti descrivono le specifiche degli script di arresto.
Limitazioni
Esistono alcune limitazioni da tenere presenti quando si utilizzano gli script di arresto:
- Compute Engine esegue gli script di arresto solo secondo il criterio del "best effort". In rari casi, Compute Engine non può garantire che lo script di arresto verrà completato.
- Su Windows, i Criteri di gruppo locali vengono utilizzati per avviare lo script di arresto.
- Il pacchetto di installazione configura l'impostazione dei criteri di gruppo locali
Computer Configuration/Windows Setting/Scripts (Startup/Shutdown)per avviare lo script all'arresto del sistema.
- Il pacchetto di installazione configura l'impostazione dei criteri di gruppo locali
Chiamata dello script di arresto
Gli script di arresto vengono attivati quando l'istanza si arresta dopo uno dei seguenti eventi:
Operazioni eseguite da te:
Arresto o eliminazione dell'istanza.
Compute Engine arresta un'istanza nell'ambito di un'operazione di arresto o eliminazione programmata.
Compute Engine arresta una VM Spot o un'istanza preemptible nell'ambito del processo di prerilascio.
Uno script di arresto può essere di qualsiasi tipo di file. Se nell'istanza è presente uno script di arresto, Compute Engine esegue queste operazioni:
- Copia lo script in un file locale nell'istanza.
- Imposta le autorizzazioni sul file per rendere eseguibile lo script.
- Esegue il file quando l'istanza viene arrestata.
Ad esempio, puoi fornire uno script Python anziché uno script bash. Tieni presente che Compute Engine esegue lo script alla lettera, indipendentemente dal tipo di script.
Per eseguire uno script diverso da bash, aggiungi una riga shebang all'inizio del file per indicare al sistema operativo quale interprete utilizzare. Ad esempio, per uno script Python, puoi aggiungere una riga shebang come:
#!/usr/bin/python
Tempo di esecuzione dello script di arresto
L'esecuzione degli script di arresto parte dal momento in cui Compute Engine imposta lo stato dell'istanza su STOPPING. Gli script devono essere completati prima che l'istanza sia completamente arrestata, ovvero quando il relativo stato diventa TERMINATED. Il tempo necessario all'istanza per raggiungere lo stato TERMINATED varia in base al tipo di istanza.
Se gli script richiedono più tempo del periodo necessario per l'arresto dell'istanza, Compute Engine forza l'interruzione degli script, il che può comportare la perdita di dati o attività incomplete. Per evitare questo problema, arresta l'istanza dal sistema operativo guest.
Questo approccio mantiene lo stato dell'istanza su STOPPING fino al termine dell'esecuzione degli script di arresto.
Utilizza uno script di arresto locale
Uno script di arresto locale è uno script che si trova sul tuo computer locale. Passa uno script di arresto locale come file o fornendo i contenuti direttamente a Compute Engine.
Gli script di arresto possono eseguire tutte le azioni necessarie, ma se lo script viene passato localmente, non può superare il limite di lunghezza del valore dei metadati di 256 KB. Per utilizzare uno script che supera il limite di lunghezza, archivia il file su Cloud Storage. Per saperne di più, consulta Utilizza uno script di arresto da Cloud Storage.
Fornisci un file dello script di arresto
Puoi passare un file dello script di arresto locale solo tramite lo strumento a riga di comando gcloud.
gcloud
Per passare un file dello script di arresto locale, fornisci il flag --metadata-from-file seguito da una coppia di chiavi di metadati, shutdown-script=PATH/TO/FILE, dove PATH/TO/FILE è un percorso relativo allo script di arresto. Ad esempio:
gcloud compute instances create example-instance \
--metadata-from-file shutdown-script=examples/scripts/install.sh
Terraform
Per specificare direttamente uno script di arresto, utilizza la risorsa google_compute_instance con il percorso dello script di arresto nei metadati.
Per scoprire come applicare o rimuovere una configurazione Terraform, consulta Comandi Terraform di base.
Fornisci direttamente i contenuti dello script di arresto
In alternativa, puoi passare direttamente i contenuti dello script di arresto.
Console
Nella console Google Cloud , specifica direttamente uno script di arresto utilizzando la chiave dei metadati shutdown-script:
Vai alla pagina Crea un'istanza.
Specifica i dettagli della VM.
Espandi la sezione Opzioni avanzate.
Espandi Gestione e segui questi passaggi:
- Nella sezione Metadati, fai clic su Aggiungi elemento.
- Nel campo Chiave, inserisci
shutdown-scriptper la chiave dei metadati. - Nel campo Valore, aggiungi i contenuti dello script di arresto.
Continua con il processo di creazione della VM.
gcloud
Utilizza il flag --metadata di Google Cloud CLI per fornire i contenuti dello script di arresto, seguiti dalla coppia di chiavi shutdown-script=CONTENTS, dove CONTENTS è il contenuto dello script di arresto.
gcloud compute instances create example-instance --metadata shutdown-script="#! /bin/bash
> # Shuts down Apache server
> /etc/init.d/apache2 stop"
Terraform
Per specificare direttamente uno script di arresto, utilizza la risorsa google_compute_instance con lo script di arresto nei metadati.
Per scoprire come applicare o rimuovere una configurazione Terraform, consulta Comandi Terraform di base.
REST
Nell'API, fornisci uno script di arresto come parte della proprietà dei metadati nella richiesta quando crei un'istanza. Utilizza shutdown-script come chiave dei metadati:
POST https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instances
{...
"metadata": {
"items": [
{
"key": "shutdown-script",
"value": "#! /bin/bash\n\n# Shuts down Apache server\n/etc/init.d/apache2 stop"
}
]
}...
}
Fornisci uno script di arresto su istanze Windows
Esegui script di arresto su istanze Windows utilizzando le seguenti chiavi dei metadati specifiche per Windows. Scegli una delle chiavi specializzate elencate di seguito. Ogni chiave deve corrispondere al tipo di script che vuoi eseguire.
Puoi specificare più script di arresto passando chiavi diverse all'istanza, ma ogni chiave può essere specificata una sola volta per macchina virtuale.
Le seguenti chiavi possono essere utilizzate con uno script di arresto locale, sono valide le stesse istruzioni fornite in precedenza in questo documento.
Script di arresto cmd |
Script di arresto bat |
Script di arresto ps1 |
|---|---|---|
windows-shutdown-script-cmd |
windows-shutdown-script-bat |
windows-shutdown-script-ps1 |
Utilizza uno script di arresto da Cloud Storage
Puoi archiviare e utilizzare uno script di arresto da Cloud Storage. Segui le istruzioni riportate nella documentazione degli script di avvio, ma sostituisci startup-script-url con shutdown-script-url.
Per le istanze Windows, sostituisci windows-startup-script-url con windows-shutdown-script-url.
Applica uno script di arresto alle istanze in esecuzione
Per aggiungere uno script di arresto a un'istanza in esecuzione, segui le istruzioni riportate nella documentazione relativa all'applicazione di uno script di avvio alle istanze in esecuzione, ma sostituisci le chiavi dei metadati con una delle chiavi seguenti:
shutdown-script: fornisci i contenuti dello script di arresto direttamente con questa chiave. Con Google Cloud CLI, puoi fornire il percorso di un file script di arresto utilizzando il flag--metadata-from-filee la chiave dei metadatishutdown-script.shutdown-script-url: fornisci un URL di Cloud Storage che punta al file dello script di arresto con questa chiave.
Esegui uno script di arresto durante un arresto normale
Per impostazione predefinita, se in un'istanza di computing è abilitato l'arresto normale, gli script di arresto configurati nelle chiavi dei metadati vengono eseguiti al termine dell'arresto normale.
Per eseguire i comandi durante un arresto normale, devi utilizzare uno script watcher personalizzato che esegue continuamente il polling del server dei metadati in background, come mostrato in questa sezione. Per dare agli script tempo sufficiente per essere completati ed evitare potenziali perdite di dati o attività incomplete, ti consigliamo di modificare gli script di arresto spostando la logica in questo script watcher.
Per eseguire uno script di arresto durante un arresto normale, seleziona una delle seguenti opzioni in base al sistema operativo guest utilizzato dall'istanza di computing:
Linux
Se non l'hai ancora fatto, connettiti all'istanza di computing.
Esegui uno script watcher o configuralo per l'esecuzione all'avvio, come di seguito. Aggiungi la logica di arresto specifica dove indicato:
#!/bin/bash # -------------------------------------------------------- # Script for graceful shutdown based on the metadata value # -------------------------------------------------------- # # This script monitors the metadata key `shutdown-status` and # waits for its value to change to `PENDING_STOP`. After the script # runs a series of user-defined commands, it runs `sudo shutdown -h now` # to signal to Compute Engine that the shutdown process is # complete. # # To run this script, you must have passwordless sudo privileges. METADATA_URL="http://metadata.google.internal/computeMetadata/v1/instance/attributes/shutdown-status" LAST_ETAG="0" echo "Starting shutdown status watcher" while true; do # Wait for the metadata value to change. # The metadata server blocks the request until a change occurs or a timeout is reached. RESPONSE=$(curl -H "Metadata-Flavor: Google" -s -i "${METADATA_URL}?wait_for_change=true&last_etag=${LAST_ETAG}") CURL_EXIT_STATUS=$? if [[ ${CURL_EXIT_STATUS} -ne 0 ]]; then echo "Error: curl command failed with exit status ${CURL_EXIT_STATUS}. Retrying in 5 seconds..." sleep 5 continue fi # Strip carriage returns (\r) immediately to prevent CRLF line endings from corrupting string comparisons RESPONSE=$(echo "$RESPONSE" | tr -d '\r') # Extract the HTTP status code from the first line of the response HTTP_STATUS=$(echo "$RESPONSE" | head -n 1 | awk '{print $2}') if [[ "${HTTP_STATUS}" -eq 200 ]]; then # Read the new etag value to re-subscribe on the next poll. NEW_ETAG=$(echo "$RESPONSE" | grep -i "^ETag:" | awk '{print $2}') if [[ -n "${NEW_ETAG}" ]]; then LAST_ETAG="${NEW_ETAG}" fi # Extract the value of the shutdown status from the last line of the response body. SHUTDOWN_STATUS=$(echo "$RESPONSE" | tail -n 1) echo "Metadata changed. New ETag: ${LAST_ETAG}, shutdown-status: '${SHUTDOWN_STATUS}'" if [[ "${SHUTDOWN_STATUS}" == "PENDING_STOP" ]]; then echo "Shutdown signal 'PENDING_STOP' received. Exiting watcher loop." break fi elif [[ "${HTTP_STATUS}" -eq 503 ]]; then # 503 Service Unavailable: wait_for_change timed out with no change. Sleep and loop again. echo "Service temporarily unavailable or request timed out. Retrying in 2 seconds..." sleep 2 continue else # Unexpected HTTP status echo "Warning: Unexpected HTTP status ${HTTP_STATUS}. Retrying in 5 seconds..." sleep 5 fi done # -------------------------------------------------------- # Graceful shutdown commands section # -------------------------------------------------------- echo "Watcher loop exited. Starting graceful shutdown procedures..." # --- ADD YOUR GRACEFUL SHUTDOWN COMMANDS HERE --- echo "Graceful shutdown commands executed." # -------------------------------------------------------- # Signal OS to stop # -------------------------------------------------------- echo "Shutting down the guest OS to turn off the compute instance..." sudo shutdown -h now
Windows
Se non l'hai già fatto, connettiti all'istanza di computing utilizzando uno dei seguenti metodi:
Esegui uno script watcher o configuralo per l'esecuzione all'avvio, come di seguito. Aggiungi la logica di arresto specifica dove indicato:
<# .SYNOPSIS pre-shutdown-script.ps1 #> # -------------------------------------------------------- # Script for graceful shutdown based on the metadata value # -------------------------------------------------------- # # This script monitors the metadata key `shutdown-status` and # waits for its value to change to `PENDING_STOP`. After the script # runs a series of user-defined commands, it runs `Stop-Computer -Force` # to signal to Compute Engine that the shutdown process is # complete. $METADATA_URL = "http://metadata.google.internal/computeMetadata/v1/instance/attributes/shutdown-status" $LAST_ETAG = "0" Write-Host "Starting shutdown status watcher" while ($true) { $Response = $null $HTTP_STATUS = 0 # Wait for the metadata value to change. # The metadata server blocks the request until a change occurs or a timeout is reached. try { $Response = Invoke-WebRequest ` -Headers @{"Metadata-Flavor" = "Google"} ` -Uri "${METADATA_URL}?wait_for_change=true&last_etag=${LAST_ETAG}" ` -TimeoutSec 320 ` -ErrorAction Stop if ($null -ne $Response) { $HTTP_STATUS = [int]$Response.StatusCode } } catch { # Invoke-WebRequest throws an error for non-2xx status codes or connection failures. $Exception = $_.Exception if ($null -ne $Exception -and $null -ne $Exception.Response) { $HTTP_STATUS = [int]$Exception.Response.StatusCode } else { $HTTP_STATUS = 0 } } if ($HTTP_STATUS -eq 0) { Write-Host "Error: Request failed. Retrying in 5 seconds..." Start-Sleep -Seconds 5 continue } if ($HTTP_STATUS -eq 200) { # Read the new etag value to re-subscribe on the next poll. $NEW_ETAG = $Response.Headers["ETag"] if ($null -ne $NEW_ETAG) { $LAST_ETAG = $NEW_ETAG } # Extract the value of the shutdown status from the response body. $SHUTDOWN_STATUS = $Response.Content.Trim() Write-Host "Metadata changed. New ETag: ${LAST_ETAG}, shutdown-status: '${SHUTDOWN_STATUS}'" if ($SHUTDOWN_STATUS -eq "PENDING_STOP") { Write-Host "Shutdown signal 'PENDING_STOP' received. Exiting watcher loop." break } } elseif ($HTTP_STATUS -eq 503) { # 503 Service Unavailable: wait_for_change timed out with no change. Sleep and loop again. Write-Host "Service temporarily unavailable or request timed out. Retrying in 2 seconds..." Start-Sleep -Seconds 2 continue } else { # Unexpected HTTP status Write-Host "Warning: Unexpected HTTP status ${HTTP_STATUS}. Retrying in 5 seconds..." Start-Sleep -Seconds 5 } } # -------------------------------------------------------- # Graceful shutdown commands section # -------------------------------------------------------- Write-Host "Watcher loop exited. Starting graceful shutdown procedures..." # --- ADD YOUR GRACEFUL SHUTDOWN COMMANDS HERE --- Write-Host "Graceful shutdown commands executed." # -------------------------------------------------------- # Signal OS to Halt # -------------------------------------------------------- Write-Host "Shutting down the guest OS to turn off the compute instance..." Stop-Computer -Force
Visualizzazione dell'output di uno script di arresto
Linux
Puoi visualizzare l'output di uno script di arresto di Linux eseguendo una di queste operazioni:
Connettiti all'istanza ed esegui il seguente comando:
sudo journalctl -u google-shutdown-scripts.serviceVisualizza l'output tramite la porta seriale 1 nella console Google Cloud e controlla se sono presenti eventi
google_metadata_script_runner.IAP Desktop da una workstation Windows. Per saperne di più, consulta il repository GoogleCloudPlatform/iap-desktop su GitHub.
Windows
Visualizza l'output di uno script di arresto di Windows Server utilizzando uno dei seguenti comandi e controllando la presenza di eventi GCEMetadataScripts:
Porta seriale 1 nella console Google Cloud . Per saperne di più, consulta Visualizzazione dell'output della porta seriale.
Log applicazioni del Visualizzatore eventi di Windows.
IAP Desktop da una workstation Windows. Per saperne di più, consulta il repository GoogleCloudPlatform/iap-desktop su GitHub.