wake-up-neo.net

Wiederherstellen von Ordnern (oder gesamten Buckets) in Amazon S3 von Glacier?

Ich habe den Lebenszyklus für eine Reihe meiner Eimer unter Amazon S3 geändert, sodass die Speicherklasse auf Glacier gesetzt wurde. Ich habe dies mit der Online-AWS-Konsole gemacht. Ich brauche diese Dateien jetzt wieder. 

Ich weiß, wie ich sie per Datei auf S3 zurückspeichern kann. Aber meine Eimer haben Tausende von Dateien. Ich wollte herausfinden, ob es einen Weg gibt, den gesamten Eimer wieder in S3 wiederherzustellen, genauso wie es einen Weg gab, den gesamten Eimer nach Glacier zu schicken? 

Ich vermute, es gibt eine Möglichkeit, eine Lösung zu programmieren. Aber ich wollte wissen, ob es in der Konsole einen Weg gibt, dies zu tun. Oder mit einem anderen Programm? Oder fehlt mir noch etwas?

29
TylerW

Dafür gibt es kein integriertes Werkzeug. "Ordner" in S3 sind eine Illusion für die menschliche Bequemlichkeit, basierend auf Schrägstrichen im Objektschlüssel (Pfad/Dateiname) und jedes Objekt, das zum Gletscher migriert, muss einzeln wiederhergestellt werden, obwohl ...

Natürlich können Sie ein Skript schreiben, um die Hierarchie zu durchlaufen und diese Wiederherstellungsanforderungen mit Hilfe der SDKs oder der API REST in der gewünschten Programmiersprache zu senden.

Stellen Sie sicher, dass Sie verstehen, wie die Wiederherstellung vom Gletscher in S3 funktioniert, bevor Sie fortfahren. Es handelt sich immer nur um eine temporäre Wiederherstellung, und Sie wählen die Anzahl der Tage, die jedes Objekt in S3 beibehalten wird, bevor es wieder nur im Gletscher gespeichert wird.

Außerdem möchten Sie sicher sein, dass Sie die Strafgebühren für das Wiederherstellen zu vieler Gletscherdaten in kurzer Zeit verstehen. Andernfalls könnten unerwartete Kosten anfallen. Je nach Dringlichkeit möchten Sie möglicherweise die Wiederherstellung über Tage oder Wochen verteilen. 

11

Wenn Sie s3cmd verwenden, können Sie es ziemlich einfach rekursiv wiederherstellen:

s3cmd restore --recursive s3://mybucketname/ 

Ich habe es auch verwendet, um nur Ordner wiederherzustellen:

s3cmd restore --recursive s3://mybucketname/folder/
48
Nate Fox

Wenn Sie das AWS CLI-Tool verwenden (es ist Nice, sollten Sie), können Sie dies folgendermaßen tun:

aws s3 ls s3://<bucket_name> | awk '{print $4}' | xargs -L 1 aws s3api restore-object --restore-request Days=<days> --bucket <bucket_name> --key

Ersetzen Sie <bucket_name> durch den gewünschten Bucket-Namen.

Ersetzen Sie <days> durch die Anzahl der Tage, für die Sie das Objekt wiederherstellen möchten.

29
dustinmm80

Die obigen Antworten funktionierten nicht gut für mich, weil mein Eimer mit Objekten auf Glacier vermischt war und einige nicht. Für mich war es am einfachsten, eine Liste der all GLACIER-Objekte im Bucket zu erstellen, dann zu versuchen, jedes einzeln wiederherzustellen und dabei alle Fehler zu ignorieren (wie bereits in Bearbeitung, kein Objekt usw.). 

  1. Holen Sie sich eine Liste aller GLACIER-Dateien (Schlüssel) im Bucket

    aws s3api list-objects-v2 --bucket <bucketName> --query "Contents[?StorageClass=='GLACIER']" --output text | awk '{print $2}' > glacier-restore.txt

  2. Erstellen Sie ein Shell-Skript und führen Sie es aus, indem Sie Ihren "bucketName" ersetzen.

    #!/bin/sh
    
    for x in `cat glacier-restore.txt`
      do
        echo "Begin restoring $x"
        aws s3api restore-object --restore-request Days=7 --bucket <bucketName> <bucketName> --key "$x"
        echo "Done restoring $x"
      done
    

Die Gutschrift geht an Josh unter http://capnjosh.com/blog/a-client-error-invalidobjectstate-occurret-wenn-calling-the-copyobject-operation-operation-isnot-valid-for-the-source -objects-storage-class/ , eine Ressource, die ich nach dem Ausprobieren einiger der oben genannten Lösungen gefunden habe.

9
Domenic D.

