web-dev-qa-db-fra.com

Comment restaurer des dossiers (ou des compartiments entiers) sur Amazon S3 à partir de Glacier?

J'ai changé le cycle de vie de plusieurs de mes compartiments sur Amazon S3, de sorte que leur classe de stockage a été définie sur Glacier. Je l'ai fait à l'aide de la console AWS en ligne. J'ai maintenant besoin de ces fichiers à nouveau. 

Je sais comment les restaurer sur S3 par fichier. Mais mes seaux contiennent des milliers de fichiers. Je voulais voir s'il y avait un moyen de restaurer tout le seau sur S3, tout comme il y avait un moyen d'envoyer tout le seau à Glacier? 

Je suppose qu'il y a un moyen de programmer une solution. Mais je voulais voir s'il y avait un moyen de le faire dans la console. Ou avec un autre programme? Ou quelque chose d'autre pourrait me manquer?

29
TylerW

Il n'y a pas d'outil intégré pour cela. Les "dossiers" dans S3 sont une illusion pour le confort de l'homme, basés sur des barres obliques dans la clé d'objet (chemin/nom de fichier) et chaque objet migrant vers glacier doit être restauré individuellement ...

Bien entendu, vous pouvez écrire un script pour parcourir la hiérarchie et envoyer ces demandes de restauration à l'aide du SDK ou de l'API REST dans le langage de programmation de votre choix.

Assurez-vous de bien comprendre comment fonctionne la restauration d'un glacier en S3 avant de poursuivre. Il ne s’agit toujours que d’une restauration temporaire, et vous choisissez le nombre de jours pendant lesquels chaque objet persistera dans S3 avant de redevenir stocké uniquement sur glacier.

En outre, vous voulez être certain de bien comprendre les frais de pénalité pour la restauration de trop de données de glacier sur une courte période, ou vous pourriez être confronté à des dépenses inattendues. En fonction de l'urgence, vous souhaiterez peut-être étendre l'opération de restauration sur plusieurs jours ou plusieurs semaines. 

11
Michael - sqlbot

Si vous utilisez s3cmd, vous pouvez l’utiliser pour restaurer assez facilement:

s3cmd restore --recursive s3://mybucketname/ 

Je l'ai également utilisé pour restaurer uniquement des dossiers:

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

Si vous utilisez l'outil AWS CLI (c'est agréable, vous devriez), vous pouvez le faire comme ceci:

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

Remplacez <bucket_name> par le nom du compartiment de votre choix.

Remplacez <days> par le nombre de jours pour lequel vous souhaitez restaurer l'objet.

29
dustinmm80

Les réponses ci-dessus ne fonctionnaient pas bien pour moi car mon seau était mélangé avec des objets sur Glacier et d'autres non. La chose la plus simple pour moi était de créer une liste d'objets all GLACIER dans le compartiment, puis d'essayer de les restaurer individuellement, en ignorant les erreurs éventuelles (telles que celles en cours, pas un objet, etc.). 

  1. Obtenez une liste de tous les fichiers GLACIER (clés) dans le compartiment

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

  2. Créez un script shell et exécutez-le en remplaçant votre "nom de compartiment".

    #!/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
    

Le crédit va à Josh à http://capnjosh.com/blog/a-client-error-invalidobjectstate-occumed-when-calling-the-copyobject-operation-operation-operation-is-not-valid-for-the-source -objects-storage-class/ , une ressource que j'ai trouvée après avoir essayé certaines des solutions ci-dessus.

9
Domenic D.

J'ai récemment eu besoin de restaurer un seau entier et tous ses fichiers et dossiers. Vous aurez besoin des outils s3cmd et aws cli configurés avec vos informations d'identification pour exécuter cette opération.

J'ai trouvé cela assez robuste pour gérer les erreurs avec des objets spécifiques dans le compartiment qui ont peut-être déjà eu une demande de restauration.

#!/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.

Voici ma version de l'interface aws cli et comment restaurer les données de glacier. J'ai modifié certains des exemples ci-dessus pour que la clé des fichiers à restaurer contienne des espaces.

# 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

Il semble que S3 Browser puisse "restaurer à partir de Glacier" au niveau du dossier, mais pas au niveau du compartiment. La seule chose est que vous devez acheter la version Pro. Donc pas la meilleure solution.

2
TylerW

Une variante de la réponse de Dustin à utiliser AWS CLI, mais à utiliser récursivité et pipe pour éviter les erreurs (comme si certains objets avaient déjà demandé une restauration ...)

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

Le bit d'écho xargs génère une liste de commandes "aws s3api restore-object" et vous pouvez continuer en cas d'erreur en envoyant shout à sh.

NOTE: Le paquet Ubuntu 14.04 aws-cli est vieux. Pour utiliser --recursive, vous aurez besoin de installer via github.

POSTSCRIPT: Les restaurations sur glacier peuvent coûter très vite très cher. En fonction de votre cas d'utilisation, vous pouvez trouver le niveau d'accès peu fréquent plus approprié. AWS ont une bonne explication des différents niveaux.

1
dannyman

Une autre façon est clone. Cet outil peut synchroniser/copier/transmettre des données (comme nous pourrions le faire avec des fichiers). https://rclone.org/faq/#can-rclone-sync-directly-from-drive-to-s3 (l'exemple de lien concerne Google Drive, mais il est agnostique). Mais comme Michael - sqlbot a dit, un serveur ou un conteneur doit démarrer l’opération de synchronisation/sauvegarde quelque part.

0
MouIdri