web-dev-qa-db-fra.com

Comment déplacer des fichiers entre deux compartiments Amazon S3 à l'aide de boto?

Je dois déplacer des fichiers d'un compartiment à un autre avec l'API Python Boto. (J'en ai besoin pour "couper" le fichier du premier seau et le "coller" dans le second) . Quel est le meilleur moyen de le faire?

** Remarque: Est-ce important si j'ai deux clés d'accès différentes et des clés secrètes?

15
Gal

Je pense que la documentation boto S3 répond à votre question.

https://github.com/boto/boto/blob/develop/docs/source/s3_tut.rst

Le transfert de fichiers d'un compartiment à un autre via boto constitue en réalité une copie des clés d'une source à une autre que la suppression de la clé d'une source.

Vous pouvez avoir accès aux seaux:

import boto

c = boto.connect_s3()
src = c.get_bucket('my_source_bucket')
dst = c.get_bucket('my_destination_bucket')

et itérer les clés:

for k in src.list():
    # copy stuff to your destination here
    dst.copy_key(k.key.name, src.name, k.key.name)
    # then delete the source key
    k.delete()

Voir aussi: Est-il possible de copier tous les fichiers d'un compartiment S3 à un autre avec s3cmd?

18
Freek Wiekmeijer

Si vous utilisez boto3 (la version la plus récente de boto) c'est assez simple

import boto3
s3 = boto3.resource('s3')
copy_source = {
    'Bucket': 'mybucket',
    'Key': 'mykey'
}
s3.meta.client.copy(copy_source, 'otherbucket', 'otherkey')

( Docs )

11
David Arenburg

awscli fait le travail 30 fois plus rapidement que de gérer et supprimer chaque touche. Probablement dû au multithreading dans awscli. Si vous voulez toujours l'exécuter à partir de votre script python sans appeler de commandes Shell, vous pouvez essayer quelque chose comme ça:

Installez le paquet awscli python:

Sudo pip install awscli

Et puis c'est aussi simple que ça:

import os
if os.environ.get('LC_CTYPE', '') == 'UTF-8':
    os.environ['LC_CTYPE'] = 'en_US.UTF-8'

from awscli.clidriver import create_clidriver
driver = create_clidriver()
driver.main('s3 mv source_bucket target_bucket --recursive'.split())
4
Artem Fedosov

Le nom du compartiment doit être une chaîne et non un objet de compartiment . Les modifications ci-dessous ont fonctionné pour moi 

for k in src.list():
    dst.copy_key(k.key, src.name, k.key)
2
SathishVenkat

Si tu veux

Créez une copie d'un objet déjà stocké dans Amazon S3.

then copy_object est le chemin à parcourir dans boto3.

Comment je le fais:

import boto3

aws_access_key_id = ""
aws_secret_access_key = ""
bucket_from = ""
bucket_to = ""
s3 = boto3.resource(
    's3',
    aws_access_key_id=aws_access_key_id,
    aws_secret_access_key=aws_secret_access_key
)
src = s3.Bucket(bucket_from)

def move_files():
    for archive in src.objects.all():
        # filters on archive.key might be applied here

        s3.meta.client.copy_object(
            ACL='public-read',
            Bucket=bucket_to,
            CopySource={'Bucket': bucket_from, 'Key': archive.key},
            Key=archive.key
        )

move_files()
0
Tom Wojcik