Cargando...

Respaldar base de datos MySQL en Amazon S3

Las copias de seguridad son un componente básico en un plan de continuidad de negocio. Las bases de datos son recursos críticos en cualquier empresa, por lo que se deben hacer respaldos periódicos para proteger los datos y minimizar el riesgo de perdida de datos. Como buena práctica, al menos una copia se debe estar trasladando a otra ubicación, y es ahí donde entra en juego la nube con los servicios de almacenamiento elástico a bajo costo como Amazon S3 en el caso de AWS.

Lo que aprenderás

  • Crear una política basada en identidad en AWS
  • Crear un usuario IAM con privilegios mínimos
  • Respaldar base de datos MySQL desde la consola
  • Cargar archivos a Amazon S3 con la CLI de AWS
  • Crear un Script para respaldar bases de datos en Amazon S3

Requisitos previos

  • Tener un Bucket en Amazon S3
  • Instalar y configurar la CLI de AWS
  • Un usuario de IAM con acceso programático

Crear política administrada por el cliente en AWS

Primero lo primero, hay que definir los permisos que tendrá el usuario IAM sobre el Bucket. Siguiendo uno de los principios de seguridad en AWS, siempre asignar el privilegio mínimo, voy a crear una política una política basada en identidad con permisos para hacer operaciones put, es decir, que solo pueda cargar objetos y, además, únicamente lo podrá hacer en un Bucket, en este caso es bucket-crashell-db.

Buscamos IAM en la consola de AWS, en administración del acceso vamos a políticas y crear política

Crear política administrada por el cliente en AWS

Para editar la política puedes usar el Editor visual más interactivo, o bien, utilizar JSON. En este caso, te comparto el código en JSON.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::bucket-crashell-db/*"
        }
    ]
}

Política en el editor con JSON

Seguidamente, revisamos la plantilla y le asignamos un nombre a la política.

Para limitar aún más el acceso, hay otras configuraciones disponibles. Se puede aplicar una condición a la política para requerir MFA o permitir el acceso solo cuando la solicitud proviene de un rango de direcciones IP específico.

Una vez creada la política, ya podemos asociarla a un usuario IAM.

Crear un usuario IAM con acceso programático

Siempre en administración de acceso, vamos a usuarios y agregar usuarios.

Agregar usuario IAM

Escribimos el nombre y dejamos sin marcar la casilla habilitar el acceso a la consola. Esto es para que el usuario sea únicamente programático, sin acceso desde la consola web.

Especificar detalles del usuario IAM

Lo siguiente es establecer los permisos. Elegimos adjuntar políticas directamente y ubicamos la política creada previamente, s3PutObject.

Establecer permisos - adjuntar política al usuario IAM

Posteriormente solo se revisan las opciones seleccionadas y crear usuario.

Revisar y crear usuario

Una vez creado el usuario, puedes ver y descargar las credenciales para proceder con la configuración del perfil en la CLI de AWS.

Respaldar base de datos MySQL desde la consola

MySQL proporciona la herramienta mysqldump para realizar backup de base de datos. mysqldump realiza copias de seguridad lógicas, produciendo un conjunto de instrucciones SQL, la cuales pueden ser ejecutadas para replicar las definiciones de objetos de bases de datos originales y los datos de las tablas.

Ejemplo:

mysqldump --add-drop-database --opt --force crashell_db > backup.sql

Hay muchas opciones disponibles, puedes consultar la documentación oficial, opciones de mysqldump. También, siempre puedes consultar la ayuda desde la línea de comandos, ejecutando la siguiente instrucción: mysqldump –help.

Copiar un archivo local a S3 desde la CLI

El comando cp sirve para copiar un archivo local o un objeto S3 a otra ubicación localmente o en S3. Significa que para subir un archivo a S3 es el comando indicado.

Ejemplo:

aws s3 cp archivo.sql s3://mybuckets3/archivo.sql

Para definir la clase de almacenamiento se utiliza el parámetro --storage-class. De forma predeterminada, si no se especifica, el archivo se cargará a S3 Standard. En el siguiente ejemplo se cargará un archivo a la clase de almacenamiento estandard de acceso poco frecuente, que es ideal para copias de seguridad.

aws s3 cp archivo.sql s3://mybuckets3/archivo.sql --profile s3-user --storage-class STANDARD_IA

Puedes consultar la documentación completa de aws s3 cp.

Crear Script para respaldar base de datos en S3

En el ejemplo tengo una base de datos con nombre crashell_db, el usuario es crashell_user y la contraseña Crashell_Pass. Mi Bucket en en Amazon S3 bucket-crashell-db y el nombre del perfil configurado para la CLI de AWS es user-s3. A continuación, comparto el Script completo. Incluye algunos comentarios para describir un poco lo que hacen las instrucciones. Reemplaza los datos necesarios, lo puedes modificar y adaptarlo a tu ambiente.

#!/bin/bash

# Datos de acceso a MySQL
UserDB="crashell_user"
PassDB="CrashellPass"
DB="crashell_db"

# Ubicación para guardar respaldos localmente
LocalPath="/Backup/DB"

# Datos de Amazon S3
perfil="user-s3" 
URI="s3://bucket-crashell-db/DB/" 

# Verificar si el directorio local existe, si no existe se crea
if [[ ! -d "$LocalPath" ]]; then
        mkdir -p $LocalPath
fi

# Obtener fecha y hora para nombrar de los archivos de respaldo
Date=$(date +"%d-%m-%Y_%H-%M-%S")

# Realizar respaldo de la base de datos y comprimir el archivo
mysqldump -u $UserDB --add-drop-database --opt --force $DB | gzip -c > $LocalPath/$Date.sql.gz

# Cargar el archivo de respaldo al Bucket en S3
aws s3 cp $LocalPath/$Date.sql.gz $URI --profile $perfil --storage-class STANDARD_IA

# Conservar 2 respaldos localmente, eliminar los más antiguos
MaxBackup="2"
TotalBackup=$(ls $LocalPath | wc -l)
if [[ $TotalBackup -gt $MaxBackup ]]; then
    Dif=$(($TotalBackup - $MaxBackup))
    Old=$(ls -tr $LocalPath | head -n$Dif)
    for i in $Old; do
        rm -f $LocalPath/$i
    done
fi

Programar tarea en Crontab Linux

Ya está el Script funcionando, lo siguiente es automatizar la ejecución. Para ello, puedes programar una tarea en Crontab.

En primer lugar, es preciso acceder al fichero de Crontab ejecutando lo siguiente:

crontab -e

Posteriormente agregamos la tarea al fichero. En este caso, quiero que se ejecute todos los días a las 23:00 (11 de la noche).

0 23 * * * /Scripts/backup_db.sh


  • John Doe
    43 Sales$156,24 Totals
    62%
  • Rosy O'Dowell
    12 Leads$56,24 Totals
    32%

With supporting text below as a natural lead-in to additional content.

Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled.