amazon-web-services - tier - s3 standard infrequent access s3 standard ia storage




Come ripristinare cartelle(o interi bucket) su Amazon S3 da Glacier? (6)

Ho modificato il ciclo di vita di alcuni dei miei bucket su Amazon S3, quindi la loro classe di archiviazione era impostata su Glacier. L'ho fatto usando la console AWS online. Ora ho bisogno di quei file di nuovo.

So come ripristinarli su S3 per file. Ma i miei secchi hanno migliaia di file. Volevo vedere se c'era un modo per ripristinare l'intero secchio su S3, proprio come c'era un modo per inviare l'intero secchio a Glacier?

Immagino che ci sia un modo per programmare una soluzione. Ma volevo vedere se c'era un modo per farlo nella console. O con un altro programma? O qualcos'altro che potrei mancare?


Ecco la mia versione dell'interfaccia di aws cli e come ripristinare i dati dal ghiacciaio. Ho modificato alcuni degli esempi precedenti per funzionare quando la chiave dei file da ripristinare contiene spazi.

# 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 "{}"

Le risposte di cui sopra non hanno funzionato bene perché il mio secchio è stato mescolato con oggetti sul ghiacciaio e altri no. La cosa più facile per me era creare un elenco di tutti gli oggetti GLACIER nel bucket, quindi tentare di ripristinarli individualmente, ignorando eventuali errori (come già in corso, non un oggetto, ecc.).

  1. Ottieni un elenco di tutti i file GLACIER (chiavi) nel secchio

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

  2. Crea uno script di shell ed eseguilo, sostituendo il tuo "bucketName".

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

Il merito va a Josh a http://capnjosh.com/blog/a-client-error-invalidobjectstate-occurred-when-calling-the-copyobject-operation-operation-is-not-valid-for-the-source-objects-storage-class/ , una risorsa che ho trovato dopo aver provato alcune delle soluzioni di cui sopra.


Recentemente ho avuto bisogno di ripristinare un intero bucket e tutti i suoi file e cartelle. Avrai bisogno degli strumenti cli s3cmd e aws configurati con le tue credenziali per eseguirlo.

Ho trovato questo abbastanza robusto per gestire gli errori con oggetti specifici nel bucket che potrebbero avere già una richiesta di ripristino.

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

Se stai usando lo strumento CLI di AWS (è bello, dovresti), puoi farlo in questo modo:

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

Sostituisci <bucket_name> con il nome del bucket che desideri.

Sostituire <days> con il numero di giorni per cui si desidera ripristinare l'oggetto.


Un altro modo è rclone. Questo strumento può sincronizzare / copiare / inviare dati (come potremmo fare con i file). https://rclone.org/faq/#can-rclone-sync-directly-from-drive-to-s3 (l'esempio di link è per google drive, ma questo è agnostico). Ma come ha detto Michael - dice sqlbot, un server o un contenitore deve avviare l'operazione di sincronizzazione / backup da qualche parte.


Una variazione sulla risposta di Dustin per usare la CLI di AWS, ma per usare la ricorsione e pipe to sh per saltare gli errori (come se alcuni oggetti avessero già richiesto il ripristino ...)

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

Il bit echo xargs genera un elenco di comandi "aws s3api restore-object" e, eseguendo il piping su sh, è possibile continuare con l'errore.

NOTA: il pacchetto aws-cli di Ubuntu 14.04 è vecchio. Per utilizzare --recursive devi installare tramite github.

POSTSCRIPT: i ripristini del ghiacciaio possono essere inaspettatamente costosi molto rapidamente. A seconda del caso d'uso, è possibile che il livello di accesso non frequente sia più appropriato. AWS ha una bella spiegazione dei diversi livelli.







amazon-glacier