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
Requisitos previos
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
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/*"
}
]
}
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.
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.
Lo siguiente es establecer los permisos. Elegimos adjuntar políticas directamente y ubicamos la política creada previamente, s3PutObject.
Posteriormente solo se revisan las opciones seleccionadas 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
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.