Question Instantanés automatisés d'instance EC2 basée sur EBS et exécutant Ubuntu


Je cours un Instance soutenue par EBS qui agit en tant que serveur de compilation de l'équipe de développement logiciel (exécutant Jenkins et hébergeant d'autres services). Le serveur est en cours d'exécution Linux (dernier Ubuntu de la IMA officiels).

Je voudrais prendre instantanés réguliers et automatisés du volume EBS associé à l'instance. Je n'ai besoin que de conserver une dernière sauvegarde (par exemple, les anciens instantanés doivent être supprimés), et une bonne fréquence serait une fois par jour.

Il semble qu'Amazon ne fournisse pas ce service de sauvegarde tel quel, vous devez donc utiliser des scripts tiers ou lancer votre propre solution.

Ma question est, Quel est le moyen le plus simple d'y parvenir? Je voudrais un minimum de tracas, de configuration et de dépendances externes. Configurer ceci comme une sorte de script chronométré sur le système Linux lui-même est, à ma connaissance, une option valable.


6
2018-05-30 14:25


origine


J'ai créé ce script et une bonne explication sur la configuration. Lire ici serverfault.com/questions/237246/… - Sergey Romanov


Réponses:


Basé sur le concept de Jonik, j'ai créé un script python en utilisant boto. Vous lui fournissez une liste de volumes à capturer, ainsi que le nombre d'instantanés de fin à conserver pour chaque volume:

# Define the snapshots manage. We'll snapshot the specified volume ID, and only keep the X newest ones.
snapshots = [("vol-XXXXXXXX", 30), ("vol-YYYYYYYY", 180)]

import boto.ec2
auth = {"aws_access_key_id": "YOURACCESSKEY", "aws_secret_access_key": "YOURSECRETKEY"}
ec2 = boto.ec2.connect_to_region("YOURREGIONNAME", **auth)
description = "automated backup"
for volume, num_trailing in snapshots:
  snaps = ec2.get_all_snapshots(filters={"volume-id": volume, "description": description})
  print "%s: Creating new snapshot. %s automated snapshots currently exist." % (volume, len(snaps))
  ec2.create_snapshot(volume, description)
  purgeable = sorted(snaps, key=lambda x: x.start_time)[:-num_trailing]
  print "Deleting snapshots for %s > %s: %s" % (volume, num_trailing, purgeable)
  for snap in purgeable:
    ec2.delete_snapshot(snap.id)

Je l'ai configuré en tant que travail Jenkins (via le plugin Python), configuré pour s'exécuter quotidiennement. Si vous utilisez IAM pour gérer les informations d'identification, notez que cela nécessite des stratégies ec2: DescribeRegions, DescribeVolumes, CreateSnapshot, DeleteSnapshot, DescribeSnapshots, CreateTags (en raison de l'implémentation de boto).


5
2018-01-13 20:49



Leeeeeerooooooooyyyyyyyy - pauska


Ok, pour ce que ça vaut, voici ce que j'ai fait. J'espère que mes faibles scripts encouragent les gens à poster de meilleures solutions!

J'ai écrit deux scripts bash simples et les a automatisés en utilisant cron. (Pour l'instant, je les lance sur un serveur local, comme je pense (?) Il n'est pas recommandé de placer les certificats AWS dans les instances / AMI / EBS elles-mêmes.)

Pour créer un nouvel instantané:

# ESB volume associated with the instance we want to back up:
EBS_VOL_ID=vol-xxxxyyyy

ec2-create-snapshot --region eu-west-1 -K pk.pem -C cert.pem -d "Automated backup" $EBS_VOL_ID 

Élaguer tout sauf le dernier instantané:

EBS_VOL_ID=vol-xxxxyyyy

ec2-describe-snapshots --region eu-west-1 -K pk.pem -C cert.pem  | grep "Automated backup" | grep "$EBS_VOL_ID" | awk '{ print $5 "\t" $2 }' | sort > .snapshots

latest_id=$(tail -n1 .snapshots | awk '{ print $2 }')

cat .snapshots | awk '{ print $2 }' > .snapshot_ids
for i in $(cat .snapshot_ids) 
do
    if [ "$i" != "$latest_id" ]
    then
        echo "Deleting snapshot $i"
        ec2-delete-snapshot --region eu-west-1 -K pk.pem -C cert.pem $i
    fi
