Programa el inicio o la detención de una instancia de Cloud SQL

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:

  1. Crea una instancia de Cloud SQL para SQL Server y asígnale una etiqueta de recurso específica (env=dev).
  2. Crea dos temas de Pub/Sub para que actúen como fuentes de eventos para tus activadores de Eventarc y como agentes de mensajes.
  3. 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).
  4. 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.
  5. 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:

Cómo iniciar y detener instancias de Cloud SQL según una programación
Cómo iniciar y detener instancias de Cloud SQL según una programación (haz clic en el diagrama para ampliarlo).

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.

Es posible que los usuarios de Google Cloud nuevos cumplan con los requisitos para acceder a una prueba gratuita.

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.

  1. 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.
  2. Instala Google Cloud CLI.

  3. Si usas un proveedor de identidad externo (IdP), primero debes acceder a la gcloud CLI con tu identidad federada.

  4. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  5. 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 permiso resourcemanager.projects.create. Obtén más información para otorgar roles.
    • Crea un proyecto de Google Cloud :

      gcloud projects create PROJECT_ID

      Reemplaza PROJECT_ID por 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_ID por el nombre de tu proyecto de Google Cloud .

  6. 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.

  7. Verifica que la facturación esté habilitada para tu proyecto de Google Cloud .

  8. 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
  9. Configura la autenticación:

    1. 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.
    2. Crea la cuenta de servicio:

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      Reemplaza SERVICE_ACCOUNT_NAME por un nombre para la cuenta de servicio.

    3. 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 servicio
      • PROJECT_ID: el ID del proyecto en el que creaste la cuenta de servicio
      • ROLE: el rol a otorgar
  10. Instala Google Cloud CLI.

  11. Si usas un proveedor de identidad externo (IdP), primero debes acceder a la gcloud CLI con tu identidad federada.

  12. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  13. 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 permiso resourcemanager.projects.create. Obtén más información para otorgar roles.
    • Crea un proyecto de Google Cloud :

      gcloud projects create PROJECT_ID

      Reemplaza PROJECT_ID por 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_ID por el nombre de tu proyecto de Google Cloud .

  14. 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.

  15. Verifica que la facturación esté habilitada para tu proyecto de Google Cloud .

  16. 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
  17. Configura la autenticación:

    1. 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.
    2. Crea la cuenta de servicio:

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      Reemplaza SERVICE_ACCOUNT_NAME por un nombre para la cuenta de servicio.

    3. 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 servicio
      • PROJECT_ID: el ID del proyecto en el que creaste la cuenta de servicio
      • ROLE: el rol a otorgar

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 activationPolicy de la instancia a ALWAYS, lo que enciende la instancia.
  • La función de detención actualiza activationPolicy a NEVER, 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.

  1. 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.

  2. 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.

  1. 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
  2. Si se te solicita que crees un repositorio en la región especificada, escribe y.

  3. En el mensaje Allow unauthenticated invocations, escribe n.

  4. 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
  5. Si se te solicita que crees un repositorio en la región especificada, escribe y.

  6. En el mensaje Allow unauthenticated invocations, escribe n.

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.

  1. 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
  2. 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.

  1. Para detener instancias con la etiqueta env=dev, usa el comando gcloud pubsub topics publish para publicar un mensaje en el tema de detención:

    gcloud pubsub topics publish stop-instance-event --message='{"label":"env=dev"}'
  2. 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.

  3. 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"}'
  4. 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.

  1. 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
  2. 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.

  1. 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"
  2. Verifica que la política de activación de dev-instance sea NEVER:

    gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"
  3. Ejecuta el trabajo para iniciar la instancia:

    gcloud scheduler jobs run startup-dev-instances --location="us-east1"
  4. Verifica que la política de activación de dev-instance sea ALWAYS:

    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.

  1. 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
  2. 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
  3. Borra los servicios de Cloud Run:
    gcloud run services delete startinstance --region=us-west1 --quiet
    gcloud run services delete stopinstance --region=us-west1 --quiet
  4. Elimina los temas de Pub/Sub:
    gcloud pubsub topics delete start-instance-event
    gcloud pubsub topics delete stop-instance-event
  5. Borra la instancia de Cloud SQL:
    gcloud sql instances delete dev-instance --quiet
  6. 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.