Programar copias de seguridad de bases de datos de Cloud SQL

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:

Flujo de trabajo de Cloud Scheduler a Pub/Sub, que activa una función de Cloud Run que inicia la copia de seguridad.

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.

Los usuarios nuevos Google Cloud pueden disfrutar de una prueba gratuita.

  • 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

  1. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Verify that billing is enabled for your Google Cloud project.

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

    Ir a APIs

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.

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

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

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

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

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

  1. Ve al repositorio que has clonado:

    cd training-data-analyst/CPB100/lab3a/cloudsql
    
  2. Sube los archivos del directorio al nuevo segmento:

    gcloud storage cp * gs://${BUCKET_NAME}
    
  3. 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}
    
  4. 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.

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

  1. 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
    
  2. Crea un archivo requirements.txt pegando lo siguiente en Cloud Shell:

    cat <<EOF > requirements.txt
    google-api-python-client
    Oauth2client
    EOF
    
  3. 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.

  1. Crea una instancia de App Engine para la tarea de Cloud Scheduler:

    gcloud app create --region=${REGION}
    
  2. 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.

  1. Ejecuta manualmente el trabajo de Cloud Scheduler para activar un volcado de PostgreSQL de tu base de datos.

    gcloud scheduler jobs run ${SCHEDULER_JOB}
    
  2. 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.

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. 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