Automatizar un backup de CRONTAB con S3 en Amazon Web Services

Es habitual la necesidad de crear tareas programadas que se ejecuten en momentos necesarios, y si estás utilizando un servidor con linux, lo más seguro es que hagas uso de los crontab.

El crontab de un usuario linux no es más que un fichero donde se almacena la configuración de los crones incluyendo la frecuencia de ejecución de la tarea así como el comando a realizar.

Una buena práctica, es mantener una copia de tu fichero pues es posible perder la información si no se tiene cuidado. Por ejemplo, para editar el fichero podemos usar «crontab -e» y se abrirá en modo edición. Pero para eliminarlo se usa «crontab -d» y si lo probáis os daréis cuenta que linux no pide confirmación, lo elimina sin más. La proximidad de las teclas «e» y «d» en el teclado invita a cometer errores si no se lleva cuidado.

En este post os contamos cómo podéis hacer copias de seguridad diarias de vuestro fichero crontab y almacenarlas en un bucket del servicio S3 que ofrece Amazon Web Services.

Instalar AWS CLI en nuestro servidor

Si no sabes si tienes instalado aws-cli en tu equipo, prueba a ejecutar lo siguiente:

$ aws

Si no está instalado te indicará el comando para instalarlo:

$ sudo apt install awscli

Una vez instalado haremos la configuración indicando qué usuario usaremos para conectar:

$ aws configure

En primer lugar indicaremos el access key id de nuestro usuario, a continuación el secret access key y por último la región. Una vez completado puedes verificar que funciona correctamente probando cualquier comando, por ejemplo, listar los buckets que tenemos:

$ aws s3 ls

Ahora que ya tenemos awscli configurado correctamente en nuestro servidor, solo nos queda automatizar un backup de crontab con s3 en Amazon Web Services

Script para automatizar un backup de crontab con S3

Crea un script en algún lado del servidor, para nuestro ejemplo hemos creado el fichero «backup_crontab.sh» que hemos dejado en la ruta /home/ubuntu/. El contenido del fichero es el siguiente:

#/bin/bash
echo "Copiando crontab a S3"
date=$(date +"%Y-%m-%d")
sudo -E aws s3 cp /var/spool/cron/crontabs/ubuntu s3://<mi-bucket>/backups/ubuntu__$date
echo "Proceso terminado"

En la primera línea siempre indicaremos el shebang con el intérprete de órdenes a usar, en este caso «bash».

Los comando echo sirven para mostrar por pantalla el mensaje contenido entre comillas. No sería realmente necesario indicarlo ya que esta tarea se ejecutará de forma automática y no veremos ese texto por consola pero nos vendrá bien cuando ejecutemos el fichero manualmente si tenemos necesidad.

En la tercera línea almacenaremos en una variable la fecha actual en formato YYYY-mm-dd. El objetivo es mantener un histórico de versiones del fichero crontab, almacenando una copia diaria.

En la cuarta línea utilizaremos el comando aws s3 para hacer una operación de copia (cp), indicando el origen (ubicado en /var/spool/cron/crontabs/ubuntu) y el destino el bucket donde almacenar el fichero. Como se observa, se ha agregado al final del fichero una coletilla con la fecha almacenada en la línea anterior.

En caso de tener más usuarios en el sistema operativo, dentro de /var/spool/cron/crontabs/ se encuentran todos los usuarios del sistema. La opción -E de sudo sirve para mantener las variables de entorno del usuario ubuntu, de lo contrario el comando de aws s3 cp devolverá error al no tener configurado el usuario. No obstante, siempre podéis repetir la operación aws configure con el usuario root y evitaros tener que agregar el parámetro -E.

Agregar tarea a crontab para ejecutarse diariamente

Para finalizar, solo nos queda agregar al crontab la ejecución diaria del script que acabamos de crear. Para ello en la consola haremos «crontab -e» y agregaremos al final del fichero lo siguiente:

@hourly sh /home/ubuntu/backup_crontab.sh

Crontab tiene algunas etiquetas ya generadas internamente como es «@hourly», que le indica al sistema operativo que esa tarea debe ejecutarse una vez al día. De esta forma no es necesario configurar toda la expresión propia del cron.

Ya lo hemos conseguido, a partir de ahora tendremos una copia de seguridad automatiza de nuestro crontab, este tipo de tareas nos permite evitar sustos en el futuro ante posibles errores accidentales. Si quieres conocer otros post con más servicios de Amazon Web Services, puedes consultar aquí.