Ursprünglich auf meinem Blog veröffentlicht: http://eladnava.com/backing-up-your-amazon-s3-buckets-to-ec2/
Synchronisieren Sie Ihren S3-Bucket regelmäßig mit einem EC2-Server
Dies kann leicht erreicht werden, indem mehrere Befehlszeilenprogramme verwendet werden, mit denen ein Remote-S3-Bucket mit dem lokalen Dateisystem synchronisiert werden kann.
s3cmd
Zunächst s3cmd
sah sehr vielversprechend. Nachdem ich es jedoch an meinem riesigen S3-Eimer ausprobiert hatte, konnte es nicht skaliert werden und trat mit einem Fehler auf Segmentation fault
. Bei kleinen Eimern funktionierte es jedoch einwandfrei. Da es bei großen Eimern nicht funktionierte, machte ich mich auf die Suche nach einer Alternative.
s4cmd
Die neuere Multithread-Alternative zu s3cmd
. Es sah noch vielversprechender aus, aber ich bemerkte, dass immer wieder Dateien heruntergeladen wurden, die bereits im lokalen Dateisystem vorhanden waren. Das ist nicht das Verhalten, das ich vom Synchronisierungsbefehl erwartet habe. Es sollte prüfen, ob die Remote-Datei bereits lokal vorhanden ist (die Überprüfung der Hash- / Dateigröße wäre ordentlich) und sie beim nächsten Synchronisierungslauf im selben Zielverzeichnis überspringen. Ich habe ein Problem ( bloomreach / s4cmd / # 46 ) geöffnet , um dieses seltsame Verhalten zu melden. In der Zwischenzeit machte ich mich auf die Suche nach einer anderen Alternative.
awscli
Und dann habe ich gefunden awscli
. Dies ist die offizielle Befehlszeilenschnittstelle von Amazon für die Interaktion mit den verschiedenen Cloud-Diensten, einschließlich S3.
Es bietet einen nützlichen Synchronisierungsbefehl, mit dem die Remote-Bucket-Dateien schnell und einfach in Ihr lokales Dateisystem heruntergeladen werden können .
$ aws s3 sync s3: // dein-Bucket-Name / home / ubuntu / s3 / dein-Bucket-Name /
Leistungen:
- Skalierbar - unterstützt riesige S3-Eimer
- Multithreading - Synchronisiert die Dateien schneller, indem mehrere Threads verwendet werden
- Smart - synchronisiert nur neue oder aktualisierte Dateien
- Schnell - dank Multithreading und intelligentem Synchronisierungsalgorithmus
Versehentliches Löschen
Praktischerweise sync
löscht der Befehl keine Dateien im Zielordner (lokales Dateisystem), wenn sie in der Quelle fehlen (S3-Bucket), und umgekehrt. Dies ist ideal für die Sicherung von S3 - falls Dateien aus dem Bucket gelöscht werden, werden sie durch erneutes Synchronisieren nicht lokal gelöscht. Und falls Sie eine lokale Datei löschen, wird diese auch nicht aus dem Quell-Bucket gelöscht.
Einrichten von awscli unter Ubuntu 14.04 LTS
Beginnen wir mit der Installation awscli
. Es gibt verschiedene Möglichkeiten , dies zu tun. Ich fand es jedoch am einfachsten, es über zu installieren apt-get
.
$ sudo apt-get installiere awscli
Aufbau
Als Nächstes müssen wir awscli
unsere Zugriffsschlüssel-ID und unseren geheimen Schlüssel konfigurieren , die Sie von IAM erhalten müssen , indem Sie einen Benutzer erstellen und die AmazonS3ReadOnlyAccess- Richtlinie anhängen . Dies verhindert auch, dass Sie oder jemand, der Zugriff auf diese Anmeldeinformationen erhält, Ihre S3-Dateien löschen. Stellen Sie sicher, dass Sie Ihre S3-Region eingeben, z us-east-1
.
$ aws konfigurieren
Vorbereitung
Bereiten wir das lokale S3-Sicherungsverzeichnis vor, vorzugsweise in /home/ubuntu/s3/{BUCKET_NAME}
. Stellen Sie sicher, dass Sie {BUCKET_NAME}
durch Ihren tatsächlichen Bucket-Namen ersetzen .
$ mkdir -p / home / ubuntu / s3 / {BUCKET_NAME}
Erstsynchronisierung
Lassen Sie uns fortfahren und den Bucket zum ersten Mal mit dem folgenden Befehl synchronisieren:
$ aws s3 synchronisiere s3: // {BUCKET_NAME} / home / ubuntu / s3 / {BUCKET_NAME} /
Angenommen, der Bucket ist vorhanden, die AWS-Anmeldeinformationen und die Region sind korrekt und der Zielordner ist gültig. awscli
Der gesamte Bucket wird in das lokale Dateisystem heruntergeladen.
Abhängig von der Größe des Buckets und Ihrer Internetverbindung kann dies einige Sekunden bis Stunden dauern. Wenn dies erledigt ist, richten wir einen automatischen Cron-Job ein, um die lokale Kopie des Buckets auf dem neuesten Stand zu halten.
Einrichten eines Cron-Jobs
Fahren Sie fort und erstellen Sie eine sync.sh
Datei in /home/ubuntu/s3
:
$ nano /home/ubuntu/s3/sync.sh
Kopieren Sie den folgenden Code und fügen Sie ihn ein sync.sh
:
#! / bin / sh
# Geben Sie das aktuelle Datum und die aktuelle Uhrzeit wieder
Echo '-----------------------------'
Datum
Echo '-----------------------------'
Echo ''
# Echo-Skript-Initialisierung
echo 'Remote S3 Bucket synchronisieren ...'
# Führen Sie den Synchronisierungsbefehl aus (ersetzen Sie {BUCKET_NAME} durch Ihren S3-Bucket-Namen).
/ usr / bin / aws s3 synchronisiert s3: // {BUCKET_NAME} / home / ubuntu / s3 / {BUCKET_NAME} /
# Echo-Skript-Abschluss
Echo 'Synchronisierung abgeschlossen'
Stellen Sie sicher, dass Sie {BUCKET_NAME} zweimal im gesamten Skript durch Ihren S3-Bucket-Namen ersetzen .
Pro-Tipp: Sie sollten /usr/bin/aws
eine Verknüpfung zur aws
Binärdatei verwenden, da crontab
Befehle in einer eingeschränkten Shell-Umgebung ausgeführt werden und die ausführbare Datei nicht alleine gefunden werden kann.
Stellen chmod
Sie als Nächstes sicher, dass das Skript von ausgeführt wird crontab
.
$ sudo chmod + x /home/ubuntu/s3/sync.sh
Versuchen wir, das Skript auszuführen, um sicherzustellen, dass es tatsächlich funktioniert:
$ /home/ubuntu/s3/sync.sh
Die Ausgabe sollte ungefähr so aussehen:
Als nächstes bearbeiten wir die aktuellen Benutzer, crontab
indem wir den folgenden Befehl ausführen:
$ crontab -e
Wenn Sie dies zum ersten Mal ausführen crontab -e
, müssen Sie einen bevorzugten Editor auswählen. Ich würde die Auswahl empfehlen, nano
da es für Anfänger am einfachsten ist, damit zu arbeiten.
Synchronisierungsfrequenz
Wir müssen crontab
durch Schreiben eines Befehls festlegen , wie oft unser Skript ausgeführt werden soll und wo sich das Skript im lokalen Dateisystem befindet. Das Format für diesen Befehl lautet wie folgt:
mh dom mon dow Befehl
Mit dem folgenden Befehl wird konfiguriert crontab
, dass das sync.sh
Skript jede Stunde ausgeführt wird (angegeben über die Parameter Minute: 0 und Stunde: *) und die Ausgabe des Skripts an eine sync.log
Datei in unserem s3
Verzeichnis weitergeleitet wird:
0 * * * * /home/ubuntu/s3/sync.sh> /home/ubuntu/s3/sync.log
Sie sollten diese Zeile am Ende der crontab
Datei hinzufügen, die Sie bearbeiten. Speichern Sie dann die Datei auf der Festplatte, indem Sie Strg + W und dann die Eingabetaste drücken . Sie können dann beenden, nano
indem Sie Strg + X drücken . crontab
führt nun stündlich die Synchronisierungsaufgabe aus.
Pro-Tipp: Sie können überprüfen, ob der stündliche Cron-Job erfolgreich ausgeführt wird /home/ubuntu/s3/sync.log
, indem Sie den Inhalt auf Datum und Uhrzeit der Ausführung überprüfen und die Protokolle überprüfen, um festzustellen, welche neuen Dateien synchronisiert wurden.
Alles bereit! Ihr S3-Bucket wird jetzt stündlich automatisch mit Ihrem EC2-Server synchronisiert, und Sie sollten bereit sein. Beachten Sie, dass Sie mit der Zeit, wenn Ihr S3-Bucket größer wird, möglicherweise die EBS-Volume-Größe Ihres EC2-Servers erhöhen müssen, um neue Dateien aufzunehmen. Sie können die Größe Ihres EBS-Volumes jederzeit erhöhen, indem Sie diese Anleitung befolgen .