Sincronización de AWS S3 para Backup y Almacenamiento
AWS S3 es una de las soluciones más fiables y económicas para almacenar backups desde tu servidor Linux. Con el comando aws s3 sync, puedes automatizar copias de seguridad incrementales, encriptar los datos en tránsito y en reposo, y definir políticas de ciclo de vida para gestionar costes de almacenamiento de forma automática. Esta guía cubre la configuración completa desde la creación del bucket hasta los scripts de backup programados con cron.
Requisitos Previos
- AWS CLI v2 instalado y configurado (ver guía de instalación de AWS CLI)
- Cuenta de AWS con permisos para crear buckets S3 y usuarios IAM
- Servidor Linux con acceso a internet
- Espacio en disco suficiente para crear los archivos de backup
Creación y Configuración del Bucket S3
# Crear el bucket (el nombre debe ser único globalmente)
aws s3 mb s3://mis-backups-servidor-2024 --region eu-west-1
# Habilitar el versionado del bucket (recomendado para backups)
aws s3api put-bucket-versioning \
--bucket mis-backups-servidor-2024 \
--versioning-configuration Status=Enabled
# Bloquear el acceso público al bucket
aws s3api put-public-access-block \
--bucket mis-backups-servidor-2024 \
--public-access-block-configuration \
BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true
# Habilitar el cifrado por defecto (AES-256)
aws s3api put-bucket-encryption \
--bucket mis-backups-servidor-2024 \
--server-side-encryption-configuration '{
"Rules": [{
"ApplyServerSideEncryptionByDefault": {
"SSEAlgorithm": "AES256"
}
}]
}'
# Verificar la configuración del bucket
aws s3api get-bucket-versioning --bucket mis-backups-servidor-2024
aws s3api get-bucket-encryption --bucket mis-backups-servidor-2024
Políticas IAM para Backups
Crea un usuario IAM con permisos mínimos específicamente para los backups, siguiendo el principio de mínimo privilegio.
# Crear el usuario IAM para backups
aws iam create-user --user-name backup-bot
# Crear la política de permisos (guardar en un archivo)
cat > /tmp/politica-backup-s3.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject",
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": [
"arn:aws:s3:::mis-backups-servidor-2024",
"arn:aws:s3:::mis-backups-servidor-2024/*"
]
}
]
}
EOF
# Crear la política en AWS
aws iam create-policy \
--policy-name PoliticaBackupS3 \
--policy-document file:///tmp/politica-backup-s3.json
# Asociar la política al usuario
aws iam attach-user-policy \
--user-name backup-bot \
--policy-arn arn:aws:iam::ACCOUNT_ID:policy/PoliticaBackupS3
# Crear las credenciales de acceso para el usuario
aws iam create-access-key --user-name backup-bot
Guarda el AccessKeyId y SecretAccessKey generados y configúralos en el servidor:
# Configurar un perfil específico para backups
aws configure --profile backup
# Introduce las credenciales del usuario backup-bot
Sincronización Básica con aws s3 sync
# Sincronización básica de un directorio
aws s3 sync /var/www/html/ s3://mis-backups-servidor-2024/web/ --profile backup
# Sincronización con eliminación de archivos borrados en origen
aws s3 sync /var/www/html/ s3://mis-backups-servidor-2024/web/ \
--delete \
--profile backup
# Excluir archivos temporales y logs
aws s3 sync /var/www/ s3://mis-backups-servidor-2024/web/ \
--exclude "*.tmp" \
--exclude "*.log" \
--exclude "cache/*" \
--exclude ".git/*" \
--profile backup
# Sincronización en sentido inverso (restaurar desde S3)
aws s3 sync s3://mis-backups-servidor-2024/web/ /var/www/html/ --profile backup
# Ver qué se sincronizaría sin ejecutar cambios (modo dry-run)
aws s3 sync /var/www/ s3://mis-backups-servidor-2024/web/ --dryrun --profile backup
Encriptación de Datos
Cifrado en tránsito y en reposo
# Forzar el uso de HTTPS en todas las operaciones
aws s3 sync /datos/ s3://mis-backups-servidor-2024/datos/ \
--sse AES256 \
--profile backup
# Usar cifrado con clave gestionada por AWS KMS
aws s3 sync /datos/ s3://mis-backups-servidor-2024/datos/ \
--sse aws:kms \
--sse-kms-key-id alias/mi-clave-backup \
--profile backup
Cifrado del lado del cliente con GPG
Para mayor seguridad, cifra los archivos antes de subirlos:
# Crear un backup cifrado con GPG antes de subir
tar czf - /var/www/ | gpg --symmetric --passphrase "$CLAVE_GPG" | \
aws s3 cp - s3://mis-backups-servidor-2024/backup-$(date +%Y%m%d).tar.gz.gpg \
--profile backup
Reglas de Ciclo de Vida
Configura reglas automáticas para mover datos a clases de almacenamiento más baratas y eliminar backups antiguos.
# Crear la configuración de ciclo de vida
cat > /tmp/ciclo-vida.json << 'EOF'
{
"Rules": [
{
"ID": "MoverAGlacierYEliminar",
"Status": "Enabled",
"Filter": {
"Prefix": "backups/"
},
"Transitions": [
{
"Days": 30,
"StorageClass": "STANDARD_IA"
},
{
"Days": 90,
"StorageClass": "GLACIER"
}
],
"Expiration": {
"Days": 365
},
"NoncurrentVersionExpiration": {
"NoncurrentDays": 30
}
}
]
}
EOF
# Aplicar las reglas al bucket
aws s3api put-bucket-lifecycle-configuration \
--bucket mis-backups-servidor-2024 \
--lifecycle-configuration file:///tmp/ciclo-vida.json
# Verificar las reglas aplicadas
aws s3api get-bucket-lifecycle-configuration --bucket mis-backups-servidor-2024
Scripts de Backup Automatizado
Script de backup completo
#!/bin/bash
# Script de backup completo para servidor Linux + S3
# Guardar en: /usr/local/bin/backup-s3.sh
# Configuración
BUCKET="mis-backups-servidor-2024"
PERFIL="backup"
FECHA=$(date +%Y-%m-%d)
HORA=$(date +%H%M)
LOG="/var/log/backup-s3.log"
# Función para registrar mensajes
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG"
}
log "Iniciando backup diario"
# Backup de archivos web
log "Sincronizando archivos web..."
aws s3 sync /var/www/ s3://$BUCKET/web/ \
--exclude "*.log" \
--exclude "cache/*" \
--delete \
--sse AES256 \
--profile $PERFIL 2>> "$LOG"
# Backup de bases de datos MySQL
log "Realizando dump de bases de datos..."
mkdir -p /tmp/db-backups
for DB in $(mysql -e "SHOW DATABASES;" 2>/dev/null | grep -v "Database\|information_schema\|performance_schema\|sys"); do
mysqldump "$DB" | gzip > "/tmp/db-backups/${DB}-${FECHA}.sql.gz"
done
# Subir dumps de BD a S3
aws s3 sync /tmp/db-backups/ s3://$BUCKET/databases/$FECHA/ \
--sse AES256 \
--profile $PERFIL 2>> "$LOG"
# Limpiar dumps temporales
rm -rf /tmp/db-backups/
# Backup de configuraciones del sistema
log "Sincronizando configuraciones..."
aws s3 sync /etc/ s3://$BUCKET/config/$FECHA/etc/ \
--exclude "*.pid" \
--sse AES256 \
--profile $PERFIL 2>> "$LOG"
log "Backup completado"
# Eliminar backups de BD con más de 30 días
aws s3 ls s3://$BUCKET/databases/ --profile $PERFIL | \
awk '{print $2}' | \
while read dir; do
# Comparar fecha del directorio con 30 días atrás
fecha_dir=$(echo "$dir" | tr -d '/')
if [[ "$fecha_dir" < "$(date -d '30 days ago' +%Y-%m-%d)" ]]; then
aws s3 rm s3://$BUCKET/databases/$dir --recursive --profile $PERFIL
log "Eliminado backup antiguo: $dir"
fi
done
# Dar permisos de ejecución al script
chmod +x /usr/local/bin/backup-s3.sh
# Prueba manual
/usr/local/bin/backup-s3.sh
Programación con Cron
# Editar el crontab del sistema (o del usuario root)
crontab -e
Añadir las siguientes líneas:
# Backup completo cada día a las 2:00 AM
0 2 * * * /usr/local/bin/backup-s3.sh >> /var/log/backup-s3.log 2>&1
# Sincronización rápida de archivos web cada hora
0 * * * * aws s3 sync /var/www/ s3://mis-backups-servidor-2024/web/ --exclude "*.log" --profile backup >> /var/log/sync-s3.log 2>&1
Solución de Problemas
Error: An error occurred (AccessDenied)
# Verificar el perfil y las credenciales activas
aws configure list --profile backup
# Probar con un comando simple
aws s3 ls s3://mis-backups-servidor-2024 --profile backup
Error: No such bucket
# Listar los buckets disponibles
aws s3 ls --profile backup
# Verificar la región configurada
aws s3api get-bucket-location --bucket mis-backups-servidor-2024
La sincronización es lenta
# Aumentar el número de hilos paralelos
aws s3 sync /var/www/ s3://mis-backups-servidor-2024/web/ \
--profile backup \
--cli-parallel-chunk-size 100MB \
--cli-upload-parallel-threshold 100MB
Ver el tamaño del bucket
aws s3api list-objects-v2 \
--bucket mis-backups-servidor-2024 \
--query "[sum(Contents[].Size), length(Contents[])]"
Conclusión
AWS S3 combinado con el comando sync ofrece una solución de backup robusta, incremental y económica para cualquier servidor Linux. Con las políticas IAM correctas, el cifrado activado y los scripts de cron configurados, tus datos estarán protegidos automáticamente con un mínimo de intervención manual y costes optimizados mediante las reglas de ciclo de vida.


