Las instantáneas de la máquina son la copia "gorda": todo el disco, para cuando algo se rompe. Pero a veces quieres algo más fino y más barato: una copia diaria de una carpeta (las subidas de la web, los documentos, un volcado de la base de datos) en un sitio fuera de la máquina, del que puedas recuperar un solo fichero sin restaurar nada. Eso es S3, y la herramienta de línea de comandos de AWS trae un comando, aws s3 sync, que copia solo lo que ha cambiado. Programado cada noche, es la copia de ficheros más barata y fiable que puedes tener.
Antes de empezar: qué significa cada cosa
- S3 y bucket
- S3 es el almacén de ficheros de Amazon; un bucket es la "carpeta raíz" donde los guardas, con nombre único en el mundo.
- AWS CLI
- La herramienta de línea de comandos de AWS: un programa que se instala en la máquina y permite dar órdenes a AWS escribiendo comandos.
- sync (sincronizar)
- Comparar una carpeta con el bucket y copiar solo lo nuevo o cambiado. La primera vez copia todo; las siguientes, poco.
- Clave de acceso
- El usuario y contraseña para programas. Aquí la usará la máquina para hablar con S3; debe tener permiso solo para ese bucket.
- Cron
- El programador de tareas de Linux: ejecuta un comando a la hora que le digas, cada día.
- Control de versiones
- Opción de S3 que guarda las versiones anteriores de un fichero. Protege de que una copia nocturna sobrescriba algo bueno con algo roto.
Paso a paso
Crea el bucket
Consola de S3, Crear bucket, nombre único (
copias-miempresa-web), misma región que la máquina (así la transferencia entre ambos no gasta cuota ni se cobra), bloquear todo el acceso público activado, control de versiones activado y cifrado por defecto. Crea.Crea una clave que solo pueda escribir en ese bucket
En IAM, crea una política con este contenido (cambia el nombre del bucket) y un usuario
copias-webcon esa política y una clave de acceso, como explica la guía de usuario IAM con permisos mínimos:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": "arn:aws:s3:::copias-miempresa-web" }, { "Effect": "Allow", "Action": ["s3:PutObject", "s3:GetObject", "s3:DeleteObject"], "Resource": "arn:aws:s3:::copias-miempresa-web/*" } ] }Si esa clave se filtrara algún día, lo único que podría hacer alguien es tocar ese bucket. Nada más.
Instala la herramienta de AWS en la máquina
Por SSH, en Ubuntu o Debian:
sudo apt update && sudo apt install -y awscli(En Amazon Linux ya viene instalada.) Configúrala con la clave del paso anterior:
aws configureTe pide el identificador de la clave, el secreto, la región (
eu-west-1, por ejemplo) y el formato de salida (dejajson). Quedan guardados en la carpeta del usuario, solo legibles por él.Prueba el comando a mano
aws s3 sync /var/www/html/uploads s3://copias-miempresa-web/uploads --deleteLa primera vez tarda, porque sube todo; verás cada fichero pasar. Las siguientes solo suben lo que ha cambiado. La opción
--deleteborra en el bucket lo que ya no está en la carpeta, para que la copia sea un espejo; con el control de versiones activado, lo borrado sigue recuperable. Comprueba en la consola de S3 que los ficheros están ahí.Añade la base de datos si la tienes
Para que la copia tenga también la base de datos, vuélcala antes a un fichero en la misma carpeta que se sincroniza, por ejemplo con un pequeño script
/usr/local/bin/copia.sh:#!/bin/bash mysqldump -u usuario -pCONTRASEÑA nombre_bd | gzip > /var/copias/bd-$(date +%F).sql.gz find /var/copias -name "bd-*.sql.gz" -mtime +7 -delete aws s3 sync /var/copias s3://copias-miempresa-web/bd aws s3 sync /var/www/html/uploads s3://copias-miempresa-web/uploads --deleteDale permisos de ejecución (
chmod 700) y pruébalo consudo /usr/local/bin/copia.sh. La línea defindborra en la máquina los volcados de más de una semana; en S3 se quedan.Prográmalo cada noche
sudo crontab -eAñade al final una línea para las 3:30 de la madrugada (hora de la máquina, que suele ser UTC):
30 3 * * * /usr/local/bin/copia.sh >> /var/log/copia.log 2>&1Guarda. Al día siguiente mira
/var/log/copia.logy la fecha de los ficheros en S3. Pon además una regla de ciclo de vida en el bucket que borre las versiones antiguas pasados 30 o 90 días, para que no crezca sin fin (guía en esta sección).
Qué puede salir mal
"Access Denied" al sincronizar
La política no cubre lo que pides: comprueba que el nombre del bucket es exacto en las dos líneas de Resource, y que la primera (ListBucket) no lleva /* y la segunda sí.
La copia tarda horas
Primera ejecución con muchos ficheros pequeños: normal. Si cada noche tarda, hay ficheros que cambian siempre (cachés, registros): exclúyelos con --exclude "cache/*".
La contraseña de la base de datos está en el script
Mejor ponla en el fichero ~/.my.cnf del usuario root con permisos 600, y quita -pCONTRASEÑA del comando. Y que el script solo lo pueda leer root.
He borrado un fichero sin querer y la copia nocturna lo borró también
Para eso está el control de versiones: en la consola de S3, activa "Mostrar versiones" en la carpeta y recupera la versión anterior. Sin control de versiones, se habría perdido: por eso se activa en el paso 1.
En Simplio
En Simplio lanzas la copia nocturna a S3 desde el catálogo de scripts: eliges la carpeta de la máquina y el bucket, y Simplio crea la clave con permisos solo para ese bucket, instala lo necesario y programa la tarea, sin abrir una terminal. El bucket se ve en Simplio como una carpeta, con sus versiones, para recuperar un fichero con dos clics. Y si una noche la copia no aparece, te avisa por correo.
Lo mismo, en AWS y en Simplio
| En la consola de AWS | En Simplio | |
|---|---|---|
| Montar la copia nocturna | Bucket, política IAM, clave, instalar CLI, script, cron: 6 pasos y una terminal, 25 minutos | Script "Copia a S3" del catálogo: eliges la carpeta y el bucket, Simplio crea la clave limitada y programa la tarea |
| Saber si anoche se hizo | Mirar el log en la máquina | Aviso por correo si una copia programada no aparece |
| Recuperar un fichero | Consola de S3, buscar, versiones | Abrir el bucket en Simplio como una carpeta y descargar |