Hace tiempo que vengo usando este método de realizar mis backups personales, aunque siendo correctos, por definición no se trata realmente del concepto de "Backups" sino de un sistema sincronizado. Si usando el mismo método almacenara copias durante un periodo de tiempo determinado con una autoeliminación de los backups más viejos es decir, una política de retención. En ese caso si estaríamos aplicando el concepto de backups.
Esta es una forma sincronizar datos en dos sitios o ubicaciones distintas. Por un lado tenemos los datos locales que queremos salvaguardar y por otro un sitio cloud donde realizaremos la sincronización de dichos datos en un momento programado y definido previamente para que se realice después de manera automática.
Se trata de un script que realiza un push de los datos locales a una ubicación remota en Amazon S3 usando un almacenamiento en un bucket. El script lo he desarrollado tanto para PowerShell como para Bash scripting, de forma que se pueda utilizar en sistemas Windows, Linux o MacOS.
Bash Shell Script
- Instalación y configuración de AWSCLI Linux
- Modificación de variables del bash script backup-aws-S3.sh
- Instalación y configuración de SSMTP
- Desactivar alertas automáticas de cron y programar tarea para la ejecución de un script sh
- Envío del fichero de log a una cuenta Gmail
PowerShell
- Instalación y configuración de AWSCLI Windows
- Modificación de variables del PowerShell script backup-aws-S3.ps1
- Definir sintaxis de directorios
- Envío del fichero de log a una cuenta Gmail
- Llamada a fichero PowerShell .ps1 desde un fichero de proceso por lotes .bat
En mi repositorio de Gihub comento en más detalle el procedimiento a seguir.
![]() |
Figura 1: Envío de logs al email de los backups en AWS en un bucket S3. |
Evitar escribir la password a fuego en el script de Powershell ps1
Crear un fichero con la password cifrada:
"MiPassword" | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-File "C:\PATH\backup_aws_s3.pass"
PowerShell (Windows)
# Fecha y Hora
$fechaHoraActual = Get-Date -uformat "%d/%m/%Y - %H:%M:%S"
$fechaActual = Get-Date -uformat "%d-%m-%Y"
$usuarioEmail = "usuarioEmail@gmail.com"
$passwdEmailFile = "C:\PATH\backup-aws-s3.pass"
$asuntoEmail = "asuntoEmail"
# Obtener password cifrada del fichero y establecer credenciales
$secPasswdEmail = Get-Content $passwdEmailFile| ConvertTo-SecureString
$credencialesEmail = New-Object System.Management.Automation.PSCredential ($usuarioEmail, $secPasswdEMail)
# Paths
# Compatibles en sistemas Windows: "C:/pathLocal/datos/" o "C:\\pathLocal\\datos\\"
$pathLocalDatos = "C:\\pathLocal\\datos\\"
$pathRemotoBucketS3 = "s3://bucketS3/backup/"
$backupLog = "backup_$fechaActual.log"
# Comprobar si existen ficheros de log pasados del backup
if (Test-Path "*backup*.log") {
Remove-Item -Path "*backup*.log" -Recurse -Force
}
# Mostrar fecha y hora del comienzo del proceso de backup al princpio del log
Write-Output "Backup comienza: $fechaHoraActual" > $backupLog
Write-Output "# # # # # # # # # # # # # # # # # # # #`n" >> $backupLog
# Sincronizar datos locales a bucket S3 de AWS
aws s3 sync $pathLocalDatos $pathRemotoBucketS3 --sse AES256 --delete --include "*" >> $backupLog
Write-Output "`n# # # # # # # # # # # # # # # # # # # #" >> $backupLog
# Mostrar fecha y hora de la finalización del proceso de backup al final del log
# Resetear la variable $fechaHoraActual para obtener la hora actual hasta este momento del proceso de backup
$fechaHoraActual = Get-Date -uformat "%d/%m/%Y - %H:%M:%S"
Write-Output "Backup finaliza: $fechaHoraActual" >> $backupLog
# Body Email
$cuerpoEmail = [system.io.file]::ReadAllText($backupLog)
# Alternativas usando Get-Content
# $cuerpoEmail = Get-Content "$backupLog" | Out-String
# $cuerpoEmail = Get-Content "$backupLog" -Raw
# Envío del fichero log adjunto vía Email usando Gmail.
Send-MailMessage -From $usuarioEmail -To $usuarioEmail -Subject "$asuntoEmail - $fechaHoraActual" -Body "$cuerpoEmail" -Attachments "$backupLog" -SmtpServer smtp.gmail.com -UseSsl -Credential $credencialesEmail
exit
Bash (Linux y MacOS)
# Fecha y Hora
fechaHoraActual="$(date +'%d/%m/%Y - %H:%M:%S')"
fechaActual="$(date +'%d-%m-%Y')"
envioEmailCuentaUsuario="emailCuentaUsuario@gmail.com"
asuntoEmail="asuntoEmail"
cuerpoEmail="cuerpoEmail"
# Paths
pathLocalDatos="/pathLocal/datos/"
pathRemotoBucketS3="s3://bucketS3/backup/"
backupLog="backup_$fechaActual.log"
# Comprobar si existen ficheros de log pasados del backup
if [ -f "*backup*.log" ];
then
rm -f "*backup*.log"
fi
# Mostrar fecha y hora del comienzo del proceso de backup al princpio del log
echo "Backup comienza: $fechaHoraActual" > $backupLog
echo -e "# # # # # # # # # # # # # # # # # # # #\n" >> $backupLog
# Sincronizar datos locales a bucket S3 de AWS
aws s3 sync $pathLocalDatos $pathRemotoBucketS3 --sse AES256 --delete --include "*" >> $backupLog
echo -e "\n# # # # # # # # # # # # # # # # # # # #" >> $backupLog
# Mostrar fecha y hora de la finalización del proceso de backup al final del log
# Resetear la variable fechaHoraActual para obtener la hora actual hasta este momento del proceso de backup
fechaHoraActual="$(date +'%d/%m/%Y - %H:%M:%S')"
echo "Backup finaliza: $fechaHoraActual" >> $backupLog
# Elegir una opción de envío (a o b)
# a) Envío del fichero log adjunto vía Email usando el comando mail.
echo "$cuerpoEmail" | mail -s "$asuntoEmail" "$envioEmailCuentaUsuario" -A "$backupLog"
# b) Envío del contenido del fichero log en el cuerpo del Email usando el comando mail.
cat "$backupLog" | mail -s "$asuntoEmail" "$envioEmailCuentaUsuario"
Como ya comenté anteriormente en el repositorio de Github hay más información paso a paso de como implementar esta forma de sincronizar datos locales un bucket de Amazon S3.
Saludos!
No hay comentarios
Publicar un comentario