Programa copias de seguridad de bases de datos de Cloud SQL

Programa copias de seguridad de bases de datos de Cloud SQL

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:

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

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. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener 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 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

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

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

    Ir a las API

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.

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

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

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

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

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

  1. Ve al repositorio que clonaste:

    cd training-data-analyst/CPB100/lab3a/cloudsql
    
  2. Sube los archivos del directorio a tu bucket nuevo:

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

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

  1. 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
    
  2. Para crear un archivo requirements.txt, pega 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
    

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.

  1. Crea una instancia de App Engine para el trabajo de Cloud Scheduler:

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

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

  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 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?