2017-10-10 13 views
0

Existe-t-il un moyen de ligne de commande pour restaurer des données à partir de Glacier? Jusqu'à présent, j'ai essayé:Restauration de données à partir d'Amazon Glacier

s3cmd restore --recursive s3://mybucketname/folder/ 

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

Mais, aucune aide là-bas. PS: Je sais que nous pouvons le faire via la console.

+0

Quand vous dites "pas d'aide ici", qu'est-ce que tu veux dire? La commande a-t-elle échoué? At-il réussi, mais vous ne pouvez pas trouver l'objet S3? Vous devez savoir, d'après la documentation, que le temps de récupération standard des glaciers est généralement de 3 à 5 heures, à moins que vous ne demandiez à être accéléré (dans ce cas, vous payez plus). – jarmod

Répondre

0

Malheureusement, ce n'est pas possible. Vous pouvez accéder aux objets qui ont été archivés sur Amazon Glacier uniquement à l'aide d'Amazon S3.

Référez: http://docs.aws.amazon.com/AmazonS3/latest/user-guide/restore-archived-objects.html

+0

Oui, je suis conscient de cette façon particulière. Cependant, même via la console, la limitation est, que vous ne pouvez pas restaurer le dossier. La restauration est au niveau de l'objet et non au niveau du compartiment. Ce que je crois n'est pas un bon moyen de le faire. –

+0

S3 n'a pas de dossiers. Un dossier est un concept logique et non quelque chose qui existe réellement dans S3. Tous les objets dans S3 sont juste des clés dans un espace de nom plat. Le fait que les dossiers apparaissent est simplement un concept logique utilisant le caractère de nom de fichier "/" comme séparateur dans le logiciel client. –

-1

Vous pouvez utiliser le code python ci-dessous pour restaurer les données de glacier s3.

import boto3, botocore 
import subprocess, os, shutil, tempfile, argparse, sys, time, codecs 
from pprint import pprint 

sys.stdout = codecs.getwriter('utf8')(sys.stdout) 

parser = argparse.ArgumentParser() 
parser.add_argument('--max-rate-mb', action='store', type=int, default=10000, help='The maximum rate in MB/h to restore files at. Files larger than this will not be restored.') 
parser.add_argument('--restore-days', action='store', type=int, default=30, help='How many days restored objects will remain in S3.') 
parser.add_argument('--restore-path', action='store', help='The bucket/prefix to restore from') 
parser.add_argument('--pretend', action='store_true', help='Do not execute restores') 
parser.add_argument('--estimate', action='store_true', help='When pretending, do not check for already-restored files') 
args = parser.parse_args() 

if not args.restore_path: 
    print 'No restore path specified.' 
    sys.exit(1) 

BUCKET = None 
PREFIX = None 
if '/' in args.restore_path: 
    BUCKET, PREFIX = args.restore_path.split('/',1) 
else: 
    BUCKET = args.restore_path 
    PREFIX = '' 

RATE_LIMIT_BYTES = args.max_rate_mb * 1024 * 1024 

s3 = boto3.Session(aws_access_key_id='<ACCESS_KEY>', aws_secret_access_key='<SECRET_KEY>').resource('s3') 
bucket = s3.Bucket(BUCKET) 

totalsize = 0 
objects = [] 

objcount = 0 
for objpage in bucket.objects.filter(Prefix=PREFIX).page_size(100).pages(): 
    for obj in objpage: 
     objcount += 1 
     print obj 
     objects.append(obj) 
    print u'Found {} objects.'.format(objcount) 
print 

objects.sort(key=lambda x: x.size, reverse=True) 

objects = filter(lambda x: x.storage_class == 'GLACIER', objects) 

if objects: 
    obj = objects[0] 
    print u'The largest object found is of {} size: {:14,d} {:1s} {}'.format(('a restorable' if obj.size <= RATE_LIMIT_BYTES else 'an UNRESTORABLE'), obj.size, obj.storage_class[0], obj.key) 
    print 

while objects: 
    current_set = [] 
    current_set_total = 0 
    unreported_unrestoreable_objects = [] 
    i = 0 
    while i < len(objects): 
     obj = objects[i] 

     if obj.size > RATE_LIMIT_BYTES: 
      unreported_unrestoreable_objects.append(obj) 
     elif unreported_unrestoreable_objects: 
      # No longer accumulating these. Print the ones we found. 
      print u'Some objects could not be restored due to exceeding the hourly rate limit:' 
      for obj in unreported_unrestoreable_objects: 
       print u'- {:14,d} {:1s} {}'.format(obj.size, obj.storage_class[0], obj.key) 
      print 

     if current_set_total + obj.size <= RATE_LIMIT_BYTES: 
      if not args.pretend or not args.estimate: 
       if obj.Object().restore is not None: 
        objects.pop(i) 
        continue 
      current_set.append(obj) 
      current_set_total += obj.size 
      objects.pop(i) 
      continue 
     i += 1 

    for obj in current_set: 
     print u'{:14,d} {:1s} {}'.format(obj.size, obj.storage_class[0], obj.key) 
     #pprint(obj.Object().restore) 
     if not args.pretend: 
      obj.restore_object(RestoreRequest={'Days': args.restore_days}) 
     #sys.exit(0) 

    print u'{:s} Requested restore of {:d} objects consisting of {:,d} bytes. {:d} objects remaining. {:,d} bytes of hourly restore rate wasted'.format(time.strftime('%Y-%m-%d %H:%M:%S'), len(current_set), current_set_total, len(objects), RATE_LIMIT_BYTES - current_set_total) 
    print 
    if not objects: 
     break 
    if not args.pretend: 
     time.sleep(3690) 

Command pour exécuter le script:

python restore_glacier_data_to_s3.py --restore-path s3-bucket-name/folder-name/ 
+0

Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et fournir le lien pour référence. Les réponses à lien uniquement peuvent devenir invalides si la page liée change. - [De l'examen] (/ review/low-quality-posts/17930206) – Maraboc