En este instructivo, se muestra cómo usar Cloud Scheduler y funciones de Cloud Run para programar copias de seguridad manuales de una base de datos de Cloud SQL.
Este instructivo toma unos 30 minutos en completarse.
Primero, configura el entorno mediante la clonación de un repositorio de Git que contenga bases de datos de prueba y el almacenamiento de esas bases de datos en un bucket de Cloud Storage.
Luego, crea una instancia de base de datos de Cloud SQL para MySQL e importa las bases de datos de prueba del bucket de Cloud Storage a la instancia.
Después de configurar el entorno, debes crear un trabajo de Cloud Scheduler que publique un mensaje que active la copia de seguridad en una fecha y hora programadas en un tema de Pub/Sub. El mensaje contiene información sobre el nombre de la instancia de Cloud SQL y el ID del proyecto. El mensaje activa una función de Cloud Run. La función usa la API de Cloud SQL Admin para iniciar una copia de seguridad de una base de datos en Cloud SQL. En el siguiente diagrama, se ilustra este flujo de trabajo:
Componentes de Google Cloud
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.
- Cloud Storage: Almacena las bases de datos de prueba que importas en Cloud SQL.
- Instancia de Cloud SQL: Contiene la base de datos de la que se creará la copia de seguridad.
- Cloud Scheduler: Publica mensajes en un tema de Pub/Sub en un programa establecido.
- Pub/Sub: Contiene mensajes enviados desde Cloud Scheduler.
- Funciones de Cloud Run: Se suscribe al tema de Pub/Sub y, cuando se activa, realiza una llamada a la API a la instancia de Cloud SQL para iniciar la copia de seguridad.
Cuando finalices las tareas que se describen en este documento, puedes borrar los recursos que creaste para evitar que continúe la facturación. Para obtener más información, consulta Cómo realizar una limpieza.
Antes de comenzar
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
En la consola de Google Cloud, ve a la página API y habilita las siguientes API:
- API de Cloud SQL Admin
- API de funciones de Cloud Run
- API de Cloud Scheduler
- API de Cloud Build
- API de App Engine Admin
Durante el resto de este instructivo, ejecutarás todos los comandos desde Cloud Shell.
Configure su entorno
Para comenzar, primero clona el repositorio que contiene los datos de muestra. Luego, configura tu entorno y crea funciones personalizadas que tengan los permisos necesarios para este instructivo.
Puedes hacer todo lo que aparece en este instructivo en Cloud Shell.
Clona el repositorio que contiene los datos de muestra:
git clone https://github.com/GoogleCloudPlatform/training-data-analyst.git
Usa los datos del repositorio
training-data-analyst
para crear una base de datos con algunos registros ficticios.Configura las siguientes variables de entorno:
export PROJECT_ID=`gcloud config get-value project` export DEMO="sql-backup-tutorial" export BUCKET_NAME=${USER}-MySQL-$(date +%s) export SQL_INSTANCE="${DEMO}-sql" export GCF_NAME="${DEMO}-gcf" export PUBSUB_TOPIC="${DEMO}-topic" export SCHEDULER_JOB="${DEMO}-job" export SQL_ROLE="sqlBackupCreator" export STORAGE_ROLE="simpleStorageRole" export REGION="us-west2"
Crea dos funciones personalizadas que solo tengan los permisos necesarios para este instructivo:
gcloud iam roles create ${STORAGE_ROLE} --project ${PROJECT_ID} \ --title "Simple Storage role" \ --description "Grant permissions to view and create objects in Cloud Storage" \ --permissions "storage.objects.create,storage.objects.get"
gcloud iam roles create ${SQL_ROLE} --project ${PROJECT_ID} \ --title "SQL Backup role" \ --description "Grant permissions to backup data from a Cloud SQL instance" \ --permissions "cloudsql.backupRuns.create"
Estas funciones reducen el permiso de acceso de las cuentas de servicio de funciones de Cloud Run y Cloud SQL, según el principio de menor privilegio.
Cree una instancia de Cloud SQL
En esta sección, crearás un bucket de Cloud Storage y una instancia de Cloud SQL para MySQL. Luego, debes subir la base de datos de prueba al bucket de Cloud Storage e importarla desde allí a la instancia de Cloud SQL.
Cree un bucket de Cloud Storage
Usa gcloud CLI para crear un bucket de Cloud Storage.
```sh
gcloud storage buckets create gs://${BUCKET_NAME} --location=${REGION}
```
Crea una instancia de Cloud SQL y otórgale permisos a su cuenta de servicio
A continuación, debes crear una instancia de Cloud SQL y otorgarle a su cuenta de servicio los permisos para crear ejecuciones de copia de seguridad.
Crea una instancia de Cloud SQL para MySQL:
sh gcloud sql instances create ${SQL_INSTANCE} --database-version MYSQL_5_7 --region ${REGION}
Esta operación tardará unos minutos en completarse.
Verifica que la instancia de Cloud SQL esté en ejecución:
gcloud sql instances list --filter name=${SQL_INSTANCE}
El resultado es similar al siguiente:
NAME DATABASE_VERSION LOCATION TIER PRIMARY_ADDRESS PRIVATE_ADDRESS STATUS sql-backup-tutorial MYSQL_5_7 us-west2-b db-n1-standard-1 x.x.x.x - RUNNABLE
Otorga a tu cuenta de servicio de Cloud SQL los permisos para exportar datos a Cloud Storage con el rol de almacenamiento simple:
export SQL_SA=(`gcloud sql instances describe ${SQL_INSTANCE} \ --project ${PROJECT_ID} \ --format "value(serviceAccountEmailAddress)"`) gcloud storage buckets add-iam-policy-binding gs://${BUCKET_NAME} \ --member=serviceAccount:${SQL_SA} \ --role=projects/${PROJECT_ID}/roles/${STORAGE_ROLE}
Propaga la instancia de Cloud SQL con datos de muestra
Ahora puedes subir archivos a tu bucket y crear y propagar tu base de datos de muestra.
Ve al repositorio que clonaste:
cd training-data-analyst/CPB100/lab3a/cloudsql
Sube los archivos del directorio a tu bucket nuevo:
gcloud storage cp * gs://${BUCKET_NAME}
Crea una base de datos de muestra. Cuando aparezca el mensaje “¿Deseas continuar (Y/n)?”, ingresa Y (Sí) para continuar.
gcloud sql import sql ${SQL_INSTANCE} gs://${BUCKET_NAME}/table_creation.sql --project ${PROJECT_ID}
Propaga la base de datos. Cuando aparezca el mensaje “¿Deseas continuar (Y/n)?”, ingresa Y (Sí) para continuar.
gcloud sql import csv ${SQL_INSTANCE} gs://${BUCKET_NAME}/accommodation.csv \ --database recommendation_spark \ --table Accommodation
gcloud sql import csv ${SQL_INSTANCE} gs://${BUCKET_NAME}/rating.csv \ --database recommendation_spark \ --table Rating
Crea un tema, una función y un trabajo de programador
En esta sección, crearás una cuenta de servicio de IAM personalizada y la vincularás al rol de SQL personalizado que creaste en Configura tu entorno. Luego, debes crear un tema de Pub/Sub y una función de Cloud Run que se suscriba al tema y use la API de Cloud SQL Admin para iniciar una copia de seguridad. Por último, crea un trabajo de Cloud Scheduler que publique un mensaje en el tema de Pub/Sub de forma periódica.
Crea una cuenta de servicio para la función de Cloud Run
El primer paso es crear una cuenta de servicio personalizada y vincularla al rol de SQL personalizado que creaste en Configura tu entorno.
Crea una cuenta de servicio de IAM para que la use la función de Cloud Run:
gcloud iam service-accounts create ${GCF_NAME} \ --display-name "Service Account for GCF and SQL Admin API"
Otorga a la cuenta de servicio de la función de Cloud Run acceso a la función de SQL personalizada:
gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member="serviceAccount:${GCF_NAME}@${PROJECT_ID}.iam.gserviceaccount.com" \ --role="projects/${PROJECT_ID}/roles/${SQL_ROLE}"
Crea un tema de Pub/Sub
El siguiente paso es crear un tema de Pub/Sub que se use para activar la función de Cloud Run que interactúa con la base de datos de Cloud SQL.
```sh
gcloud pubsub topics create ${PUBSUB_TOPIC}
```
Crea una función de Cloud Run
A continuación, crea la función de Cloud Run.
Para crear un archivo
main.py
, pega lo siguiente en Cloud Shell:cat <<EOF > main.py import base64 import logging import json from datetime import datetime from httplib2 import Http from googleapiclient import discovery from googleapiclient.errors import HttpError from oauth2client.client import GoogleCredentials def main(event, context): pubsub_message = json.loads(base64.b64decode(event['data']).decode('utf-8')) credentials = GoogleCredentials.get_application_default() service = discovery.build('sqladmin', 'v1beta4', http=credentials.authorize(Http()), cache_discovery=False) try: request = service.backupRuns().insert( project=pubsub_message['project'], instance=pubsub_message['instance'] ) response = request.execute() except HttpError as err: logging.error("Could NOT run backup. Reason: {}".format(err)) else: logging.info("Backup task status: {}".format(response)) EOF
Para crear un archivo
requirements.txt
, pega lo siguiente en Cloud Shell:cat <<EOF > requirements.txt google-api-python-client Oauth2client EOF
Implementa el código:
gcloud functions deploy ${GCF_NAME} \ --trigger-topic ${PUBSUB_TOPIC} \ --runtime python37 \ --entry-point main \ --service-account ${GCF_NAME}@${PROJECT_ID}.iam.gserviceaccount.com
Crea un trabajo de Cloud Scheduler
Por último, crea un trabajo de Cloud Scheduler para activar de forma periódica la función de copia de seguridad de datos una vez por hora. Cloud Scheduler usa una instancia de App Engine para la implementación.
Crea una instancia de App Engine para el trabajo de Cloud Scheduler:
gcloud app create --region=${REGION}
Crea un trabajo de Cloud Scheduler:
gcloud scheduler jobs create pubsub ${SCHEDULER_JOB} \ --schedule "0 * * * *" \ --topic ${PUBSUB_TOPIC} \ --message-body '{"instance":'\"${SQL_INSTANCE}\"',"project":'\"${PROJECT_ID}\"'}' \ --time-zone 'America/Los_Angeles'
Prueba tu solución
El último paso es probar la solución. Para comenzar, ejecuta el trabajo de Cloud Scheduler.
Ejecuta el trabajo de Cloud Scheduler de forma manual para activar un volcado de MySQL de tu base de datos.
gcloud scheduler jobs run ${SCHEDULER_JOB}
Enumera las operaciones realizadas en la instancia de MySQL y verifica que haya una operación de tipo
BACKUP_VOLUME
:gcloud sql operations list --instance ${SQL_INSTANCE} --limit 1
El resultado muestra un trabajo de copia de seguridad completado. Por ejemplo:
NAME TYPE START END ERROR STATUS 8b031f0b-9d66-47fc-ba21-67dc20193749 BACKUP_VOLUME 2020-02-06T21:55:22.240+00:00 2020-02-06T21:55:32.614+00:00 - DONE
Limpia
Sigue estos pasos para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo. La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.
- 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.
Si no deseas borrar todo el proyecto, borra cada uno de los recursos que creaste. Para hacerlo, ve a las páginas correspondientes de la consola de Google Cloud, selecciona el recurso y bórralo.
¿Qué sigue?
- Aprende cómo programar instancias de procesamiento con Cloud Scheduler.
- Obtén más información sobre las copias de seguridad de Cloud SQL.
- Explora arquitecturas de referencia, diagramas y prácticas recomendadas sobre Google Cloud. Consulta nuestro Cloud Architecture Center.