web-dev-qa-db-fra.com

Comment copier des fichiers de plus de 5 Go dans Amazon S3?

La documentation relative à l'API Amazon S3 REST indique qu'il existe une limite de taille de 5 Go pour le téléchargement dans une opération PUT. Les fichiers plus volumineux doivent être téléchargés à l'aide de plusieurs parties. Bien.

Cependant, ce dont j'ai essentiellement besoin, c'est de renommer des fichiers plus volumineux. Autant que je sache, il n'y a pas d'opération de changement de nom ou de déplacement, je dois donc copier le fichier dans le nouvel emplacement et supprimer l'ancien. Comment fait-on exactement avec des fichiers de plus de 5 Go? Je dois effectuer un téléchargement en plusieurs parties du seau vers lui-même? Dans ce cas, comment diviser le fichier en plusieurs parties?

D'après la lecture du code source de boto, il ne semble pas que cela se produise automatiquement pour les fichiers de plus de 5 Go. Existe-t-il un support intégré que j'ai manqué?

22
Pedro Werneck

Autant que je sache, il n'y a pas d'opération de changement de nom ou de déplacement, il me faut donc Pour copier le fichier dans le nouvel emplacement et supprimer l'ancien.

C’est exact, c’est assez facile à faire pour les objets/fichiers de moins de 5 Go au moyen d’une opération Objet PUT - Copier , suivie d’une opération DELETE Object (les deux étant pris en charge dans boto bien sûr, voir copy_key () et delete_key () ):

Cette implémentation de l'opération PUT crée une copie d'un objet Déjà stocké dans Amazon S3. Une opération de copie PUT est identique À l’exécution d’une opération GET, puis d’une opération PUT. L'ajout de l'en-tête de la demande, X-amz-copy-source, permet à l'opération PUT de copier l'objet source dans le compartiment .

Cependant, cela n’est en effet pas possible pour les objets/fichiers de plus de 5 Go:

Note
[...] Vous créez une copie de votre objet d'une taille maximale de 5 Go en une seule opération atomique À l'aide de cette API. Toutefois, pour copier un objet supérieur à 5 Go, vous devez utiliser l'API de téléchargement en plusieurs parties . Pour des informations conceptuelles [...], accédez à Chargement d'objets à l'aide de la procédure de téléchargement multipart [...] [emphasis mien]

Boto, quant à lui, prend également en charge cette opération au moyen de la méthode copy_part_from_key () ; malheureusement, l'approche requise n'est pas documentée en dehors de la demande pull respective # 425 (autorise les commandes de copie en plusieurs parties) (je n'ai pas encore essayé moi-même):

import boto
s3 = boto.connect_s3('access', 'secret')
b = s3.get_bucket('destination_bucket')
mp = b.initiate_multipart_upload('tmp/large-copy-test.mp4')
mp.copy_part_from_key('source_bucket', 'path/to/source/key', 1, 0, 999999999)
mp.copy_part_from_key('source_bucket', 'path/to/source/key', 2, 1000000000, 1999999999)
mp.copy_part_from_key('source_bucket', 'path/to/source/key', 3, 2000000000, 2999999999)
mp.copy_part_from_key('source_bucket', 'path/to/source/key', 4, 3000000000, 3999999999)
mp.copy_part_from_key('source_bucket', 'path/to/source/key', 5, 4000000000, 4999999999)
mp.copy_part_from_key('source_bucket', 'path/to/source/key', 6, 5000000000, 5500345712)
mp.complete_upload()

Vous voudrez peut-être étudier les exemples respectifs sur la manière de réaliser cela dans Java ou .NET, ce qui pourrait fournir une meilleure idée de l'approche générale, voir Copie d'objets à l'aide de l'API de téléchargement multipart .

Bonne chance!


Appendice

S'il vous plaît être conscient de la particularité suivante concernant la copie en général, qui est facilement négligé:

Lors de la copie d'un objet, vous pouvez conserver la plupart des métadonnées (Par défaut) ou spécifier de nouvelles métadonnées. Toutefois, la liste de contrôle d'accès n'est pas conservée Et est définie sur privé pour l'utilisateur à l'origine de la demande . Pour remplacer le paramètre par défaut de , Utilisez l'en-tête x-amz-acl pour spécifier une nouvelle liste de contrôle d'accès Lors de la génération d'une demande de copie. Pour plus d'informations, consultez les listes de contrôle d'accès Amazon S3 . [emphasis mien]

23
Steffen Opel

Ce qui précède était sur le point de fonctionner, aurait malheureusement dû se terminer par mp.complete_upload() Au lieu de la typo upload_complete()!

J'ai ajouté un script de copie multipart s3 de boto s3 ici, basé sur l'exemple AWS Java et testé avec des fichiers de plus de 5 GiB:

https://Gist.github.com/joshuadfranklin/5130355

10
joshuadfranklin

J'ai trouvé cette méthode pour télécharger des fichiers plus gros que 5gigs et l'ai modifiée pour fonctionner avec une procédure de copie Boto. voici l'original: http://boto.cloudhackers.com/en/latest/s3_tut.html

import math
from boto.s3.connection import S3Connection
from boto.exception import S3ResponseError


conn = S3Connection(Host=[your_Host], aws_access_key_id=[your_access_key],
                    aws_secret_access_key=[your_secret_access_key])

from_bucket = conn.get_bucket('your_from_bucket_name')
key = from_bucket.lookup('my_key_name')
dest_bucket = conn.get_bucket('your_to_bucket_name')

total_bytes = key.size
bytes_per_chunk = 500000000

chunks_count = int(math.ceil(total_bytes/float(bytes_per_chunk)))
file_upload = dest_bucket.initiate_multipart_upload(key.name)
for i in range(chunks_count):
    offset = i * bytes_per_chunk
    remaining_bytes = total_bytes - offset
    print(str(remaining_bytes))
    next_byte_chunk = min([bytes_per_chunk, remaining_bytes])
    part_number = i + 1
    file_upload.copy_part_from_key(dest_bucket.name, key.name, part_number,
                                   offset, offset + next_byte_chunk - 1)
file_upload.complete_upload()
0
Matt Farguson