Publicado originalmente en mi blog: http://eladnava.com/backing-up-your-amazon-s3-buckets-to-ec2/
Sincronice su bucket de S3 con un servidor EC2 periódicamente
Esto se puede lograr fácilmente utilizando múltiples utilidades de línea de comando que hacen posible sincronizar un depósito S3 remoto con el sistema de archivos local.
s3cmd
Al principio, s3cmd
parecía muy prometedor. Sin embargo, después de probarlo en mi enorme cubo S3, no se pudo escalar, con un error de Segmentation fault
. Sin embargo, funcionó bien en cubos pequeños. Como no funcionó para cubos enormes, me propuse buscar una alternativa.
s4cmd
La alternativa más nueva de subprocesos múltiples a s3cmd
. Sin embargo, parecía aún más prometedor, noté que seguía volviendo a descargar archivos que ya estaban presentes en el sistema de archivos local. Ese no es el tipo de comportamiento que esperaba del comando de sincronización. Debería comprobar si el archivo remoto ya existe localmente (la comprobación de hash / hash estaría bien) y omitirlo en la próxima ejecución de sincronización en el mismo directorio de destino. Abrí un problema ( bloomreach / s4cmd / # 46 ) para informar este extraño comportamiento. Mientras tanto, me propuse buscar otra alternativa.
awscli
Y luego encontré awscli
. Esta es la interfaz de línea de comandos oficial de Amazon para interactuar con sus diferentes servicios en la nube, incluido S3.
Proporciona un comando de sincronización útil que descarga rápida y fácilmente los archivos del depósito remoto a su sistema de archivos local .
$ aws s3 sync s3: // nombre-de-tu-depósito / home / ubuntu / s3 / nombre-de-tu-depósito /
Beneficios:
- Escalable: admite grandes depósitos S3
- Multi-hilo: sincroniza los archivos más rápido utilizando varios hilos
- Inteligente: solo sincroniza archivos nuevos o actualizados
- Rápido: gracias a su naturaleza de subprocesos múltiples y su algoritmo de sincronización inteligente
Eliminación accidental
Convenientemente, el sync
comando no eliminará archivos en la carpeta de destino (sistema de archivos local) si faltan en el origen (depósito S3) y viceversa. Esto es perfecto para hacer una copia de seguridad de S3: en caso de que los archivos se eliminen del depósito, volver a sincronizarlos no los eliminará localmente. Y en caso de que elimine un archivo local, tampoco se eliminará del depósito de origen.
Configuración de awscli en Ubuntu 14.04 LTS
Comencemos por instalar awscli
. Hay varias formas de hacer esto, sin embargo, me resultó más fácil instalarlo a través de apt-get
.
$ sudo apt-get install awscli
Configuración
A continuación, debemos configurar awscli
con nuestro ID de clave de acceso y clave secreta, que debe obtener de IAM , creando un usuario y adjuntando la política AmazonS3ReadOnlyAccess . Esto también evitará que usted o cualquier persona que obtenga acceso a estas credenciales elimine sus archivos S3. Asegúrese de ingresar su región S3, como us-east-1
.
$ aws configure
Preparación
Preparemos el directorio de respaldo local de S3, preferiblemente en formato /home/ubuntu/s3/{BUCKET_NAME}
. Asegúrese de reemplazarlo {BUCKET_NAME}
con el nombre real de su depósito.
$ mkdir -p / home / ubuntu / s3 / {BUCKET_NAME}
Sincronización inicial
Sigamos adelante y sincronicemos el depósito por primera vez con el siguiente comando:
$ aws s3 sync s3: // {BUCKET_NAME} / home / ubuntu / s3 / {BUCKET_NAME} /
Suponiendo que el depósito existe, las credenciales y la región de AWS son correctas y la carpeta de destino es válida, awscli
comenzará a descargar el depósito completo en el sistema de archivos local.
Dependiendo del tamaño del depósito y de su conexión a Internet, podría llevar desde unos segundos hasta horas. Cuando termine, seguiremos adelante y configuraremos un trabajo cron automático para mantener actualizada la copia local del depósito.
Configuración de un trabajo cron
Continúe y cree un sync.sh
archivo en /home/ubuntu/s3
:
$ nano /home/ubuntu/s3/sync.sh
Copie y pegue el siguiente código en sync.sh
:
#! / bin / sh
# Hacer eco de la fecha y hora actuales
eco '-----------------------------'
fecha
eco '-----------------------------'
eco ''
# Inicialización del script de eco
echo 'Sincronizando el depósito S3 remoto ...'
# Ejecute el comando de sincronización (reemplace {BUCKET_NAME} con el nombre de su depósito de S3)
/ usr / bin / aws s3 sync s3: // {BUCKET_NAME} / home / ubuntu / s3 / {BUCKET_NAME} /
# Finalización del guión de eco
echo 'Sincronización completa'
Asegúrese de reemplazar {BUCKET_NAME} con el nombre de su depósito de S3, dos veces a lo largo de la secuencia de comandos.
Consejo profesional: debe usar /usr/bin/aws
para vincular al aws
binario, ya que crontab
ejecuta comandos en un entorno de shell limitado y no podrá encontrar el ejecutable por sí solo.
A continuación, asegúrese de chmod
utilizar el script para que pueda ejecutarlo crontab
.
$ sudo chmod + x /home/ubuntu/s3/sync.sh
Intentemos ejecutar el script para asegurarnos de que realmente funcione:
$ /home/ubuntu/s3/sync.sh
La salida debería ser similar a esta:
A continuación, editemos el usuario actual crontab
ejecutando el siguiente comando:
$ crontab -e
Si es la primera vez que lo ejecuta crontab -e
, deberá seleccionar un editor preferido. Recomiendo seleccionarlo nano
ya que es el más fácil de trabajar para los principiantes.
Frecuencia de sincronización
Necesitamos decir con crontab
qué frecuencia ejecutar nuestro script y dónde reside el script en el sistema de archivos local escribiendo un comando. El formato de este comando es el siguiente:
comando mh dom mon dow
El siguiente comando se configura crontab
para ejecutar el sync.sh
script cada hora (especificado mediante los parámetros minuto: 0 y hora: *) y para que canalice la salida del script a un sync.log
archivo en nuestro s3
directorio:
0 * * * * /home/ubuntu/s3/sync.sh> /home/ubuntu/s3/sync.log
Debe agregar esta línea al final del crontab
archivo que está editando. Luego, continúe y guarde el archivo en el disco presionando Ctrl + W y luego Enter . A continuación, puede salir nano
pulsando Ctrl + X . crontab
ahora ejecutará la tarea de sincronización cada hora.
Consejo profesional: puede verificar que el trabajo cron por hora se esté ejecutando con éxito inspeccionando /home/ubuntu/s3/sync.log
, verificando su contenido para la fecha y hora de ejecución e inspeccionando los registros para ver qué archivos nuevos se han sincronizado.
¡Todo listo! Su bucket de S3 ahora se sincronizará con su servidor EC2 cada hora automáticamente, y debería estar listo para comenzar. Tenga en cuenta que con el tiempo, a medida que su bucket de S3 crece, es posible que deba aumentar el tamaño del volumen de EBS de su servidor EC2 para dar cabida a nuevos archivos. Siempre puede aumentar el tamaño de su volumen de EBS siguiendo esta guía .