En este instructivo, se muestra cómo usar Cloud Scheduler y Cloud Functions para iniciar y detener automáticamente instancias de Compute Engine de forma periódica mediante etiquetas de recursos.
Objetivos
- Escribir e implementar un conjunto de funciones con Cloud Functions que inicien y detengan instancias de Compute Engine
- Cree un conjunto de trabajos con Cloud Scheduler que programe instancias con una etiqueta de recursos
dev
para ejecutar de 09:00 a 17:00, de lunes a viernes para que coincida con el horario comercial habitual.
Costos
En este documento, usarás los siguientes componentes facturables de Google Cloud:
- Cloud Scheduler
- Cloud Functions
- Pub/Sub
- Compute Engine
Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.
Antes de comenzar
- Configura tu entorno para Cloud Scheduler.
-
Habilita las API de Cloud Functions, Pub/Sub, and Compute Engine.
Arquitectura de aplicaciones
Esta solución incluye los siguientes componentes de Google Cloud:
- instancia de Compute Engine que queremos ejecutar de manera programada.
- Cloud Functions para iniciar y detener la instancia que queremos programar.
- Mensajes de Pub/Sub que se envían y reciben para cada evento de inicio y detención
- Trabajos de Cloud Scheduler para realizar llamadas en un programa establecido con el objetivo de iniciar y detener la instancia
Requisitos de ubicación
Algunos componentes solo están disponibles en determinadas regiones:
- Instancia de Compute Engine: Se admite en cualquier región que se enumera en Regiones y zonas.
- Cloud Functions: compatible con las regiones enumeradas en Ubicaciones.
- Mensajes de Pub/Sub: admitidos globalmente, ya que Pub/Sub es un servicio global.
- Trabajos de Cloud Scheduler con destinos de Pub/Sub: compatibles con cualquier ubicación de Google Cloud
¿Por qué no usar HTTP en lugar de Pub/Sub?
Es posible que desee simplificar esta arquitectura utilizando activadores HTTP de Cloud Functions en lugar de activadores de Pub/Sub.
En este instructivo, se usa Pub/Sub como el activador de Cloud Functions porque este método antes era más seguro que el uso de HTTP. Sin embargo, HTTP también es una opción válida y ahora se puede proteger mediante la solicitud de autenticación.
Para obtener información sobre cómo proteger Cloud Functions, consulta la descripción general de seguridad de Cloud Functions. Para ver una comparación entre los activadores HTTP y de Pub/Sub, consulta la documentación de activadores de Cloud Functions.
Cómo configurar la instancia de Compute Engine
Console
- Ve a la página Instancias de VM en la consola de Google Cloud.
Ir a la página Instancias de VM - Haz clic en Crear instancia.
- Configura el campo Nombre como
dev-instance
. - En Etiquetas, haz clic en Agregar etiquetas.
- Haz clic en Agregar etiqueta.
- Ingresa
env
en Clave ydev
en Valor. - En Región, selecciona us-west1.
- En Zona, selecciona us-west1-b.
- Haz clic en Guardar.
- Haz clic en Crear en la parte inferior de la página.
gcloud
gcloud compute instances create dev-instance \ --network default \ --zone us-west1-b \ --labels=env=dev
Implementa funciones activadas por Pub/Sub a través de Cloud Functions
Crea e implementa las funciones
Console
Crea la función de inicio.
- Ve a la página de Cloud Functions en la consola de Google Cloud.
Ir a la página Cloud Functions - Haz clic en Crear función.
- En Entorno, selecciona 1ª gen.
- Configura el Nombre de la función como
startInstancePubSub
. - Deja Región en el valor predeterminado.
- En Tipo de activador, selecciona Cloud Pub/Sub.
- En Selecciona un tema de Cloud Pub/Sub, haz clic en Crear un tema.
- Aparecerá el diálogo Crear tema.
- En ID del tema, ingresa
start-instance-event
. - Haz clic en Crear para finalizar el diálogo.
- En ID del tema, ingresa
- Haz clic en Guardar en la parte inferior del cuadro Activador.
- Haz clic en Siguiente en la parte inferior de la página.
- En Entorno de ejecución, selecciona Node.js 16 o una versión posterior.
- En Punto de entrada, ingresa
startInstancePubSub
. - En el lado izquierdo del editor de código, selecciona index.js.
Reemplaza el código de inicio con lo siguiente:
En el lado izquierdo del editor de código, selecciona package.json.
Reemplaza el código de inicio con lo siguiente:
Haz clic en Implementar en la parte inferior de la página.
Crea la función de detención.
- Deberías estar en la página de Cloud Functions en la consola de Google Cloud.
- Haz clic en Crear función.
- En Entorno, selecciona 1ª gen.
- Configura el Nombre de la función como
stopInstancePubSub
. - Deja Región en el valor predeterminado.
- En Tipo de activador, selecciona Cloud Pub/Sub.
- En Selecciona un tema de Cloud Pub/Sub, haz clic en Crear un tema.
- Aparecerá el diálogo Crear tema.
- En ID del tema, ingresa
stop-instance-event
. - Haz clic en Crear para finalizar el diálogo.
- En ID del tema, ingresa
- Haz clic en Guardar en la parte inferior del cuadro Activador.
- Haz clic en Siguiente en la parte inferior de la página.
- En Entorno de ejecución, selecciona Node.js 16 o una versión posterior.
- En Punto de entrada, ingresa
stopInstancePubSub
. - En el lado izquierdo del editor de código, selecciona index.js.
Reemplaza el código de inicio con lo siguiente:
En el lado izquierdo del editor de código, selecciona package.json.
Reemplaza el código de inicio con lo siguiente:
Haz clic en Implementar en la parte inferior de la página.
gcloud
Crea los temas de Pub/Sub.
gcloud pubsub topics create start-instance-event
gcloud pubsub topics create stop-instance-event
Cómo obtener el código
Descarga el código.
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
De manera opcional, puedes descargar la muestra como un archivo zip y extraerla.
Ve al directorio correcto.
cd nodejs-docs-samples/functions/scheduleinstance/
Crea las funciones de inicio y detención.
Debes 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: Verifica que tus funciones actúen correctamente
Console
Detener la instancia
- Ve a la página de Cloud Functions en la consola de Google Cloud.
Ir a la página Cloud Functions - Haz clic en la función denominada
stopInstancePubSub
. - Deberías ver varias pestañas: Consideraciones Generales : Activador : Búsqueda , Permisos y Realiza una prueba. Haz clic en la pestaña Prueba.
Para Evento de activación, ingresa lo siguiente:
{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}
Esto es simplemente una string codificada en base64 para
{"zone":"us-west1-b", "label":"env=dev"}
Si deseas codificar tu propia string, puedes usar cualquier herramienta de codificación en base64 en línea.
Haz clic en el botón Probar la función.
Cuando termine de ejecutarse, deberías ver
Successfully stopped instance dev-instance
impreso en Resultado. La ejecución puede tardar hasta 60 segundos en completarse.Si, en cambio, ves
error: 'Error: function failed to load.'
, espera unos 10 segundos para que la función termine de implementarse y vuelve a intentarlo.Si, en cambio, ves
error: 'Error: function execution attempt timed out.'
, continúa con el paso siguiente para comprobar si la instancia está tardando mucho en desactivarse.Si, en cambio, termina de ejecutarse, pero no se muestra ningún resultado, probablemente también se haya agotado el tiempo de espera. Simplemente continúa con el siguiente paso para comprobar si la instancia está tardando mucho en desactivarse.
Ve a la página Instancias de VM en la consola de Google Cloud.
Ir a la página Instancias de VMVerifica que la instancia denominada
dev-instance
tenga un cuadrado gris junto a su nombre, lo que indica que que se detuvo. Puede tardar hasta 30 segundos en terminar de desactivarse.- Si parece que no va a finalizar, prueba hacer clic en Actualizar en la parte superior de la página.
Inicia la instancia
- Ve a la página de Cloud Functions en la consola de Google Cloud.
Ir a la página Cloud Functions - Haz clic en la función denominada
startInstancePubSub
. - Deberías ver varias pestañas: Consideraciones Generales : Activador : Búsqueda , Permisos y Realiza una prueba. Haz clic en la pestaña Prueba.
Para Evento de activación, ingresa lo siguiente:
{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}
- Nuevamente, esta es simplemente la string codificada en base64 para
{"zone":"us-west1-b", "label":"env=dev"}
- Nuevamente, esta es simplemente la string codificada en base64 para
Haz clic en el botón Probar la función.
Cuando termine de ejecutarse, deberías ver
Successfully started instance dev-instance
impreso en Resultado.Ve a la página Instancias de VM en la consola de Google Cloud.
Ir a la página Instancias de VMVerifica que la instancia denominada
dev-instance
tenga una marca de verificación verde junto a su nombre, lo que indica que se está ejecutando. Puede tardar hasta 30 segundos en terminar de iniciarse.
gcloud
Detén la instancia
Llama la función para detener la instancia.
gcloud functions call stopInstancePubSub \ --data '{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}'
Esto es simplemente una string codificada en base64 para
{"zone":"us-west1-b", "label":"env=dev"}
Si deseas codificar tu propia string, puedes usar cualquier herramienta. Aquí hay un ejemplo usando la herramienta de línea de comandos de
base64
:echo '{"zone":"us-west1-b", "label":"env=dev"}' | base64
eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo=
Cuando la función haya finalizado, deberías ver lo siguiente:
result: Successfully stopped instance dev-instance
La ejecución puede tardar hasta 60 segundos en completarse.
Si, en cambio, aparece el siguiente error:
error: 'Error: function failed to load.`
Simplemente espera unos 10 segundos para que la función termine de implementarse y vuelve a intentarlo.
Si, en cambio, aparece el siguiente error:
error: `Error: function execution attempt timed out.`
Continúa con el siguiente paso para comprobar si la instancia está tardando mucho en desactivarse.
Si, en cambio, no obtienes ningún resultado, es probable que se haya agotado el tiempo de espera de la función. Continúa con el siguiente paso para comprobar si la instancia está tardando mucho en desactivarse.
Comprueba que la instancia tenga el estado
TERMINATED
. Puede tardar hasta 30 segundos en terminar de apagarse.gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: TERMINATED
Inicia la instancia
Llama la función para iniciar la instancia.
gcloud functions call startInstancePubSub \ --data '{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}'
- Nuevamente, esta es simplemente la string codificada en base64 para
{"zone":"us-west1-b", "label":"env=dev"}
Cuando la función haya finalizado, deberías ver lo siguiente:
result: Successfully started instance dev-instance
- Nuevamente, esta es simplemente la string codificada en base64 para
Comprueba que la instancia tenga el estado
RUNNING
. Puede tardar hasta 30 segundos en terminar de iniciarse.gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: RUNNING
Configura los trabajos de Cloud Scheduler para llamar a Pub/Sub
Crea los trabajos
Console
Crea el trabajo de inicio.
- Ve a la página de Cloud Scheduler en la consola de Google Cloud.
Ir a la página Cloud Scheduler - Haz clic en Crea un trabajo.
- Deja la región predeterminada.
- Configura el campo Nombre como
startup-dev-instances
. - En Frecuencia, ingresa
0 9 * * 1-5
.- Se ejecutará a las 9:00 a.m. todos los días, de lunes a viernes.
- En Zona horaria, selecciona el país y la zona horaria que desees. En este ejemplo, se usarán
United States
yLos Angeles
. - Haz clic en Continuar.
- En Tipo de destino, selecciona
Pub/Sub
. - Selecciona
start-instance-event
en el menú desplegable de temas. - En Mensaje, ingresa lo siguiente:
{"zone":"us-west1-b","label":"env=dev"}
- Haz clic en Crear.
Crea el trabajo de detención.
- Deberías estar en la página de Cloud Scheduler en la consola de Google Cloud.
- Haz clic en Crear trabajo.
- Deja la región predeterminada y haz clic en Siguiente en la parte inferior de la página.
- Establece el campo Nombre como
shutdown-dev-instances
. - En Frecuencia, ingresa
0 17 * * 1-5
.- Se ejecutará a las 17:00 p.m. todos los días, de lunes a viernes.
- En Zona horaria, selecciona el país y la zona horaria que desees. En este ejemplo, se usarán
United States
yLos Angeles
. - Haz clic en Continuar.
- En Tipo de destino, selecciona
Pub/Sub
. - Selecciona
stop-instance-event
en el menú desplegable de temas. - En Mensaje, ingresa lo siguiente:
{"zone":"us-west1-b","label":"env=dev"}
- Haz clic en Crear.
gcloud
Crea el trabajo 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 el trabajo 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: Verifica que los trabajos funcionen
Console
Detener la instancia
- Ve a la página de Cloud Scheduler en la consola de Google Cloud.
Ir a la página Cloud Scheduler - En el trabajo denominado
shutdown-dev-instances
, haz clic en el botón Ejecutar ahora en el extremo derecho de la página. - Ve a la página Instancias de VM en la consola de Google Cloud.
Ir a la página Instancias de VM - Verifica que la instancia denominada
dev-instance
tenga un cuadrado gris junto a su nombre, lo que indica que que se detuvo. Puede tomar hasta 30 segundos para que termine de desactivarse.
Inicia la instancia
- Ve a la página de Cloud Scheduler en la consola de Google Cloud.
Ir a la página Cloud Scheduler - En el trabajo denominado
startup-dev-instances
, haz clic en el botón Ejecutar ahora en el extremo derecho de la página. - Ve a la página Instancias de VM en la consola de Google Cloud.
Ir a la página Instancias de VM - Verifica que la instancia denominada
dev-instance
tenga una marca de verificación verde junto a su nombre, lo que indica que se está ejecutando. Puede tardar hasta 30 segundos para que termine de iniciarse.
gcloud
Detén la instancia
Ejecuta el trabajo de Scheduler 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 terminar de apagarse.gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: TERMINATED
Inicia la instancia
Ejecuta el trabajo de Scheduler 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 terminar de iniciarse.gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: RUNNING
Limpia
Una vez que completes el instructivo, puedes limpiar los recursos que creaste para que dejen de usar la cuota y generar cargos. En las siguientes secciones, se describe cómo borrar o desactivar estos recursos.
Borra los trabajos de Cloud Scheduler
Ve a la página de Cloud Scheduler en la consola de Google Cloud.
Haz clic en las casillas de verificación junto a tus trabajos.
Haz clic en el botón Borrar en la parte superior de la página y confirma la eliminación.
Eliminar los temas de /Sub
Ve a la página de Pub/Sub en la consola de Google Cloud.
Haz clic en las casillas de verificación junto a tus temas.
Haz clic en Borrar en la parte superior de la página y confirma la eliminación.
Borra las funciones implementadas a través de Cloud Functions
Ve a la página de Cloud Functions en la consola de Google Cloud.
Haz clic en las casillas de verificación junto a tus funciones.
Haz clic en el botón Borrar en la parte superior de la página y confirma la eliminación.
Borra la instancia de Compute Engine
Para borrar una instancia de Compute Engine:
- En la consola de Google Cloud, ve a la página Instancias de VM.
-
Selecciona tu instancia
en la casilla de verificación de es la instancia que deseas borrar.
- Para borrar la instancia, haz clic en Más acciones, haz clic en Borrar y, luego, sigue las instrucciones.
Borra el proyecto
La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.
Para borrar el proyecto, haz lo siguiente:
- En la consola de Google Cloud, ve a la página Administrar recursos.
- En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
- En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.
¿Qué sigue?
- Explora arquitecturas de referencia, diagramas y prácticas recomendadas sobre Google Cloud. Consulta nuestro Cloud Architecture Center.