¿Cómo mover archivos entre dos Amazon S3 Buckets usando boto?

Tengo que mover archivos de una cubeta a otra con la API de Python Boto. (Lo necesito para “Cortar” el archivo del primer Cubo y “Pegarlo” en el segundo). ¿Cuál es la mejor manera de hacer eso?

** Nota: ¿Eso importa si tengo dos CLAVES DE ACCESO y CLAVES SECRETAS?

Creo que la documentación de boto S3 responde a tu pregunta.

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

Mover archivos de un contenedor a otro a través de boto es efectivamente una copia de las claves de origen a destino que eliminar la clave de origen.

Puedes acceder a los cubos:

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

e iterar las claves:

 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() 

Vea también: ¿Es posible copiar todos los archivos de un contenedor S3 a otro con s3cmd?

Si está utilizando boto3 (la versión más nueva de boto) esto es bastante simple

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

( Docs )

awscli hace el trabajo 30 veces más rápido que copiar y borrar cada clave. Probablemente debido a multiproceso en awscli. Si aún desea ejecutarlo desde su script de Python sin llamar a comandos de shell, puede intentar algo como esto:

Instalar el paquete awscli python:

 sudo pip install awscli 

Y entonces es tan simple como esto:

 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()) 

El nombre del cubo debe ser una cadena, no un objeto cubo Debajo de cambio funciono para mi

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

Si quieres

Cree una copia de un objeto que ya esté almacenado en Amazon S3.

entonces copy_object es el camino a seguir en boto3.

Cómo lo hago:

 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() 

Si tienes 2 cubos diferentes con diferentes credenciales de acceso. Almacene las credenciales como corresponda en las credenciales y los archivos de configuración en la carpeta ~ / .aws.

puede usar lo siguiente para copiar el objeto de un grupo con diferentes credenciales y luego guardar el objeto en el otro grupo con diferentes credenciales:

 import boto3 session_src = boto3.session.Session(profile_name=) source_s3_r = session_src.resource('s3') session_dest = boto3.session.Session(profile_name=) dest_s3_r = session_dest.resource('s3') # create a reference to source image old_obj = source_s3_r.Object(,  + ) # create a reference for destination image new_obj = dest_s3_r.Object(, old_obj.key) # upload the image to destination S3 object new_obj.put(Body=old_obj.get()['Body'].read()) 

No es necesario que ambos grupos tengan acceso entre sí en la ACL o en las políticas del grupo.