Sauvegarde automatique vers Amazon S3
Je suis devenu très critique ces derniers temps quant à la sécurité de mes sauvegardes. D'autant que j'expérimente beaucoup avec mon serveur virtuel (sur lequel ce site est notamment hébergé) et qu'il m'arrive de bousiller une configuration. De plus, j'adore la bonne sensation de travailler sur un système frais et propre, et je suis donc très « partant pour réinstaller ». Il peut alors être très pénible de sauvegarder sans cesse à la main les configurations existantes, les fichiers et tout ce qu'on s'est installé. Quoi de plus naturel que de sauvegarder automatiquement ses fichiers ? J'ai donc écrit récemment un petit script, que j'ai maintenant publié sur mon Git.
On le trouve ici : github.com/devdavede/s3backup
L'installation / l'exécution est assez simple.
Étape 1 : créer un bucket S3
Je pars du principe que vous avez déjà créé un compte Amazon Web Services. Sinon, vous pouvez le faire ici : aws.amazon.com
Ensuite, allez dans la section S3 en tapant S3 dans la recherche en haut, cliquez sur Créer un compartiment et saisissez un nom et une région pour le bucket.
Vous devriez désactiver les ACL et désactiver également tout l'accès public (ce qui se passe si vous oubliez cette étape, vous pouvez le lire ici : rudrasarkar.medium.com - how-i-hacked-92k-users).
J'ai désactivé le versionnage (c'est à vous de voir si vous voulez un versionnage des fichiers ; j'ai choisi de ne pas en avoir car je ne veux toujours récupérer que la dernière version de mes fichiers) et le chiffrement également (là aussi, c'est à vous de décider si vous travaillez avec ou sans chiffrement).
À l'étape suivante, vous devez choisir un nom d'utilisateur, et comme type d'accès vous choisissez clé d'accès - accès par programmation.
À l'étape Autorisations, vous choisissez « Attacher directement les stratégies existantes » et ici « AmazonS3FullAccess ». Cliquez sur Suivant : Balises, vous n'avez rien à faire ici.
Passez à l'étape suivante et copiez ici les valeurs sous ID de clé d'accès et Clé d'accès secrète. Ces clés sont secrètes et vous ne devez surtout pas les transmettre : quiconque possède cette combinaison de clés peut sinon accéder à vos fichiers.
Voilà, l'étape un est faite. Vous avez maintenant un bucket Amazon S3 auquel vous pouvez accéder via l'API.
Étape 2 : configurer les identifiants
Il y a maintenant deux façons de vous authentifier auprès de S3.
La première consiste à créer un fichier d'identifiants. Pour cela, vous créez un fichier ~/.aws/credentials avec le contenu suivant :
[default]
aws_access_key_id = <zugriffsschlüsselid>
aws_secret_access_key = <geheimerzugrifsschlüssel>
et un fichier ~/.aws/config avec le contenu suivant :
[default]
region = <region>
(si vous ne vous souvenez plus dans quelle région vous avez créé le bucket, vous pouvez le vérifier dans la console de gestion web)
Et voilà : le script Python peut maintenant s'authentifier auprès de S3 avec ces données.
La deuxième consiste à saisir les identifiants directement dans le script (voir les variables aws_access_key_id, aws_secret_access_key et region_name). Cette méthode n'est toutefois pas recommandée, car les identifiants sont alors visibles sans protection par quiconque a accès au script.
Étape 3 : créer le my.cnf
Si vous voulez aussi sauvegarder votre base de données, vous devez enregistrer les identifiants de la base. Le mieux est de le faire (si ce n'est pas déjà fait) via my.cnf.
Tapez pour cela les commandes suivantes dans le shell :
m=`which mysqld`
$m --verbose --help | grep -A 1 "Default options"
et vous obtenez le chemin (en général /etc/my.cnf) de votre my.cnf
Ouvrez-le maintenant et ajoutez la partie suivante à la fin du fichier
[client]
user=<deinmysqlrootusername>
password=<deinmysqlrootpasswort>
C'est tout. Ensuite, votre utilisateur peut se connecter au shell MySQL sans indiquer de nom d'utilisateur / mot de passe.
Là encore, vous pouvez aussi saisir les identifiants directement dans le script. J'ai déjà mentionné plus haut les inconvénients :-)
Étape 4 : configurer le script
Téléversez maintenant le script sur votre serveur et modifiez-le un peu. Les variables suivantes doivent être modifiées :
- entities = Un tableau de dossiers ou de fichiers à sauvegarder (sous-dossiers inclus !)
- bucketname = Le nom de votre bucket S3
- db_path = Le chemin vers la base de données dans laquelle sont enregistrées les sommes de contrôle des fichiers
- aws_access_key_id = Votre clé d'accès AWS. À laisser sur None si vous utilisez le fichier de configuration de l'étape 2
- aws_secret_access_key = Votre clé secrète AWS. À laisser sur None si vous utilisez le fichier de configuration de l'étape 2
- region_name = Le nom de la région de votre bucket. À laisser sur None si vous utilisez le fichier de configuration de l'étape 2
- backup_databases = True si des sauvegardes de toutes les bases doivent être créées, sinon False
- mysql_username = Votre nom d'utilisateur MySQL. À laisser sur None si vous utilisez le fichier de configuration de l'étape 3
- mysql_password = Votre mot de passe MySQL. À laisser sur None si vous utilisez le fichier de configuration de l'étape 2
- mysql_tmp_dump_file = Un dump temporaire de la base est créé ici. Le dossier doit être accessible en écriture.
- s3_mysql_dump_path = Le chemin de votre dump de base dans votre bucket S3
Étape 5 : charger les dépendances
Pour le téléversement vers S3, le script utilise Boto
TinyDB est en outre utilisé pour enregistrer les sommes de contrôle des fichiers dans une petite base de données (le chemin dans la variable db_path)
Pour installer toutes les dépendances, exécutez simplement la commande suivante dans le shell :
pip3 install -r requirements.txt
tous les paquets nécessaires sont alors installés.
Étape 6 : Run it!
Lancez un essai en saisissant la commande
python3 s3backup.py
et, quand le script a fini de tourner, regardez dans votre bucket S3. Vous devriez y voir, dans la même hiérarchie que sur votre serveur, une copie 1:1 de tous les fichiers / dossiers / sous-dossiers indiqués dans la variable entities.
Étape 7 (bonus) : automatiser via une tâche cron
Tout cela peut aussi s'automatiser facilement via une tâche cron.
Nous commençons par trouver où se trouve notre installation de Python3 :
which python3
Cela nous renvoie quelque chose comme /usr/bin/python3.
Ensuite, nous saisissons
crontab -e
et ici ce qui suit
0 0 */5 * * <Pfad-zu-Python3> <Pfad-zum-backup-skript.py>
Validez avec Ctrl+X (fermer) et Y (oui, enregistrer !). La sauvegarde est ainsi exécutée automatiquement tous les 5 jours à 24 h 00.