Publié à l'origine sur mon blog : http://eladnava.com/backing-up-your-amazon-s3-buckets-to-ec2/
Synchronisez périodiquement votre godet S3 sur un serveur EC2
Cela peut être facilement réalisé en utilisant plusieurs utilitaires en ligne de commande qui permettent de synchroniser un seau S3 distant avec le système de fichiers local.
s3cmd
Au début, s3cmd
semblait extrêmement prometteur. Cependant, après l'avoir essayé sur mon énorme seau S3, il n'a pas réussi à se mettre à l'échelle, avec un message d'erreur Segmentation fault
. Il a cependant bien fonctionné sur les petits seaux. Comme il ne fonctionnait pas pour les grands seaux, je me suis mis à la recherche d'une alternative.
s4cmd
L'alternative plus récente et multi-filière à s3cmd
. semblait encore plus prometteur, mais j'ai remarqué qu'il continuait à retélécharger des fichiers qui étaient déjà présents sur le système de fichiers local. Ce n'est pas le genre de comportement que j'attendais de la commande sync. Elle devrait vérifier si le fichier distant existe déjà localement (une vérification du hachage/de la taille des fichiers serait utile) et l'ignorer lors de la prochaine synchronisation sur le même répertoire cible. J'ai ouvert une question ( bloomreach/s4cmd/#46 ) pour signaler ce comportement étrange. En attendant, j'ai entrepris de trouver une autre solution.
awscli
Et puis j'ai trouvé awscli
. Il s'agit de l'interface de ligne de commande officielle d'Amazon pour interagir avec ses différents services en nuage, dont S3.
Il fournit une commande de synchronisation utile qui permet de rapidement et facilement télécharge les fichiers du seau distant sur votre système de fichiers local .
$ aws s3 sync s3://your-bucket-name /home/ubuntu/s3/your-bucket-name/
Avantages :
- Évolutif - prend en charge les énormes seaux S3
- Multithreaded - synchronisation des fichiers plus rapide grâce à l'utilisation de plusieurs threads.
- Smart - ne synchronise que les fichiers nouveaux ou mis à jour
- Rapide - grâce à sa nature multithread et à son algorithme de synchronisation intelligent.
Suppression accidentelle
De façon pratique, le sync
ne supprimera pas les fichiers du dossier de destination (système de fichiers local) s'ils sont absents de la source (seau S3), et vice-versa. C'est parfait pour la sauvegarde de S3 - si des fichiers sont supprimés du seau, la resynchronisation ne les supprimera pas localement. Et si vous supprimez un fichier local, il ne sera pas non plus supprimé du seau source.
Configuration d'awscli sur Ubuntu 14.04 LTS
Commençons par installer awscli
. Il existe plusieurs façons pour le faire, cependant, j'ai trouvé plus facile de l'installer via apt-get
.
$ sudo apt-get install awscli
Configuration
Ensuite, nous devons configurer awscli
à l'aide de notre ID de clé d'accès et de notre clé secrète, que vous devez obtenir auprès de la Commission européenne. IAM en créant un utilisateur et en attachant le AmazonS3ReadOnlyAccess politique. Cela vous empêchera également, vous ou toute personne ayant accès à ces informations d'identification, de supprimer vos fichiers S3. Assurez-vous d'entrer votre région S3, telle que us-east-1
.
$ aws configure
Préparation
Préparons le répertoire de sauvegarde S3 local, de préférence dans /home/ubuntu/s3/{BUCKET_NAME}
. Veillez à remplacer {BUCKET_NAME}
avec votre nom réel de seau.
$ mkdir -p /home/ubuntu/s3/{BUCKET\_NAME}
Synchronisation initiale
Allons-y et synchronisons le seau pour la première fois avec la commande suivante :
$ aws s3 sync s3://{BUCKET\_NAME} /home/ubuntu/s3/{BUCKET\_NAME}/
En supposant que le seau existe, que les informations d'identification AWS et la région sont correctes et que le dossier de destination est valide, awscli
va commencer à télécharger l'ensemble du panier sur le système de fichiers local.
En fonction de la taille du seau et de votre connexion Internet, cela peut prendre de quelques secondes à plusieurs heures. Une fois l'opération terminée, nous allons mettre en place une tâche cron automatique pour maintenir à jour la copie locale du seau.
Configuration d'une tâche Cron
Allez-y et créez un sync.sh
dans /home/ubuntu/s3
:
$ nano /home/ubuntu/s3/sync.sh
Copiez et collez le code suivant dans sync.sh
:
#!/bin/sh
# Echo the current date and time
echo '-----------------------------'
date
echo '-----------------------------'
echo ''
# Echo script initialization
echo 'Syncing remote S3 bucket...'
# Actually run the sync command (replace {BUCKET\_NAME} with your S3 bucket name)
/usr/bin/aws s3 sync s3://{BUCKET\_NAME} /home/ubuntu/s3/{BUCKET\_NAME}/
# Echo script completion
echo 'Sync complete'
Veillez à remplacer {BUCKET_NAME} avec votre nom de seau S3, deux fois dans le script.
Un conseil de pro : Vous devez utiliser /usr/bin/aws
pour établir un lien avec le aws
binaire, comme crontab
exécute les commandes dans un environnement shell limité et ne sera pas en mesure de trouver l'exécutable par lui-même.
Ensuite, assurez-vous de chmod
le script pour qu'il puisse être exécuté par les personnes suivantes crontab
.
$ sudo chmod +x /home/ubuntu/s3/sync.sh
Essayons d'exécuter le script pour nous assurer qu'il fonctionne réellement :
$ /home/ubuntu/s3/sync.sh
Le résultat devrait être similaire à celui-ci :
Ensuite, nous allons modifier le fichier de l'utilisateur actuel. crontab
en exécutant la commande suivante :
$ crontab -e
Si c'est la première fois que vous exécutez crontab -e
vous devrez sélectionner un éditeur préféré. Je vous recommande de choisir nano
car c'est le plus facile à utiliser pour les débutants.
Fréquence de synchronisation
Nous devons dire crontab
à quelle fréquence exécuter notre script et où le script réside sur le système de fichiers local en écrivant une commande. Le format de cette commande est le suivant :
m h dom mon dow command
La commande suivante configure crontab
pour exécuter le sync.sh
script toutes les heures (spécifiées par les paramètres minute:0 et heure:*) et de faire en sorte que la sortie du script soit envoyée à un fichier de type sync.log
dans notre s3
répertoire :
0 \* \* \* \* /home/ubuntu/s3/sync.sh > /home/ubuntu/s3/sync.log
Vous devez ajouter cette ligne au bas de la page d'accueil. crontab
que vous éditez. Ensuite, allez-y et enregistrez le fichier sur le disque en appuyant sur Ctrl + W et ensuite Entrez . Vous pouvez alors quitter nano
en appuyant sur Ctrl + X . crontab
va maintenant exécuter la tâche de synchronisation toutes les heures.
Un conseil de pro : Vous pouvez vérifier que la tâche cron horaire est exécutée avec succès en inspectant les données suivantes /home/ubuntu/s3/sync.log
en vérifiant la date et l'heure d'exécution de son contenu, et en inspectant les journaux pour voir quels nouveaux fichiers ont été synchronisés.
Tout est prêt ! Votre seau S3 sera maintenant synchronisé avec votre serveur EC2 toutes les heures automatiquement, et vous devriez être prêt à partir. Notez qu'au fil du temps, lorsque votre seau S3 devient plus grand, vous devrez peut-être augmenter la taille du volume EBS de votre serveur EC2 pour accueillir les nouveaux fichiers. Vous pouvez toujours augmenter la taille de votre volume EBS en suivant les instructions suivantes ce guide .