Puedes usar Cloud Scheduler para iniciar y detener instancias de Cloud SQL con regularidad. Por ejemplo, es posible que desees que tus instancias se ejecuten solo durante ciertas horas.
En este instructivo, se muestra cómo iniciar y detener automáticamente una instancia de Cloud SQL para SQL Server creando una arquitectura basada en eventos con productos de Google Cloud .
Objetivos
En este instructivo, crearás trabajos de Cloud Scheduler que programen instancias de Cloud SQL con una etiqueta de recursos env=dev para que se ejecuten durante horas específicas. Solo programarás una instancia. Sin embargo, la arquitectura que se describe en este instructivo se puede usar para detener y, también, iniciar varias instancias en las que la etiqueta de recurso es env=dev.
Para lograr este objetivo, completa los siguientes pasos:
- Crea una instancia de Cloud SQL para SQL Server y asígnale una etiqueta de recurso específica (
env=dev). - Crea dos temas de Pub/Sub para que actúen como fuentes de eventos para tus activadores de Eventarc y como agentes de mensajes.
- Crea e implementa dos funciones de Cloud Run controladas por eventos que se activen a través de los temas de Pub/Sub. Cuando se activan, las funciones buscan instancias de Cloud SQL en tu proyecto que coincidan con la etiqueta proporcionada en la carga útil del mensaje de Pub/Sub (
env=dev). - Crea e implementa dos activadores de Eventarc. Los eventos de temas de Pub/Sub se enrutan a tus funciones como solicitudes HTTP, y el contenido del mensaje del evento se pasa como datos de entrada a las funciones.
- Crea dos trabajos cron de Cloud Scheduler para publicar un mensaje que contenga la etiqueta de destino en los temas de Pub/Sub en momentos específicos. Programa las instancias para que se inicien a las 9:00 a.m. y se detengan a las 5:00 p.m., de lunes a viernes.
En el siguiente diagrama, se proporciona una descripción general de la arquitectura basada en eventos:
Costos
En este documento, usarás los siguientes componentes facturables de Google Cloud:
-
Cloud Run functions
Cloud Run functions operate as Cloud Run services and are billed accordingly.
- Cloud Scheduler
- Cloud SQL for SQL Server
-
Eventarc
Cloud Run uses Eventarc for event delivery. Pricing for Eventarc is not included in the Cloud Run pricing.
- Pub/Sub
Para generar una estimación de costos en función del uso previsto,
usa la calculadora de precios.
Cuando completes las tareas que se describen en este documento, podrás borrar los recursos que creaste para evitar que se te siga facturando. Para obtener más información, consulta Realiza una limpieza.
Antes de comenzar
Es posible que las restricciones de seguridad que define tu organización no te permitan completar los siguientes pasos. Para obtener información sobre la solución de problemas, consulta Desarrolla aplicaciones en un entorno de Google Cloud restringido.
- Accede a tu cuenta de Google Cloud . Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
-
Instala Google Cloud CLI.
-
Si usas un proveedor de identidad externo (IdP), primero debes acceder a la gcloud CLI con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente comando:
gcloud init -
Crea o selecciona un Google Cloud proyecto.
Roles necesarios para seleccionar o crear un proyecto
- Selecciona un proyecto: Para seleccionar un proyecto, no se requiere un rol de IAM específico. Puedes seleccionar cualquier proyecto en el que se te haya otorgado un rol.
-
Crear un proyecto: Para crear un proyecto, necesitas el rol de Creador de proyectos (
roles/resourcemanager.projectCreator), que contiene el permisoresourcemanager.projects.create. Obtén más información para otorgar roles.
-
Crea un proyecto de Google Cloud :
gcloud projects create PROJECT_ID
Reemplaza
PROJECT_IDpor un nombre para el proyecto Google Cloud que estás creando. -
Selecciona el proyecto Google Cloud que creaste:
gcloud config set project PROJECT_ID
Reemplaza
PROJECT_IDpor el nombre de tu proyecto de Google Cloud .
-
Si usas un proyecto existente en esta guía, verifica que tengas los permisos necesarios para completarla. Si creaste un proyecto nuevo, ya tienes los permisos necesarios.
-
Verifica que la facturación esté habilitada para tu proyecto de Google Cloud .
Habilita las APIs de Cloud Build, Cloud Functions, Cloud Pub/Sub, Cloud Run Admin, Cloud Scheduler, Cloud SQL Admin y Eventarc:
Roles necesarios para habilitar las APIs
Para habilitar APIs, necesitas el permiso
serviceusage.services.enable. Si creaste el proyecto, es probable que ya tengas este permiso a través del rol de propietario (roles/owner). De lo contrario, puedes obtener este permiso a través del rol de administrador de Service Usage (roles/serviceusage.serviceUsageAdmin). Obtén más información para otorgar roles.gcloud services enable cloudbuild.googleapis.com
cloudfunctions.googleapis.com pubsub.googleapis.com run.googleapis.com cloudscheduler.googleapis.com sqladmin.googleapis.com eventarc.googleapis.com -
Configura la autenticación:
-
Asegúrate de tener el rol de IAM de creador de cuentas de servicio (
roles/iam.serviceAccountCreator) y el rol de administrador de IAM del proyecto (roles/resourcemanager.projectIamAdmin). Obtén más información para otorgar roles. -
Crea la cuenta de servicio:
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
Reemplaza
SERVICE_ACCOUNT_NAMEpor un nombre para la cuenta de servicio. -
Otorga roles a la cuenta de servicio. Ejecuta el siguiente comando una vez para cada uno de los siguientes roles de IAM:
roles/cloudbuild.builds.builder, roles/cloudsql.editor, roles/run.invoker:gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" --role=ROLE
Reemplaza lo siguiente:
SERVICE_ACCOUNT_NAME: el nombre de la cuenta de servicioPROJECT_ID: el ID del proyecto en el que creaste la cuenta de servicioROLE: el rol a otorgar
-
Asegúrate de tener el rol de IAM de creador de cuentas de servicio (
-
Instala Google Cloud CLI.
-
Si usas un proveedor de identidad externo (IdP), primero debes acceder a la gcloud CLI con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente comando:
gcloud init -
Crea o selecciona un Google Cloud proyecto.
Roles necesarios para seleccionar o crear un proyecto
- Selecciona un proyecto: Para seleccionar un proyecto, no se requiere un rol de IAM específico. Puedes seleccionar cualquier proyecto en el que se te haya otorgado un rol.
-
Crear un proyecto: Para crear un proyecto, necesitas el rol de Creador de proyectos (
roles/resourcemanager.projectCreator), que contiene el permisoresourcemanager.projects.create. Obtén más información para otorgar roles.
-
Crea un proyecto de Google Cloud :
gcloud projects create PROJECT_ID
Reemplaza
PROJECT_IDpor un nombre para el proyecto Google Cloud que estás creando. -
Selecciona el proyecto Google Cloud que creaste:
gcloud config set project PROJECT_ID
Reemplaza
PROJECT_IDpor el nombre de tu proyecto de Google Cloud .
-
Si usas un proyecto existente en esta guía, verifica que tengas los permisos necesarios para completarla. Si creaste un proyecto nuevo, ya tienes los permisos necesarios.
-
Verifica que la facturación esté habilitada para tu proyecto de Google Cloud .
Habilita las APIs de Cloud Build, Cloud Functions, Cloud Pub/Sub, Cloud Run Admin, Cloud Scheduler, Cloud SQL Admin y Eventarc:
Roles necesarios para habilitar las APIs
Para habilitar APIs, necesitas el permiso
serviceusage.services.enable. Si creaste el proyecto, es probable que ya tengas este permiso a través del rol de propietario (roles/owner). De lo contrario, puedes obtener este permiso a través del rol de administrador de Service Usage (roles/serviceusage.serviceUsageAdmin). Obtén más información para otorgar roles.gcloud services enable cloudbuild.googleapis.com
cloudfunctions.googleapis.com pubsub.googleapis.com run.googleapis.com cloudscheduler.googleapis.com sqladmin.googleapis.com eventarc.googleapis.com -
Configura la autenticación:
-
Asegúrate de tener el rol de IAM de creador de cuentas de servicio (
roles/iam.serviceAccountCreator) y el rol de administrador de IAM del proyecto (roles/resourcemanager.projectIamAdmin). Obtén más información para otorgar roles. -
Crea la cuenta de servicio:
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
Reemplaza
SERVICE_ACCOUNT_NAMEpor un nombre para la cuenta de servicio. -
Otorga roles a la cuenta de servicio. Ejecuta el siguiente comando una vez para cada uno de los siguientes roles de IAM:
roles/cloudbuild.builds.builder, roles/cloudsql.editor, roles/run.invoker:gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" --role=ROLE
Reemplaza lo siguiente:
SERVICE_ACCOUNT_NAME: el nombre de la cuenta de servicioPROJECT_ID: el ID del proyecto en el que creaste la cuenta de servicioROLE: el rol a otorgar
-
Asegúrate de tener el rol de IAM de creador de cuentas de servicio (
Cree una instancia de Cloud SQL
Para crear una instancia de Cloud SQL para SQL Server con la etiqueta de recurso env=dev, usa el comando gcloud beta sql instances create:
gcloud beta sql instances create dev-instance \ --database-version=SQLSERVER_2019_EXPRESS \ --region=us-west1 \ --tier=db-custom-2-3840 \ --root-password=YourStrongPassword123! \ --labels=env=dev
La creación de la instancia puede tardar algunos minutos. Para obtener más información, consulta cómo Crear instancias.
Crea temas de Pub/Sub
Para crear los dos temas de Pub/Sub que actúan como fuentes de eventos para tus activadores de Eventarc, usa el comando gcloud pubsub topics create:
gcloud pubsub topics create start-instance-event gcloud pubsub topics create stop-instance-event
Para obtener más información, consulta Crea un tema.
Crea e implementa funciones de Cloud Run
Crea e implementa dos funciones de Cloud Run (Node.js) activadas por Eventarc a través de temas de Pub/Sub. Cuando se activan, las funciones buscan instancias de Cloud SQL en tu proyecto que coincidan con la etiqueta proporcionada en la carga útil del mensaje de Pub/Sub (env=dev):
- La función de inicio actualiza el
activationPolicyde la instancia aALWAYS, lo que enciende la instancia. - La función de detención actualiza
activationPolicyaNEVER, lo que apaga la instancia.
Para obtener más información, consulta Escribe funciones de Cloud Run y Activadores de Cloud Run Functions.
Crea las funciones
Crea Cloud Run Functions controladas por eventos que deserialicen automáticamente los eventos que cumplen con la especificación de CloudEvents. Esta especificación estándar de la industria describe los datos de eventos de una manera común.
El código fuente debe definir un punto de entrada de la función, que es el código que se ejecuta cuando Cloud Run invoca la función. Especificas este punto de entrada cuando implementas la función.
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/
Implementa las funciones controladas por eventos
Para implementar las funciones en Cloud Run, usa el comando gcloud run deploy.
Implementa la función que inicia la instancia de Cloud SQL:
gcloud run deploy startinstance \ --source . \ --function startInstanceEvent \ --base-image nodejs24 \ --region=us-west1 \ --build-service-account=projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
Si se te solicita que crees un repositorio en la región especificada, escribe
y.En el mensaje
Allow unauthenticated invocations, escriben.Implementa la función que cierra la instancia de Cloud SQL:
gcloud run deploy stopinstance \ --source . \ --function stopInstanceEvent \ --base-image nodejs24 \ --region=us-west1 \ --build-service-account=projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
Si se te solicita que crees un repositorio en la región especificada, escribe
y.En el mensaje
Allow unauthenticated invocations, escriben.
Cuando se complete la implementación, Google Cloud CLI mostrará una URL en la que se ejecuta el servicio.
Crea activadores de Eventarc.
Para crear activadores de Eventarc que enruten eventos de Pub/Sub, usa el comando gcloud eventarc triggers create. Cada mensaje publicado en el tema de Pub/Sub activa la función correspondiente y el contenido del mensaje se pasa como datos de entrada.
Crea un activador que inicie la instancia de Cloud SQL:
gcloud eventarc triggers create start-instance-trigger \ --location=us-west1 \ --destination-run-service=startinstance \ --destination-run-region=us-west1 \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --transport-topic=start-instance-event \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
Crea un activador que detenga la instancia de Cloud SQL:
gcloud eventarc triggers create stop-instance-trigger \ --location=us-west1 \ --destination-run-service=stopinstance \ --destination-run-region=us-west1 \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --transport-topic=stop-instance-event \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
Un activador nuevo puede tardar hasta 2 minutos en activarse.
Opcional: Verifica que las funciones actúen correctamente
Puedes verificar que tus funciones funcionen publicando mensajes directamente en los temas de Pub/Sub. La actualización de la instancia de Cloud SQL puede tardar unos minutos.
Para detener instancias con la etiqueta
env=dev, usa el comandogcloud pubsub topics publishpara publicar un mensaje en el tema de detención:gcloud pubsub topics publish stop-instance-event --message='{"label":"env=dev"}'
Para confirmar que la instancia se detuvo, verifica su política de activación con el comando
gcloud sql instances describe:gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"
El resultado debería ser
NEVER.Para iniciar instancias con la etiqueta
env=dev, publica un mensaje en el tema de inicio:gcloud pubsub topics publish start-instance-event --message='{"label":"env=dev"}'
Para confirmar que la instancia se inició, verifica su política de activación:
gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"
El resultado debería ser
ALWAYS.
Crea los trabajos de Cloud Scheduler
Crea trabajos de Cloud Scheduler que publiquen mensajes en los temas de Pub/Sub según un programa regular.
Para crear un trabajo que se ejecute a las 9 a.m., de lunes a viernes, y que inicie las instancias, usa el comando
gcloud scheduler jobs create:gcloud scheduler jobs create pubsub startup-dev-instances \ --schedule '0 9 * * 1-5' \ --topic start-instance-event \ --message-body '{"label":"env=dev"}' \ --time-zone 'America/Los_Angeles' \ --location us-east1
Crea un trabajo que se ejecute a las 5:00 p.m., de lunes a viernes, y que detenga las instancias:
gcloud scheduler jobs create pubsub shutdown-dev-instances \ --schedule '0 17 * * 1-5' \ --topic stop-instance-event \ --message-body '{"label":"env=dev"}' \ --time-zone 'America/Los_Angeles' \ --location us-east1
Debido a la configuración inicial, el primer trabajo creado en un proyecto puede tardar unos minutos en ejecutarse.
Opcional: Verifica que los trabajos funcionen
Puedes ejecutar manualmente tus trabajos de Cloud Scheduler para verificar que activen correctamente las funciones de inicio y detención. La actualización de la instancia de Cloud SQL puede tardar unos minutos.
Para ejecutar el trabajo y detener la instancia de Cloud SQL, usa el comando
gcloud scheduler jobs run:gcloud scheduler jobs run shutdown-dev-instances --location="us-east1"
Verifica que la política de activación de
dev-instanceseaNEVER:gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"
Ejecuta el trabajo para iniciar la instancia:
gcloud scheduler jobs run startup-dev-instances --location="us-east1"
Verifica que la política de activación de
dev-instanceseaALWAYS:gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"
Realiza una limpieza
Para evitar que se generen cargos por los recursos que se usaron en este instructivo, bórralos.
- Borra los trabajos de Cloud Scheduler:
gcloud scheduler jobs delete startup-dev-instances --location=us-east1 --quiet gcloud scheduler jobs delete shutdown-dev-instances --location=us-east1 --quiet
- Borra los activadores de Eventarc:
gcloud eventarc triggers delete start-instance-trigger --location=us-west1 --quiet gcloud eventarc triggers delete stop-instance-trigger --location=us-west1 --quiet
- Borra los servicios de Cloud Run:
gcloud run services delete startinstance --region=us-west1 --quiet gcloud run services delete stopinstance --region=us-west1 --quiet
- Elimina los temas de Pub/Sub:
gcloud pubsub topics delete start-instance-event gcloud pubsub topics delete stop-instance-event
- Borra la instancia de Cloud SQL:
gcloud sql instances delete dev-instance --quiet
- Como alternativa, puedes borrar tu proyecto Google Cloud para evitar que se generen cargos. Si borras tu proyecto Google Cloud , se dejan de facturar todos los recursos que usaste en ese proyecto.
Borra un Google Cloud proyecto:
gcloud projects delete PROJECT_ID
¿Qué sigue?
- Explora arquitecturas de referencia, diagramas y prácticas recomendadas sobre Google Cloud. Consulta nuestro Cloud Architecture Center.