Sicherungsstrategien für den AWS S3-Bucket

88

Ich suche nach Ratschlägen oder bewährten Methoden zum Sichern des S3-Buckets.
Der Zweck des Sicherns von Daten aus S3 besteht darin, Datenverlust aus folgenden Gründen zu verhindern:

  1. S3 Problem
  2. Problem, bei dem ich diese Daten versehentlich aus S3 lösche

Nach einigen Nachforschungen sehe ich folgende Optionen:

  1. Verwenden Sie die Versionierung http://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html
  2. Kopieren Sie mit dem AWS SDK von einem S3-Bucket in einen anderen
  3. Backup auf Amazon Glacier http://aws.amazon.com/de/glacier/
  4. Sicherung auf dem Produktionsserver, der selbst gesichert wird

Welche Option soll ich wählen und wie sicher wäre es, Daten nur in S3 zu speichern? Möchten Sie Ihre Meinung hören.
Einige nützliche Links:

Sergey Alekseev
quelle
Bitte akzeptieren Sie stackoverflow.com/a/40033265/1586965
samthebest

Antworten:

61

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 s3cmdsah 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.

AWSCLI

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 synclö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 awscliunsere 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

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. awscliDer 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.shDatei 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/awseine Verknüpfung zur awsBinärdatei verwenden, da crontabBefehle in einer eingeschränkten Shell-Umgebung ausgeführt werden und die ausführbare Datei nicht alleine gefunden werden kann.

Stellen chmodSie 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:

sync.sh Ausgabe

Als nächstes bearbeiten wir die aktuellen Benutzer, crontabindem 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, nanoda es für Anfänger am einfachsten ist, damit zu arbeiten.

Synchronisierungsfrequenz

Wir müssen crontabdurch 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.shSkript jede Stunde ausgeführt wird (angegeben über die Parameter Minute: 0 und Stunde: *) und die Ausgabe des Skripts an eine sync.logDatei in unserem s3Verzeichnis weitergeleitet wird:

0 * * * * /home/ubuntu/s3/sync.sh> /home/ubuntu/s3/sync.log

Sie sollten diese Zeile am Ende der crontabDatei 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, nanoindem Sie Strg + X drücken . crontabfü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 .

Elad Nava
quelle
Ich habe eine Frage in Ihrem Blog hinterlassen, aber ich habe mich gefragt, ob es auch eine Möglichkeit gibt, die Metadaten zu synchronisieren.
Devology Ltd
@ Devology Ltd, Leider hatte ich keine Gelegenheit, mit S3-Objektmetadaten zu arbeiten. Aus einer schnellen Google-Suche geht hervor, dass die awscliUnterstützung dies nicht automatisch im aws s3 syncBefehl synchronisiert . Es sieht so aus, als müssten Sie dies möglicherweise manuell implementieren.
Elad Nava
Vielen Dank an Ekad Nava. Ich weiß es zu schätzen, dass Sie bestätigt haben, was meiner Meinung nach der Fall war.
Devology Ltd
1
Das ist fantastisch @EladNava, danke fürs Teilen, immer noch relevant für 2020!
user1130176
Diese Antwort passt nicht, wenn Sie Millionen von Dateien darin haben. Es wird sehr teuer, langsam und manchmal unmöglich - aufgrund der Einschränkungen des Dateisystems.
Psychozoikum
29

Unter Berücksichtigung des zugehörigen Links, der erklärt, dass S3 eine Haltbarkeit von 99,999999999% hat, würde ich Ihr Anliegen Nr. 1 verwerfen. Ernsthaft.

Wenn # 2 ein gültiger Anwendungsfall ist und ein echtes Problem für Sie darstellt, würde ich mich definitiv an die Optionen # 1 oder # 3 halten. Welcher von denen? Es kommt wirklich auf einige Fragen an:

  • Benötigen Sie andere Versionsfunktionen oder nur, um versehentliches Überschreiben / Löschen zu vermeiden?
  • Sind die durch die Versionierung verursachten zusätzlichen Kosten erschwinglich?
  • Amazon Glacier is optimized for data that is infrequently accessed and for which retrieval times of several hours are suitable. Passt das für dich?

Wenn Ihr Speicherbedarf nicht wirklich groß ist, würde ich mich an die Bucket-Versionierung halten. Auf diese Weise benötigen Sie keinen zusätzlichen Code / Workflow, um Daten auf Glacier, in anderen Buckets oder sogar auf einem anderen Server zu sichern (was meiner Meinung nach wirklich eine schlechte Wahl ist, bitte vergessen Sie es).