done

(Ceci analyse les informations d'instantané appropriées de ec2-describe-snapshots en sortie et crée un fichier temporaire avec des entrées [timestamp tab snapshot-id] (par exemple, 2011-06-01T10:24:36+0000 snap-60507609) où le dernier instantané est sur la dernière ligne.)

Remarques:

  • Placez votre certificat X509 et votre clé privée à un endroit où les scripts peuvent les trouver.
  • Vous doit spécifier explicitement --region avec toutes les commandes. Sinon, par exemple ec2-create-snapshot échouerait avec l'ID de volume inconnu. (YMMV si vous utilisez la région par défaut "us-east-1".)
  • J'ai utilisé une description d'instantané ("Sauvegarde automatisée") en tant que marqueur pour éviter que le script d'élagage ne supprime d'autres instantanés du volume en question (par exemple, des instantanés liés aux AMI).

Disclaimer: Ceci est devenu en partie un exercice de programmation Bash / Unix pour moi, en particulier le script prune. J'admets volontiers que vous obtiendrez probablement un résultat beaucoup plus clair avec par exemple Python, lorsque vous avez besoin d'une logique du type "faire quelque chose pour tout sauf le dernier élément d'une liste". Et même avec Bash, vous pourriez probablement le faire plus élégamment (par exemple, vous n’avez pas vraiment besoin de fichiers temporaires). Alors, n'hésitez pas à poster d'autres solutions!


4
2018-06-01 11:40



Bien sûr, il y a probablement des scénarios où l'approche consistant à ne garder que un la sauvegarde échouerait misérablement ... - Jonik


Si vous êtes ouvert aux utilitaires externes, consultez Skeddly.

Divulgation: Je suis le PDG de Eleven41 Software, la société derrière Skeddly.


1
2017-11-24 19:44



Faites attention lors de la promotion de votre produit, consultez la FAQ correspondante. Puis-je promouvoir des produits ou des sites Web auxquels je suis affilié ici? pour plus de détails. - Steffen Opel


J'ai développé l'idée du script de Jonik pour permettre de conserver plusieurs instantanés. Le code est trop long pour tenir dans un commentaire, alors j'ajoute une nouvelle réponse. Ce code suppose que toutes les variables d'environnement appropriées ont été configurées pour les outils de la CLI. De plus, par défaut, cela prend un instantané de l'instance actuelle.

# Look up our instance ID using the magic URL
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)

# The number of previous backups we want to keep
N=3

# get list of locally attached volumes via EC2 API:
VOLUME_LIST=$(ec2-describe-volumes | grep ${INSTANCE_ID} | awk '{ print $2 }')
DATE=$(date '+%Y-%m-%d-%H%M%S')

sync

# actually creating the snapshots
for VOLUME in $(echo $VOLUME_LIST); do
    echo "Processing volume $VOLUME"
    SNAPSHOT_LIST=$(ec2-describe-snapshots | grep completed | grep "Automatic snapshot" | grep $VOLUME | awk '{print $5 "\t" $2}' | sort | head "--lines=-$N" | awk '{print $2}')
    ec2-create-snapshot $VOLUME -d "Automatic snapshot on $DATE"
    for SNAPSHOT in $(echo $SNAPSHOT_LIST); do
        ec2-delete-snapshot $SNAPSHOT
    done
done

1
2017-07-07 23:00





J'ai écrit un script en PHP qui automatise les instantanés EBS et supprime les anciens. Il vous enverra même par courrier électronique les résultats des instantanés. Vous devez configurer AWS PHP SDK et PHPMailer pour les fonctionnalités de messagerie, mais ces deux étapes sont relativement simples. Ensuite, il vous suffit d'exécuter le script chaque nuit avec des tâches programmées CRON ou Windows. Des instructions détaillées et le code peuvent être trouvés sur mon blog:

http://www.caleblloyd.com/software/automatically-take-ebs-snapshots-and-delete-old-ones-with-php-script/


0
2018-05-27 01:41



Bien que cela puisse théoriquement répondre à la question, ce serait préférable pour inclure les parties essentielles de la réponse ici, et fournir le lien pour référence. - Scott Pack