J'essaye de faire un "bonjour le monde" avec le nouveau client boto3 pour AWS.
Le cas d'utilisation que j'ai est assez simple: obtenir un objet de S3 et l'enregistrer dans le fichier.
Dans boto 2.X, je le ferais comme ceci:
import boto
key = boto.connect_s3().get_bucket('foo').get_key('foo')
key.get_contents_to_filename('/tmp/foo')
Dans boto 3. Je ne parviens pas à trouver un moyen propre de faire la même chose, donc j'effectue manuellement une itération sur l'objet "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)
ou
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)
Et cela fonctionne très bien. Je me demandais s'il existe une fonction boto3 "native" qui fera la même tâche?
upload_file
méthode utilisera automatiquement les téléchargements en plusieurs parties pour les fichiers volumineux.boto3 a maintenant une interface plus agréable que le client:
Ce n'est pas en soi extrêmement meilleur que la
client
réponse acceptée (bien que la documentation indique que cela fait un meilleur travail en réessayant les téléchargements et les téléchargements en cas d'échec), mais étant donné que les ressources sont généralement plus ergonomiques (par exemple, le seau s3 et les ressources d' objets sont plus agréables que les méthodes clientes) cela vous permet de rester au niveau de la couche de ressources sans avoir à descendre.Resources
peuvent généralement être créés de la même manière que les clients, et ils prennent tous ou la plupart des mêmes arguments et les transmettent simplement à leurs clients internes.la source
my_bucket.upload_file()
(oumy_bucket.upload_fileobj()
si vous avez un objet BytesIO).resource
fait un meilleur travail pour réessayer? Je n'ai pas pu trouver une telle indication.Pour ceux d'entre vous qui souhaitent simuler les
set_contents_from_string
méthodes boto2 similaires, vous pouvez essayerPour Python3:
Dans python3, StringIO et cStringIO ont disparu . Utilisez l'
StringIO
importation comme:Pour prendre en charge les deux versions:
la source
la source
aws configure
commande awscli et ils seront trouvés automatiquement parbotocore
.Lorsque vous souhaitez lire un fichier avec une configuration différente de celle par défaut, n'hésitez pas à utiliser
mpu.aws.s3_download(s3path, destination)
directement ou le code copié:la source
NameError: name '_s3_path_split' is not defined
Remarque: je suppose que vous avez configuré l'authentification séparément. Le code ci-dessous consiste à télécharger l'objet unique à partir du compartiment S3.
la source