Viccari
quelle
4
@SergeyAlekseev Wenn Glacier für Sie geeignet ist, können Sie sehr schnell eine Lebenszyklusregel für einen Bucket einrichten, der Ihre Dateien automatisch auf dem Glacier archiviert. Sie werden weiterhin in einem Bucket (in der Web-Benutzeroberfläche) angezeigt, aber die Speicherklasse ändert sich von Standard zu Gletscher. Ich verschiebe verarbeitete Dateien aus meinem Haupt-Bucket in einen "Fertig" -Eimer, und auf dem Fertig-Bucket befindet sich die Lebenszyklusregel, die alles archiviert, was älter als 1 Tag ist. Dies sind Datendateien, die ich wahrscheinlich nie wieder anfassen werde, die ich aber für den Client aufbewahren muss.
Dan
25
Ich denke nicht, dass 99,999999999% ein guter Grund genug ist, um einen vollen aws-Stapel für Speicher / Backup zu haben. Ich spreche nicht von den verbleibenden 0,0000000001%, aber mehr, wenn etwas sehr Unerwartetes passiert, ist es unangenehm, wenn Ihr gesamtes Geschäft irgendwo liegt. Unerwartet könnte es sein, dass die USA in ein bestimmtes Land ziehen, Amazon vollständig gehackt wird (vgl. Sony) usw. usw.
Augustin Riedinger
9
Ich werde @AugustinRiedinger in diesem Fall unterstützen: "S3-Problem" kann per Definition etwas sein, das Sie nicht kennen (z. B. Regierungsprobleme), das die Hypothesen ungültig machen könnte, auf denen S3-SLA-Nummern wie 99,99 ... basieren. Wenn Sie langfristig etwas unternehmen, einschließlich der Sicherung Ihrer Daten, ist eine Diversifizierung eine gute Praxis, wenn nicht sogar eine Voraussetzung
lajarre
1
Ich stimme definitiv zu, dass Ihre Punkte gültig sind. Aber basierend auf den Optionen, die das OP bietet (so ziemlich alle, einschließlich AWS-Alternativen zum Problem), denke ich nicht, dass das "S3-Problem" so umfassend wäre, wie Sie es erweitern. Gut, einige breitere Gedanken zu sehen.
Viccari
4
Alte Antwort, aber ich habe das Gefühl, dass ich die jüngsten (-ish) Ereignisse erwähnen muss. "Der Tag, an dem Amazon das Web kaputt gemacht hat", löschte ein Techniker versehentlich einen großen Teil seiner S3-Server. Selbst während dieser 24 Stunden war das Problem die Zugänglichkeit. Kein Datenverlust. Es gab absolut keinen Datenverlust, selbst angesichts der großen Anzahl von Servern, die entfernt wurden, und sie schafften es immer noch, innerhalb ihrer SLA gut zu kommen
Oberst
12

Wie wäre es mit der sofort verfügbaren Funktion zur bereichsübergreifenden Replikation für die S3-Buckets selbst? Hier finden Sie einige nützliche Artikel zu dieser Funktion

Adrian Teh
quelle
Was ist, wenn Sie eine Datei in einer Region löschen, die nicht in der anderen repliziert werden soll?
Michelem
S3 repliziert keine Löschungen. Überprüfen Sie diesen Link docs.aws.amazon.com/AmazonS3/latest/dev/… .
r devrimbaris
12

