Al montar un entorno de producción lo primero que hago es preparar el sistema de copias de seguridad: creo una entrada en el cron que ejecuta un programa que vuelca la base de datos con una frecuencia mínima de una vez al día y que depende de la intensidad de uso del servidor.
Pero claro, esta copia de seguridad está en el mismo servidor, por lo que aunque resulta muy útil cuando se produce un error de tipo PICNIC no nos sirve de mucho si el problema es de hardware o perdemos el control del servidor. Necesitamos mantener una copia de esos ficheros en otra parte.
Para esto normalmente yo usaba rsync y copiaba los ficheros en algún otro servidor, pero decidí cambiar a S3 porque me fío más de sus servidores. Los pasos son estos:
- Crear un usuario en AWS que tendrá acceso solo a un bucket y crear en ese bucket una carpeta backup donde se guardarán las copias de seguridad.
- Instalar las utilidades de S3 AWS CLI y configurarlas con los datos de acceso de ese usuario de AWS.
- Meter en el cron una entrada que sincronice nuestra carpeta de copias de seguridad con S3.
El comando para hacer la sincronización es:
aws s3 sync /home/backupDB/ s3://NOMBRE_BUCKET/backup --delete
El –delete indica que si un fichero no está en la carpeta local debemos borrarla de S3. Esto, unido a otra entrada en el cron como esta:
find /home/backupDB/ -mtime +60 -exec rm {} \;
nos permite limitar las copias de seguridad a los últimos dos meses. Dependiendo de los requisitos de este proyecto variamos este valor.
Bueno, pues si uno ejecuta el comando de sincronización verá que funciona estupendamente, lo meterá en el cron y seguirá con su vida tan tranquilo confiando en que todo funcionará bien…
…aunque por si acaso se pondrá una nota para dos días después para revisar que los ficheros se están copiando en S3. Eso hice yo, ¡y menos mal!
Porque dos días después cuando entré en S3 a mirar el bucket vi que solo tenía los ficheros de cuando hice la sincronización a mano desde la línea de comandos. En la carpeta local estaban los ficheros, pero no se habían copiado a S3.
Ejecuté de nuevo desde línea de comandos el trabajo tal y como estaba en el cron y funcionó perfectamente. Revisé que el trabajo estaba bien definido y esperé al día siguiente: los ficheros seguían sin copiarse en S3. Ejecuté otra vez el comando: los ficheros se subieron a S3. En este momento yo ya estaba pegándole bocaos a la mesa.
Rebuscando por Internet encontré un mensaje en Stack Overflow (¿dónde si no?) que daba la solución: hay que poner la ruta completa al ejecutable de aws. La entrada en el cron quedaría entonces así:
0 */2 * * * /usr/local/bin/aws s3 sync /home/backupDB/ s3://NOMBRE_BUCKET/backup --delete
En este caso yo lo tengo configurado para que haga la sincronización cada dos horas. Con este cambio al día siguiente por fin respiré tranquilo al ver que ya aparecían los nuevos ficheros.