Crea y ejecuta secuencias de comandos de apagado que ejecuten comandos justo antes de que se detenga o reinicie una instancia de máquina virtual (VM). Esto es útil si usas las secuencias de comandos automatizadas para iniciar y apagar instancias, lo que permite que las instancias se limpien o realicen tareas, como exportar registros o sincronizarse con otros sistemas.
Las secuencias de comandos de apagado son útiles, en particular, para las VM de un grupo de instancias administrado con un escalador automático. Si el escalador automático apaga una VM del grupo, la secuencia de comandos de apagado se ejecuta antes de que se detenga la VM y realiza cualquier acción que definas. La secuencia de comandos se ejecuta durante el período de apagado limitado antes de que se detenga la VM. Por ejemplo, la secuencia de comandos de apagado puede copiar datos procesados en Cloud Storage o hacer una copia de seguridad de cualquier registro.
Las secuencias de comandos de apagado funcionan de manera muy similar a las secuencias de comandos de inicio. Gran parte de la documentación para las secuencia de comandos de inicio también se aplica a las de apagado.
Para las tareas de apagado y reinicio, las VM siempre ejecutan secuencias de comandos de apagado de la siguiente manera:
- Para las VM de Linux, utiliza el usuario
root. - Para las VM de Windows, utiliza la cuenta
System.
Requisitos previos
Para ejecutar secuencias de comandos almacenadas en metadatos en una instancia de VM, el entorno de invitado debe estar instalado y en ejecución.
- El entorno de invitado incluye el agente invitado (por ejemplo, google-guest-agent en Linux) que lee el contenido o la URL de la secuencia de comandos de los metadatos de la instancia y, luego, inicia la ejecución.
- Todas las imágenes públicas de Compute Engine incluyen el entorno de invitado preinstalado.
- Si creas una imagen personalizada, debes instalar de forma manual el entorno de invitado de Google para garantizar que las secuencias de comandos de los metadatos y otras funciones de Google Cloud funcionen correctamente.
Antes de comenzar
- Obtén información sobre las secuencia de comandos de inicio.
- Comprende qué es el servidor de metadatos.
-
Si aún no lo hiciste, configura la autenticación.
La autenticación verifica tu identidad para acceder a los servicios y las APIs de Google Cloud . Para ejecutar
código o muestras desde un entorno de desarrollo local, puedes autenticarte en
Compute Engine seleccionando una de las siguientes opciones:
Selecciona la pestaña según cómo planeas usar las muestras de esta página:
Console
Cuando usas la consola de Google Cloud para acceder a los servicios y las APIs de Google Cloud , no necesitas configurar la autenticación.
gcloud
-
Instala Google Cloud CLI. Después de instalarla, inicializa Google Cloud CLI ejecutando el siguiente comando:
gcloud initSi usas un proveedor de identidad externo (IdP), primero debes acceder a la gcloud CLI con tu identidad federada.
-
- Configura una región y una zona predeterminadas.
-
Instala Google Cloud CLI.
-
Si usas un proveedor de identidad externo (IdP), primero debes acceder a la gcloud CLI con tu identidad federada.
-
Si usas una shell local, crea credenciales de autenticación locales para tu cuenta de usuario:
gcloud auth application-default login
No es necesario que lo hagas si usas Cloud Shell.
Si se muestra un error de autenticación y usas un proveedor de identidad externo (IdP), confirma que accediste a gcloud CLI con tu identidad federada.
Terraform
Para usar las muestras de Terraform de esta página en un entorno de desarrollo local, instala e inicializa gcloud CLI y, luego, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.
Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
REST
Para usar las muestras de la API de REST incluidas en esta página en un entorno de desarrollo local, debes usar las credenciales que proporciones a la gcloud CLI.
Instala Google Cloud CLI.
Si usas un proveedor de identidad externo (IdP), primero debes acceder a la gcloud CLI con tu identidad federada.
Para obtener más información, consulta Autentícate para usar REST en la documentación de autenticación de Google Cloud .
Permisos necesarios para esta tarea
Para realizar esta tarea, debes tener los siguientes permisos:
- Todos los permisos necesarios para crear una instancia
compute.instances.setMetadataen la instancia
Especificaciones
En las siguientes secciones, se describen las especificaciones de las secuencias de comandos de cierre.
Limitaciones
Hay algunas limitaciones que se deben tener en cuenta cuando se usan secuencias de comandos de apagado:
- Compute Engine ejecuta secuencias de comandos de apagado solo en función del mejor esfuerzo. Es poco frecuente que Compute Engine no pueda garantizar que se complete la secuencia de comandos de apagado.
- En Windows, se usa la política de grupo local para iniciar la secuencia de comandos de apagado.
- El paquete de instalación configura la configuración
Computer Configuration/Windows Setting/Scripts (Startup/Shutdown)de la política de grupo local para iniciar la secuencia de comandos cuando se cierra el sistema.
- El paquete de instalación configura la configuración
Invocación de la secuencia de comandos de apagado
Las secuencias de comandos de apagado se activan cuando la instancia se cierra después de que ocurre cualquiera de los siguientes eventos:
Debes hacer lo siguiente:
Compute Engine detiene una instancia como parte de una operación de detención o eliminación programada.
Compute Engine detiene una VM Spot o una instancia interrumpible como parte del proceso de interrupción.
Una secuencia de comandos de apagado puede ser de cualquier tipo de archivo. Si hay una secuencia de comandos de apagado presente en la instancia, Compute Engine hace lo siguiente:
- Copia la secuencia de comandos en un archivo local de la instancia.
- Establece permisos en el archivo para que la secuencia de comandos sea ejecutable.
- Ejecuta el archivo cuando se cierra la instancia.
Podrías, por ejemplo, proporcionar una secuencia de comandos de Python, en lugar de una de Bash. Ten en cuenta que Compute Engine ejecuta la secuencia de comandos de manera literal, sin importar el tipo.
Para ejecutar una secuencia de comandos que no sea Bash, agrega una línea shebang en la parte superior del archivo para que el sistema operativo sepa qué intérprete usar. Por ejemplo, para una secuencia de comandos de Python, puedes agregar una línea shebang como la que se muestra a continuación:
#!/usr/bin/python
Tiempo de ejecución de la secuencia de comandos de apagado
Las secuencias de comandos de apagado comienzan a ejecutarse cuando Compute Engine establece el
estado de la instancia en STOPPING. Tus secuencias de comandos deben completarse antes de que la instancia
se detenga por completo, que es cuando su estado cambia a TERMINATED. El tiempo que tarda
la instancia en alcanzar el estado TERMINATED varía según el
tipo de instancia.
Si tus secuencias de comandos tardan más que el tiempo que tarda la instancia en detenerse,
Compute Engine las detiene de forma forzosa, lo que puede provocar
pérdida de datos o tareas incompletas. Para evitarlo,
detén la instancia desde su SO invitado.
Este enfoque mantiene el estado de la instancia en STOPPING hasta que las secuencias de comandos de cierre
terminen de ejecutarse.
Usa una secuencia de comandos de apagado local
Una secuencia de comandos de apagado local es una secuencia de comandos que reside en tu computadora local. Debes pasar una secuencia de comandos de apagado local como un archivo o mediante la entrega del contenido directo a Compute Engine.
Las secuencias de comandos de apagado pueden realizar tantas acciones como necesites, pero si pasas el archivo de manera local, la secuencia de comandos no puede exceder el límite de longitud del valor de metadatos de 256 KB. Para usar una secuencia de comandos que exceda el límite de longitud, almacena el archivo en Cloud Storage. Consulta Ejecuta secuencias de comandos de apagado de Google Cloud Storage para obtener más información.
Proporciona un archivo de secuencia de comandos de apagado
Solo puedes pasar un archivo de secuencia de comandos de apagado local a través de la herramienta de línea de comandos de gcloud.
gcloud
Para pasar un archivo de secuencia de comandos de apagado local, proporciona la marca --metadata-from-file, seguida de un par de claves de metadatos, shutdown-script=PATH/TO/FILE, en el que
PATH/TO/FILE es una ruta de acceso relativa a la secuencia de comandos de apagado. Por ejemplo:
gcloud compute instances create example-instance \
--metadata-from-file shutdown-script=examples/scripts/install.sh
Terraform
Para especificar una secuencia de comandos de apagado de forma directa, usa el recurso google_compute_instance con la ruta de acceso a la secuencia de comandos de apagado en los metadatos.
Si deseas obtener más información para aplicar o quitar una configuración de Terraform, consulta los comandos básicos de Terraform.
Proporciona el contenido de la secuencia de comandos de apagado de manera directa
Una alternativa es pasar el contenido de la secuencia de comandos de apagado de manera directa.
Console
En la consola de Google Cloud , especifica una secuencia de comandos de apagado directamente con la clave de metadatos
shutdown-script:
Ir a la página Crear una instancia
Especifica los detalles de la VM.
Expanda la sección Opciones avanzadas.
Expande Administración y haz lo siguiente:
- En la sección Metadatos, haz clic en Agregar elemento.
- En el campo Clave, ingresa
shutdown-scriptpara la clave de metadatos. - En el campo Valor, agrega el contenido de la secuencia de comandos de apagado.
Continúa con el proceso de creación de VM.
gcloud
Con Google Cloud CLI, usa la marca --metadata para proporcionar el contenido de la secuencia de comandos de apagado, seguida del par de claves shutdown-script=CONTENTS, en el queCONTENTS es el contenido de la secuencia de comandos de apagado.
gcloud compute instances create example-instance --metadata shutdown-script="#! /bin/bash
> # Shuts down Apache server
> /etc/init.d/apache2 stop"
Terraform
Para especificar una secuencia de comandos de apagado de forma directa, usa el recurso google_compute_instance
con la secuencia de comandos de apagado en los metadatos.
Si deseas obtener más información para aplicar o quitar una configuración de Terraform, consulta los comandos básicos de Terraform.
REST
En la API, proporciona una secuencia de comandos de apagado como parte de la propiedad de metadatos en la solicitud cuando crees una instancia. Usa shutdown-script como la clave de metadatos:
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"
}
]
}...
}
Proporciona una secuencia de comandos de apagado en instancias de Windows
Ejecuta secuencias de comandos de apagado en instancias de Windows con las siguientes claves de metadatos específicas de Windows. Elige entre cualquiera de las claves especializadas que se enumeran a continuación. Cada clave debe coincidir con el tipo de secuencia de comandos que deseas ejecutar.
Puedes especificar múltiples secuencias de comandos de apagado si pasas diferentes claves a la instancia, pero cada clave solo se puede especificar una vez por máquina virtual.
Las siguientes claves se pueden usar con una secuencia de comandos de apagado local, con las mismas instrucciones que se mencionaron antes en este documento.
Secuencias de comandos de apagado de cmd |
Secuencias de comandos de apagado de bat |
Secuencias de comandos de apagado de ps1 |
|---|---|---|
windows-shutdown-script-cmd |
windows-shutdown-script-bat |
windows-shutdown-script-ps1 |
Usa una secuencia de comandos de apagado de Cloud Storage
Puedes almacenar y usar una secuencia de comandos de apagado desde Cloud Storage. Sigue las instrucciones en la documentación de secuencias de comandos de inicio, pero reemplaza startup-script-url por shutdown-script-url.
Para las instancias de Windows, reemplaza windows-startup-script-url por windows-shutdown-script-url.
Aplica una secuencia de comandos de apagado en las instancias en ejecución
Para agregar una secuencia de comandos de apagado a una instancia en ejecución, sigue las instrucciones en la documentación de Aplica una secuencia de comandos de inicio a instancias en ejecución, pero reemplaza las claves de metadatos con una de las claves siguientes:
shutdown-script: proporciona el contenido de la secuencia de comandos de apagado directamente con esta clave. Con Google Cloud CLI, puedes proporcionar la ruta a un archivo de secuencia de comandos de apagado, con la marca--metadata-from-filey la clave de metadatosshutdown-script.shutdown-script-url: proporciona una URL de Cloud Storage al archivo de secuencia de comandos de apagado con esta clave.
Ejecuta una secuencia de comandos de cierre durante un cierre ordenado
De forma predeterminada, si una instancia de procesamiento tiene habilitado el cierre ordenado, las secuencias de comandos de cierre que configures en las claves de metadatos se ejecutarán después de que finalice el cierre ordenado.
Para ejecutar comandos durante un cierre ordenado, debes usar una secuencia de comandos de observador personalizada que sondee de forma continua el servidor de metadatos en segundo plano, como se muestra en esta sección. Para darles a tus secuencias de comandos suficiente tiempo para completarse y evitar posibles pérdidas de datos o tareas incompletas, te recomendamos que modifiques tus secuencias de comandos de cierre moviendo tu lógica a esta secuencia de comandos de observador.
Para ejecutar una secuencia de comandos de cierre durante un cierre ordenado, selecciona una de las siguientes opciones según el SO invitado que use tu instancia de procesamiento:
Linux
Si aún no lo hiciste, conéctate a la instancia de procesamiento.
Ejecuta una secuencia de comandos de observador o configúrala para que se ejecute en el inicio, como se muestra a continuación. Agrega tu lógica de cierre específica donde se indica:
#!/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
Si aún no lo hiciste, conéctate a la instancia de procesamiento con uno de los siguientes métodos:
Ejecuta una secuencia de comandos de observador o configúrala para que se ejecute en el inicio, como se muestra a continuación. Agrega tu lógica de cierre específica donde se indica:
<# .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
Visualiza el resultado de una secuencia de comandos de apagado
Linux
Para ver el resultado de una secuencia de comandos de apagado de Linux, puedes elegir una de las siguientes opciones:
Conéctate a la instancia y ejecuta el siguiente comando.
sudo journalctl -u google-shutdown-scripts.serviceVisualiza el resultado a través del puerto en serie 1 en la consola de Google Cloud y verifica los eventos
google_metadata_script_runner.IAP Desktop desde una estación de trabajo de Windows. Para obtener más información, consulta el repositorio GoogleCloudPlatform/iap-desktop en GitHub.
Windows
Puedes ver el resultado de una secuencia de comandos de apagado de Windows Server mediante alguna de las siguientes opciones y buscando eventos GCEMetadataScripts:
Puerto en serie 1 en la consola de Google Cloud . Para obtener más información, consulta Visualiza la puerto en serie serie.
Registro de aplicaciones del visualizador de eventos de Windows
IAP Desktop desde una estación de trabajo de Windows. Para obtener más información, consulta el repositorio GoogleCloudPlatform/iap-desktop en GitHub.