Ich musste vor kurzem einen ganzen Bucket und all seine Dateien und Ordner wiederherstellen. Sie benötigen s3cmd- und aws-cli-Tools, die mit Ihren Anmeldeinformationen konfiguriert sind, um dies auszuführen.

Ich habe festgestellt, dass dies ziemlich robust ist, um Fehler mit bestimmten Objekten im Bucket zu behandeln, die möglicherweise bereits eine Wiederherstellungsanforderung hatten.

#!/bin/sh

# This will give you a Nice list of all objects in the bucket with the bucket name stripped out
s3cmd ls -r s3://<your-bucket-name> | awk '{print $4}' | sed 's#s3://<your-bucket-name>/##' > glacier-restore.txt

for x in `cat glacier-restore.txt`
do
    echo "restoring $x"
    aws s3api restore-object --restore-request Days=7 --bucket <your-bucket-name> --profile <your-aws-credentials-profile> --key "$x"
done
4
SR.

Hier ist meine Version der aws cli-Schnittstelle und wie Daten vom Gletscher wiederhergestellt werden. Ich habe einige der obigen Beispiele so geändert, dass sie funktionieren, wenn der Schlüssel der wiederherzustellenden Dateien Leerzeichen enthält.

# Parameters
BUCKET="my-bucket" # the bucket you want to restore, no s3:// no slashes
BPATH="path/in/bucket/" # the objects prefix you wish to restore (mind the `/`) 
DAYS=1 # For how many days you wish to restore the data.

# Restore the objects
aws s3 ls s3://{BUCKET}/${BPATH} --recursive | \
awk '{out=""; for(i=4;i<=NF;i++){out=out" "$i}; print out}'| \
xargs -I {} aws s3api restore-object --restore-request Days={DAYS} \
--bucket {BUCKET} --key "{}"
4
Stanislav

Es sieht so aus, als ob der S3-Browser auf Ordnerebene "von Glacier wiederherstellen" kann, aber nicht auf Bucket-Ebene. Sie müssen nur die Pro-Version kaufen. Also nicht die beste Lösung.

2
TylerW

Eine Variation der Antwort von Dustin, AWS CLI zu verwenden, aber Rekursion und Pipe to sh verwenden, um Fehler zu überspringen (wie wenn einige Objekte bereits eine Wiederherstellung angefordert haben ...)

BUCKET=my-bucket
BPATH=/path/in/bucket
DAYS=1
aws s3 ls s3://$BUCKET$BPATH --recursive | awk '{print $4}' | xargs -L 1 \
 echo aws s3api restore-object --restore-request Days=$DAYS \
 --bucket $BUCKET --key | sh

Das xargs-Echo-Bit generiert eine Liste von Befehlen "aws s3api restore-object". Wenn Sie das an sh weiterleiten, können Sie bei einem Fehler weitermachen.

HINWEIS: Das Ubuntu 14.04-Paket aws-cli ist alt. Um --recursive verwenden zu können, müssen Sie über github installieren.

POSTSCRIPT: Gletscherwiederherstellungen können sehr schnell unerwartet teuer werden. Abhängig von Ihrem Anwendungsfall finden Sie die Stufe für seltenen Zugriff möglicherweise geeigneter. AWS hat eine nette Erklärung der verschiedenen Ebenen.

1
dannyman

Ein anderer Weg ist rclone. Dieses Tool kann Daten synchronisieren/kopieren/pushen (wie es bei Dateien der Fall ist). https://rclone.org/faq/#can-rclone-sync-directly-from-drive-to-s3 (Das Link-Beispiel ist für Google-Laufwerke, dies ist jedoch nicht der Fall). Aber wie Michael-sqlbot sagte, muss ein Server oder ein Container irgendwo den Synchronisierungs-/Sicherungsvorgang starten.

0
MouIdri

Dieser Befehl hat bei mir funktioniert:

aws s3api list-objects-v2 \
--bucket BUCKET_NAME \
--query "Contents[?StorageClass=='GLACIER']" \
--output text | \
awk -F $'\t' '{print $2}' | \
tr '\n' '\0' | \
xargs -L 1 -0 \
aws s3api restore-object \
--restore-request Days=7 \
--bucket BUCKET_NAME \
--key

ProTip

  • Dieser Befehl kann einige Zeit dauern, wenn Sie viele Objekte haben.
  • Halten Sie die Tastenkombination STRG + C/nicht gedrückt, da Sie sonst warten müssen, bis die verarbeiteten Objekte den Status RestoreAlreadyInProgress verlassen, bevor Sie sie erneut ausführen können. Es kann einige Stunden dauern, bis der Staat übergeht. Diese Fehlermeldung wird angezeigt, wenn Sie warten müssen: An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation
0
Jason Leach