En este tutorial 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 tutorial te llevará unos 30 minutos.
Primero, configura el entorno clonando un repositorio de Git que contenga bases de datos de prueba y almacenando esas bases de datos en un segmento de Cloud Storage.
A continuación, crea una instancia de base de datos de Cloud SQL para PostgreSQL e importa las bases de datos de prueba del bucket de Cloud Storage a la instancia.
Una vez configurado el entorno, crea una tarea de Cloud Scheduler que publique un mensaje de activador de copia de seguridad en un tema de Pub/Sub en una fecha y hora programadas. 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 Admin de Cloud SQL para iniciar una copia de seguridad de la base de datos en Cloud SQL. En el siguiente diagrama se ilustra este flujo de trabajo:
Google Cloud componentes
En este documento, se utilizan los siguientes componentes facturables de Google Cloud:
Para generar una estimación de costes basada en el uso previsto,
utiliza 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 va a crear una copia de seguridad.
- Cloud Scheduler: publica mensajes en un tema de Pub/Sub según una programación establecida.
- Pub/Sub: contiene los mensajes enviados desde Cloud Scheduler.
- Funciones de Cloud Run: se suscribe al tema de Pub/Sub y, cuando se activa, hace una llamada a la API a la instancia de Cloud SQL para iniciar la copia de seguridad.
Cuando termines las tareas que se describen en este documento, puedes evitar que se te siga facturando eliminando los recursos que has creado. Para obtener más información, consulta la sección Limpiar.
Antes de empezar
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
En la Google Cloud consola, ve a la página APIs y habilita las siguientes APIs:
- API Admin de Cloud SQL
- API de Cloud Run Functions
- API Scheduler de Cloud
- API de Cloud Build
- API Admin de App Engine
En el resto de este tutorial, ejecutarás todos los comandos desde Cloud Shell.
Configurar un entorno
Para empezar, clona el repositorio que contiene los datos de ejemplo. A continuación, configura tu entorno y crea roles personalizados que tengan los permisos necesarios para este tutorial.
Puedes hacer todo lo que se indica en este tutorial en Cloud Shell.
Clona el repositorio que contiene los datos de ejemplo:
git clone https://github.com/GoogleCloudPlatform/training-data-analyst.git
Utiliza 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}-PostgreSQL-$(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 roles personalizados que solo tengan los permisos necesarios para este tutorial:
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"
Estos roles reducen el ámbito de acceso de las funciones de Cloud Run y las cuentas de servicio de Cloud SQL, de acuerdo con el principio de mínimos accesos.
Crear una instancia de Cloud SQL
En esta sección, creará un bucket de Cloud Storage y una instancia de Cloud SQL para PostgreSQL. A continuación, sube la base de datos de prueba al segmento de Cloud Storage e impórtala desde ahí a la instancia de Cloud SQL.
Crea un segmento de Cloud Storage
Utiliza la CLI de gcloud para crear un segmento de Cloud Storage.
gcloud storage buckets create gs://${BUCKET_NAME} --location=${REGION}
Crear una instancia de Cloud SQL y conceder permisos a su cuenta de servicio
A continuación, crea una instancia de Cloud SQL y concede a su cuenta de servicio los permisos para crear ejecuciones de copia de seguridad.
Crea una instancia de Cloud SQL para PostgreSQL:
gcloud sql instances create ${SQL_INSTANCE} --database-version POSTGRES_13 --region ${REGION}
Esta operación tarda unos minutos en completarse.
Verifica que la instancia de Cloud SQL se esté ejecutando:
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 POSTGRES_13 us-west2-b db-n1-standard-1 x.x.x.x - RUNNABLE
Concede a tu cuenta de servicio de Cloud SQL los permisos para exportar datos a Cloud Storage con el rol Simple Storage:
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}
Rellenar la instancia de Cloud SQL con datos de ejemplo
Ahora puedes subir archivos a tu contenedor, así como crear y rellenar tu base de datos de ejemplo.
Ve al repositorio que has clonado:
cd training-data-analyst/CPB100/lab3a/cloudsql
Sube los archivos del directorio al nuevo segmento:
gcloud storage cp * gs://${BUCKET_NAME}
Crea una base de datos de muestra. Cuando se te pregunte si quieres continuar, escribe Y (Sí) para continuar.
gcloud sql import sql ${SQL_INSTANCE} gs://${BUCKET_NAME}/table_creation.sql --project ${PROJECT_ID}
Rellena la base de datos. Cuando se te pregunte si quieres continuar, escribe 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
Crear un tema, una función y una tarea de programador
En esta sección, creará una cuenta de servicio de IAM personalizada y la vinculará al rol de SQL personalizado que creó en Configurar el entorno. A continuación, crea un tema de Pub/Sub y una función de Cloud Run que se suscriba al tema y use la API Admin de Cloud SQL para iniciar una copia de seguridad. Por último, crea una tarea de Cloud Scheduler para publicar un mensaje en el tema de Pub/Sub periódicamente.
Crear 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 has creado en Configurar el entorno.
Crea una cuenta de servicio de IAM que usará la función de Cloud Run:
gcloud iam service-accounts create ${GCF_NAME} \ --display-name "Service Account for GCF and SQL Admin API"
Concede a la cuenta de servicio de la función de Cloud Run acceso al rol de SQL personalizado:
gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member="serviceAccount:${GCF_NAME}@${PROJECT_ID}.iam.gserviceaccount.com" \ --role="projects/${PROJECT_ID}/roles/${SQL_ROLE}"
Crear 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.
gcloud pubsub topics create ${PUBSUB_TOPIC}
Crear una función de Cloud Run
A continuación, crea la función de Cloud Run.
Crea un archivo
main.py
pegando 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
Crea un archivo
requirements.txt
pegando 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
Crear una tarea de Cloud Scheduler
Por último, creas una tarea de Cloud Scheduler para activar periódicamente la función de copia de seguridad de datos cada hora. Cloud Scheduler usa una instancia de App Engine para el despliegue.
Crea una instancia de App Engine para la tarea de Cloud Scheduler:
gcloud app create --region=${REGION}
Crea una tarea 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'
Probar la solución
El último paso es probar tu solución. Para empezar, ejecuta la tarea de Cloud Scheduler.
Ejecuta manualmente el trabajo de Cloud Scheduler para activar un volcado de PostgreSQL de tu base de datos.
gcloud scheduler jobs run ${SCHEDULER_JOB}
Enumera las operaciones realizadas en la instancia de PostgreSQL y comprueba que haya una operación de tipo
BACKUP_VOLUME
:gcloud sql operations list --instance ${SQL_INSTANCE} --limit 1
En la salida se muestra una tarea de copia de seguridad completada. 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
Limpieza
Para evitar que se apliquen cargos en tu Google Cloud cuenta por los recursos utilizados en este tutorial, sigue estos pasos. La forma más fácil de evitar que te cobren es eliminar el proyecto que has creado para el tutorial.
- 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 quieres eliminar todo el proyecto, elimina cada uno de los recursos que hayas creado. Para hacerlo, ve a las páginas correspondientes de la Google Cloud consola, selecciona el recurso y elimínalo.
Siguientes pasos
- Consulta cómo programar instancias de computación con Cloud Scheduler.
- Consulta más información sobre las copias de seguridad de Cloud SQL.
- Consulta arquitecturas de referencia, diagramas y prácticas recomendadas sobre Google Cloud. Consulta nuestro Centro de arquitectura de Cloud.