Estoy tratando de hacer un "hola mundo" con el nuevo cliente boto3 para AWS.
El caso de uso que tengo es bastante simple: obtener un objeto de S3 y guardarlo en el archivo.
En boto 2.XI lo haría así:
import boto
key = boto.connect_s3().get_bucket('foo').get_key('foo')
key.get_contents_to_filename('/tmp/foo')
En boto 3. No puedo encontrar una manera limpia de hacer lo mismo, así que estoy iterando manualmente sobre el objeto "Streaming":
import boto3
key = boto3.resource('s3').Object('fooo', 'docker/my-image.tar.gz').get()
with open('/tmp/my-image.tar.gz', 'w') as f:
chunk = key['Body'].read(1024*8)
while chunk:
f.write(chunk)
chunk = key['Body'].read(1024*8)
o
import boto3
key = boto3.resource('s3').Object('fooo', 'docker/my-image.tar.gz').get()
with open('/tmp/my-image.tar.gz', 'w') as f:
for chunk in iter(lambda: key['Body'].read(4096), b''):
f.write(chunk)
Y funciona bien. Me preguntaba si hay alguna función boto3 "nativa" que haga la misma tarea.
upload_file
método usará automáticamente cargas de varias partes para archivos grandes.boto3 ahora tiene una mejor interfaz que el cliente:
Esto por sí solo no es tremendamente mejor que
client
en la respuesta aceptada (aunque los documentos dicen que hace un mejor trabajo al volver a intentar cargar y descargar en caso de error), pero teniendo en cuenta que los recursos son generalmente más ergonómicos (por ejemplo, el cubo s3 y los recursos de objeto son mejores que los métodos del cliente), esto le permite permanecer en la capa de recursos sin tener que desplegarse.Resources
generalmente se pueden crear de la misma manera que los clientes, y toman todos o la mayoría de los mismos argumentos y los envían a sus clientes internos.fuente
my_bucket.upload_file()
(omy_bucket.upload_fileobj()
si tiene un objeto BytesIO).resource
hace un mejor trabajo al reintentar? No pude encontrar ninguna indicación.Para aquellos de ustedes que deseen simular los
set_contents_from_string
métodos similares de boto2, pueden intentarPara Python3:
En python3, StringIO y cStringIO se han ido . Use la
StringIO
importación como:Para admitir ambas versiones:
fuente
fuente
aws configure
comando awscli y serán encontrados automáticamente porbotocore
.Cuando desee leer un archivo con una configuración diferente a la predeterminada, siéntase libre de usar
mpu.aws.s3_download(s3path, destination)
directamente o el código copiado:fuente
NameError: name '_s3_path_split' is not defined
Nota: Supongo que ha configurado la autenticación por separado. El siguiente código es descargar el único objeto del depósito S3.
fuente