Sie können Ihre S3-Daten mit den folgenden Methoden sichern

  1. Planen Sie den Sicherungsprozess mithilfe der AWS-Datenleitung. Dies kann auf zwei unten beschriebene Arten erfolgen:

    ein. Verwenden von copyActivity von datapipeline, mit der Sie von einem s3-Bucket in einen anderen s3-Bucket kopieren können.

    b. Verwenden der Befehle ShellActivity of datapipeline und "S3distcp" zum Erstellen der rekursiven Kopie rekursiver s3-Ordner vom Bucket in einen anderen (parallel).

  2. Verwenden Sie die Versionierung im S3-Bucket, um unterschiedliche Datenversionen zu verwalten

  3. Verwenden Sie Gletscher zum Sichern Ihrer Daten (verwenden Sie diese, wenn Sie die Sicherung nicht schnell in den ursprünglichen Buckets wiederherstellen müssen (es dauert einige Zeit, bis die Daten vom Gletscher wiederhergestellt sind, da die Daten im komprimierten Format gespeichert sind) oder wenn Sie sie speichern möchten Diese Option kann leicht mithilfe der Lebenszyklusregel für den S3-Bucket festgelegt werden, für den Sie ein Backup erstellen möchten.

Option 1 bietet Ihnen mehr Sicherheit, wenn Sie beispielsweise versehentlich Ihren ursprünglichen s3-Bucket löschen. Ein weiterer Vorteil besteht darin, dass Sie Ihr Backup in datenweisen Ordnern in einem anderen s3-Bucket speichern können. Auf diese Weise wissen Sie, welche Daten Sie zu einem bestimmten Datum hatten und können Stellen Sie eine bestimmte Datumssicherung wieder her. Es hängt alles von Ihrem Anwendungsfall ab.

Varun
quelle
@ David: Wie David in seiner Lösung unten vorgeschlagen hat, dass es ein Skript geben könnte, das den s3-Bucket täglich oder wöchentlich sichert. Dies kann leicht durch meinen ersten Punkt erreicht werden (AWS-Daten-Pipeline - mit der Sie den Sicherungsprozess täglich planen können , wöchentlich etc.). Ich würde empfehlen, einen Blick auf aws datapipeline zu werfen.
Varun
Dies ist vielversprechend, da es nicht auf veralteten Ansätzen beruht, die sich nicht durch die optimale Nutzung der Cloud auszeichnen (sprich: crons). Data Pipeline verfügt auch über automatisierte Wiederholungsversuche und ist ein verwalteter (serverloser) Dienst.
Felipe Alvarez
9

Sie würden denken, dass es jetzt eine einfachere Möglichkeit gibt, nur inkrementelle Sicherungen für eine Diff-Region durchzuführen.

Alle oben genannten Vorschläge sind keine wirklich einfachen oder eleganten Lösungen. Ich halte Gletscher nicht wirklich für eine Option, da ich denke, dass dies eher eine Archivierungslösung als eine Sicherungslösung ist. Wenn ich an Backup denke, denke ich an Disaster Recovery von einem Junior-Entwickler, der rekursiv einen Bucket oder einen Exploit oder Fehler in Ihrer App löscht, der Inhalte aus s3 löscht.

Für mich wäre die beste Lösung ein Skript, das nur einen Bucket in einer anderen Region sichert, einen täglich und einen wöchentlich, sodass Sie, wenn etwas Schreckliches passiert, einfach die Region wechseln können. Ich habe kein solches Setup, ich habe mich nur darum gekümmert, es zu tun, weil es ein bisschen Mühe kosten würde, dies zu tun, weshalb ich mir wünschte, es gäbe eine Standardlösung, die verwendet werden könnte.

David
quelle
Einverstanden. Es ist interessant, wenn Sie sich mit S3 beschäftigen (sogar mit CRR - integrierter Replikation), dass es große Lücken für die Notfallwiederherstellung gibt. Sie können beispielsweise niemals einen Bucket, die Dateiversionshistorien, die Metadaten (insbesondere die letzten Änderungsdaten) usw. wiederherstellen. Alle derzeit verfügbaren Wiederherstellungsszenarien sind Teilwiederherstellungen.
Paul Jowett
7

Während diese Frage vor einiger Zeit gestellt wurde, hielt ich es für wichtig, den MFA-Löschschutz bei den anderen Lösungen zu erwähnen . Das OP versucht, das versehentliche Löschen von Daten zu beheben. Die Multi-Faktor-Authentifizierung (MFA) manifestiert sich hier in zwei verschiedenen Szenarien:

  1. Objektversionen dauerhaft löschen - Aktivieren Sie die MFA-Löschung für die Versionierung des Buckets.

  2. Versehentliches Löschen des Buckets selbst - Richten Sie eine Bucket-Richtlinie ein, die das Löschen ohne MFA-Authentifizierung verweigert.

In Verbindung mit der bereichsübergreifenden Replikation und Versionierung wird das Risiko eines Datenverlusts verringert und die Wiederherstellungsszenarien verbessert.

Hier ist ein Blog-Beitrag zu diesem Thema mit mehr Details.

user1590603
quelle
0

Wenn ja, haben wir zu viele Daten. Wenn Sie bereits einen Bucket haben, dauert die Synchronisierung beim ersten Mal zu lange. In meinem Fall hatte ich 400 GB. Das erste Mal dauerte es 3 Stunden. Ich denke, wir können das Replikat zu einer guten Lösung für die S3-Bucket-Sicherung machen.

Ankit Kumar Rajpoot
quelle
Ich bin dabei, ungefähr 7 TB in einen Eimer zu verschieben und versuche, die beste Option herauszufinden ... Ich denke, ich brauche etwas Besseres als die Synchronisierung. Ich frage mich, ob die Verwendung einer Pipeline zum Kopieren von Daten in die GCS-Version des Gletschers die beste Gesamtsicherheit bietet.
Brendon Whateley
AWS DataSync könnte hier eine Option sein.
Felipe Alvarez