En este tutorial se explica cómo usar Cloud Scheduler y las funciones de Cloud Run para iniciar y detener automáticamente instancias de Compute Engine de forma periódica mediante etiquetas de recursos.
Objetivos
- Escribe y despliega un conjunto de funciones con funciones de Cloud Run que inicien y detengan instancias de Compute Engine.
- Crea un conjunto de tareas con Cloud Scheduler que programen instancias con una etiqueta de recurso
dev
para que se ejecuten de 9:00 a 17:00, de lunes a viernes, para que coincidan con el horario de apertura habitual.
Costes
En este documento, se utilizan los siguientes componentes facturables de Google Cloud:
- Cloud Scheduler
- Cloud Run functions
- Pub/Sub
- Compute Engine
Para generar una estimación de costes basada en el uso previsto,
utiliza la calculadora de precios.
Antes de empezar
- Configura tu entorno para Cloud Scheduler.
-
Enable the Cloud Run functions, Pub/Sub, and Compute Engine APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles.
Arquitectura de aplicaciones
Esta solución incluye los siguientes Google Cloud componentes:
- Instancia de Compute Engine que queremos ejecutar de forma programada.
- Funciones de Cloud Run para iniciar y detener la instancia que queremos programar.
- Mensajes de Pub/Sub enviados y recibidos por cada evento de inicio y de detención.
- Trabajos de Cloud Scheduler para hacer llamadas con una programación definida para iniciar y detener la instancia.
Requisitos de ubicación
Algunos componentes solo se admiten en determinadas regiones:
- Instancia de Compute Engine: se admite en cualquier región que figure en Regiones y zonas.
- Funciones de Cloud Run: admitidas en las regiones que se indican en Ubicaciones.
- Mensajes de Pub/Sub: se admiten en todo el mundo, ya que Pub/Sub es un servicio global.
- Tareas de Cloud Scheduler con destinos de Pub/Sub: se admiten en cualquier Google Cloud ubicación.
¿Por qué no usar HTTP en lugar de Pub/Sub?
Puede simplificar esta arquitectura usando activadores HTTP de funciones de Cloud Run en lugar de activadores de Pub/Sub.
En este tutorial se usa Pub/Sub como activador de las funciones de Cloud Run porque este método era más seguro que usar HTTP. Sin embargo, HTTP también es una opción válida y ahora se puede proteger requiriendo autenticación.
Para obtener información sobre cómo proteger Cloud Run Functions, consulta la descripción general de la seguridad de Cloud Run Functions. Para ver una comparación entre los activadores HTTP y Pub/Sub, consulta la documentación sobre los activadores de funciones de Cloud Run.
Configurar la instancia de Compute Engine
Consola
- Ve a la página Instancias de VM de la Google Cloud consola.
Ve a la página Instancias de VM. - Haz clic en Crear instancia.
- Asigna el valor
dev-instance
a Nombre. - En Etiquetas, haz clic en Añadir etiquetas.
- Haz clic en Añadir etiqueta.
- Escribe
env
en Clave ydev
en Valor. - En Región, seleccione us-west1.
- En Zona, selecciona us-west1-b.
- Haz clic en Guardar.
- En la parte inferior de la página, haz clic en Crear.
gcloud
gcloud compute instances create dev-instance \ --network default \ --zone us-west1-b \ --labels=env=dev
Desplegar funciones activadas por Pub/Sub mediante funciones de Cloud Run
Crear y desplegar las funciones
Consola
Crea la función de inicio.
- Ve a la página Funciones de Cloud Run de la Google Cloud consola.
Ve a la página de Cloud Run Functions. - Haz clic en Crear función.
- En Entorno, selecciona 1.ª gen..
- Asigna el valor
startInstancePubSub
a Nombre de la función. - Deja el valor predeterminado en Región.
- En Tipo de activador, selecciona Cloud Pub/Sub.
- En Seleccionar un tema de Cloud Pub/Sub, haz clic en Crear un tema.
- Debería aparecer un cuadro de diálogo Crear tema.
- En ID de tema, introduce
start-instance-event
. - Haz clic en Crear para cerrar el cuadro de diálogo.
- En ID de tema, introduce
- Haz clic en Guardar en la parte inferior del cuadro Activador.
- Haz clic en Siguiente en la parte inferior de la página.
- En Tiempo de ejecución, selecciona Node.js 16 o una versión posterior.
- En Punto de entrada, escribe
startInstancePubSub
. - En la parte izquierda del editor de código, selecciona index.js.
Sustituye el código inicial por el siguiente:
En la parte izquierda del editor de código, selecciona package.json.
Sustituye el código inicial por el siguiente:
En la parte inferior de la página, haga clic en Implementar.
Crea la función de parada.
- Deberías estar en la página Funciones de Cloud Run de la Google Cloud consola.
- Haz clic en Crear función.
- En Entorno, selecciona 1.ª gen..
- Asigna el valor
stopInstancePubSub
a Nombre de la función. - Deja el valor predeterminado en Región.
- En Tipo de activador, selecciona Cloud Pub/Sub.
- En Seleccionar un tema de Cloud Pub/Sub, haz clic en Crear un tema.
- Debería aparecer un cuadro de diálogo Crear tema.
- En ID de tema, introduce
stop-instance-event
. - Haz clic en Crear para cerrar el cuadro de diálogo.
- En ID de tema, introduce
- Haz clic en Guardar en la parte inferior del cuadro Activador.
- Haz clic en Siguiente en la parte inferior de la página.
- En Tiempo de ejecución, selecciona Node.js 16 o una versión posterior.
- En Punto de entrada, escribe
stopInstancePubSub
. - En la parte izquierda del editor de código, selecciona index.js.
Sustituye el código inicial por el siguiente:
En la parte izquierda del editor de código, selecciona package.json.
Sustituye el código inicial por el siguiente:
En la parte inferior de la página, haga clic en Implementar.
gcloud
Crea los temas de Pub/Sub.
gcloud pubsub topics create start-instance-event
gcloud pubsub topics create stop-instance-event
Obtén el código
Descarga el código.
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
También puedes descargar el ejemplo como un archivo ZIP y extraerlo.
Ve al directorio correcto.
cd nodejs-docs-samples/functions/scheduleinstance/
Crea las funciones de inicio y de finalización.
Deberías estar en el directorio nodejs-docs-samples/functions/scheduleinstance/
.
gcloud functions deploy startInstancePubSub \ --trigger-topic start-instance-event \ --runtime nodejs18 \ --allow-unauthenticated
gcloud functions deploy stopInstancePubSub \ --trigger-topic stop-instance-event \ --runtime nodejs18 \ --allow-unauthenticated
(Opcional) Verificar que las funciones funcionan
Consola
Detener la instancia
- Ve a la página Funciones de Cloud Run de la Google Cloud consola.
Ve a la página de Cloud Run Functions. - Haz clic en la función llamada
stopInstancePubSub
. - Verás varias pestañas: General, Activador, Fuente, Permisos y Pruebas. Haz clic en la pestaña Pruebas.
En Evento activador, introduzca lo siguiente:
{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}
Se trata simplemente de la cadena codificada en base64 de
{"zone":"us-west1-b", "label":"env=dev"}
Si quieres codificar tu propia cadena, puedes usar cualquier herramienta de codificación base64 online.
Haz clic en el botón Probar la función.
Cuando termine de ejecutarse, deberías ver
Successfully stopped instance dev-instance
impreso en Output (Salida). Puede tardar hasta 60 segundos en completarse.Si ves
error: 'Error: function failed to load.'
, espera unos 10 segundos a que se termine de implementar la función y vuelve a intentarlo.Si ves
error: 'Error: function execution attempt timed out.'
, ve al siguiente paso para comprobar si la instancia tarda mucho en cerrarse.Si, por el contrario, termina de ejecutarse, pero no muestra nada, probablemente también se haya agotado el tiempo de espera. Ve al siguiente paso para comprobar si la instancia tarda mucho en cerrarse.
Ve a la página Instancias de VM de la Google Cloud consola.
Ve a la página Instancias de VM.Verifica que la instancia llamada
dev-instance
tenga un cuadrado gris junto a su nombre, lo que indica que se ha detenido. Puede tardar hasta 30 segundos en apagarse.- Si parece que no termina, prueba a hacer clic en Actualizar en la parte superior de la página.
Iniciar la instancia
- Ve a la página Funciones de Cloud Run de la Google Cloud consola.
Ve a la página de Cloud Run Functions. - Haz clic en la función llamada
startInstancePubSub
. - Verás varias pestañas: General, Activador, Fuente, Permisos y Pruebas. Haz clic en la pestaña Pruebas.
En Evento activador, introduzca lo siguiente:
{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}
- De nuevo, se trata simplemente de la cadena codificada en Base64 de
{"zone":"us-west1-b", "label":"env=dev"}
- De nuevo, se trata simplemente de la cadena codificada en Base64 de
Haz clic en el botón Probar la función.
Cuando termine de ejecutarse, deberías ver
Successfully started instance dev-instance
impreso en Output (Salida).Ve a la página Instancias de VM de la Google Cloud consola.
Ve a la página Instancias de VM.Verifica que la instancia llamada
dev-instance
tenga una marca de verificación verde junto a su nombre, lo que indica que está en ejecución. Puede tardar hasta 30 segundos en iniciarse.
gcloud
Detener la instancia
Llama a la función para detener la instancia.
gcloud functions call stopInstancePubSub \ --data '{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}'
Se trata simplemente de la cadena codificada en base64 de
{"zone":"us-west1-b", "label":"env=dev"}
Si quieres codificar tu propia cadena, puedes usar cualquier herramienta. A continuación, se muestra un ejemplo en el que se usa la herramienta de línea de comandos
base64
:echo '{"zone":"us-west1-b", "label":"env=dev"}' | base64
eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo=
Cuando la función haya terminado, debería ver lo siguiente:
result: Successfully stopped instance dev-instance
Puede tardar hasta 60 segundos en completarse.
Si, por el contrario, aparece el siguiente error:
error: 'Error: function failed to load.`
Espera unos 10 segundos a que se termine de implementar la función y vuelve a intentarlo.
Si, por el contrario, aparece el siguiente error:
error: `Error: function execution attempt timed out.`
Ve al siguiente paso para comprobar si la instancia tarda mucho en apagarse.
Si no obtienes ningún resultado, es probable que la función haya agotado el tiempo de espera. Ve al siguiente paso para comprobar si la instancia tarda mucho en apagarse.
Comprueba que la instancia tenga el estado
TERMINATED
. Puede tardar hasta 30 segundos en apagarse.gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: TERMINATED
Iniciar la instancia
Llama a la función para iniciar la instancia.
gcloud functions call startInstancePubSub \ --data '{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}'
- De nuevo, se trata simplemente de la cadena codificada en Base64 de
{"zone":"us-west1-b", "label":"env=dev"}
Cuando la función haya terminado, debería ver lo siguiente:
result: Successfully started instance dev-instance
- De nuevo, se trata simplemente de la cadena codificada en Base64 de
Comprueba que la instancia tenga el estado
RUNNING
. Puede tardar hasta 30 segundos en iniciarse.gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: RUNNING
Configurar las tareas de Cloud Scheduler para llamar a Pub/Sub
Crear las tareas
Consola
Crea la tarea de inicio.
- Ve a la página Cloud Scheduler de la consola de Google Cloud .
Ve a la página Cloud Scheduler. - Haz clic en Crear un trabajo.
- Deja la región predeterminada.
- Asigna el valor
startup-dev-instances
a Nombre. - En Frecuencia, escribe
0 9 * * 1-5
.- Se ejecutará todos los días de lunes a viernes a las 9:00.
- En Zona horaria, selecciona el país y la zona horaria que quieras. En este ejemplo se usarán
United States
yLos Angeles
. - Haz clic en Continuar.
- En Target type (Tipo de objetivo), selecciona
Pub/Sub
. - Selecciona
start-instance-event
en el menú desplegable de temas. - En Mensaje, introduce lo siguiente:
{"zone":"us-west1-b","label":"env=dev"}
- Haz clic en Crear.
Crea la tarea de detención.
- Deberías estar en la página Cloud Scheduler de la consola de Google Cloud .
- Haz clic en Crear trabajo.
- Deje la región predeterminada y haga clic en Siguiente en la parte inferior de la página.
- Asigna el valor
shutdown-dev-instances
a Nombre. - En Frecuencia, escribe
0 17 * * 1-5
.- Se ejecutará a las 17:00 todos los días de lunes a viernes.
- En Zona horaria, selecciona el país y la zona horaria que quieras. En este ejemplo se usarán
United States
yLos Angeles
. - Haz clic en Continuar.
- En Target type (Tipo de objetivo), selecciona
Pub/Sub
. - Selecciona
stop-instance-event
en el menú desplegable de temas. - En Mensaje, introduce lo siguiente:
{"zone":"us-west1-b","label":"env=dev"}
- Haz clic en Crear.
gcloud
Crea la tarea de inicio.
gcloud scheduler jobs create pubsub startup-dev-instances \ --schedule '0 9 * * 1-5' \ --topic start-instance-event \ --message-body '{"zone":"us-west1-b", "label":"env=dev"}' \ --time-zone 'America/Los_Angeles' \ --location us-central1
Crea la tarea de detención.
gcloud scheduler jobs create pubsub shutdown-dev-instances \ --schedule '0 17 * * 1-5' \ --topic stop-instance-event \ --message-body '{"zone":"us-west1-b", "label":"env=dev"}' \ --time-zone 'America/Los_Angeles' \ --location us-central1
(Opcional) Verificar que las tareas funcionan
Consola
Detener la instancia
- Ve a la página Cloud Scheduler de la consola de Google Cloud .
Ve a la página Cloud Scheduler. - En el trabajo llamado
shutdown-dev-instances
, haz clic en el botón Ejecutar ahora, situado en el extremo derecho de la página. - Ve a la página Instancias de VM de la Google Cloud consola.
Ve a la página Instancias de VM. - Verifica que la instancia llamada
dev-instance
tenga un cuadrado gris junto a su nombre, lo que indica que se ha detenido. Puede tardar hasta 30 segundos en apagarse.
Iniciar la instancia
- Ve a la página Cloud Scheduler de la consola de Google Cloud .
Ve a la página Cloud Scheduler. - En el trabajo llamado
startup-dev-instances
, haz clic en el botón Ejecutar ahora, situado en el extremo derecho de la página. - Ve a la página Instancias de VM de la Google Cloud consola.
Ve a la página Instancias de VM. - Verifica que la instancia llamada
dev-instance
tenga una marca de verificación verde junto a su nombre, lo que indica que está en ejecución. Puede tardar hasta 30 segundos en iniciarse.
gcloud
Detener la instancia
Ejecuta la tarea del programador para detener la instancia.
gcloud beta scheduler jobs run shutdown-dev-instances
Comprueba que la instancia tenga el estado
TERMINATED
. Puede tardar hasta 30 segundos en apagarse.gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: TERMINATED
Iniciar la instancia
Ejecuta la tarea del programador para iniciar la instancia.
gcloud beta scheduler jobs run startup-dev-instances
Comprueba que la instancia tenga el estado
RUNNING
. Puede tardar hasta 30 segundos en iniciarse.gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: RUNNING
Limpieza
Cuando hayas terminado el tutorial, puedes eliminar los recursos que has creado para que dejen de usar cuota y generar cargos. En las siguientes secciones se explica cómo eliminar o desactivar dichos recursos.
Elimina las tareas de Cloud Scheduler
Ve a la página Cloud Scheduler de la consola de Google Cloud .
Haz clic en las casillas situadas junto a los trabajos.
Haz clic en el botón Eliminar situado en la parte superior de la página y confirma la eliminación.
Eliminar los temas de Pub/Sub
Ve a la página Pub/Sub de la Google Cloud consola.
Marca las casillas situadas junto a los temas.
Haz clic en Eliminar en la parte superior de la página y confirma que quieres eliminarlo.
Eliminar las funciones desplegadas a través de Cloud Run Functions
Ve a la página Funciones de Cloud Run de la Google Cloud consola.
Marca las casillas situadas junto a las funciones.
Haz clic en el botón Eliminar situado en la parte superior de la página y confirma la eliminación.
Eliminar la instancia de Compute Engine
Para eliminar una instancia de Compute Engine:
- In the Google Cloud console, go to the VM instances page.
- Select the checkbox for the instance that you want to delete.
- To delete the instance, click More actions, click Delete, and then follow the instructions.
Eliminar el proyecto
La forma más fácil de evitar que te cobren es eliminar el proyecto que has creado para el tutorial.
Para ello, sigue las instrucciones que aparecen a continuación:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Siguientes pasos
- Consulta arquitecturas de referencia, diagramas y prácticas recomendadas sobre Google Cloud. Consulta nuestro Centro de arquitectura de Cloud.