Estou tentando fazer um "olá mundo" com o novo cliente boto3 para a AWS.
O caso de uso que tenho é bastante simples: obtenha o objeto do S3 e salve-o no arquivo.
No boto 2.XI, seria assim:
import boto
key = boto.connect_s3().get_bucket('foo').get_key('foo')
key.get_contents_to_filename('/tmp/foo')
Na foto 3. Não consigo encontrar uma maneira limpa de fazer a mesma coisa, por isso estou repetindo manualmente o 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)
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)
E isso funciona bem. Eu queria saber se existe alguma função "nativa" do boto3 que fará a mesma tarefa?
upload_file
método usará automaticamente envios de várias partes para arquivos grandes.O boto3 agora possui uma interface mais agradável que o cliente:
Isso por si só não é tremendamente melhor do que o
client
da resposta aceita (embora os documentos digam que ele faz um trabalho melhor ao tentar fazer upload e downloads em caso de falha), mas considerando que os recursos geralmente são mais ergonômicos (por exemplo, os recursos de bucket e objeto s3 são mais agradáveis que os métodos do cliente), isso permite que você permaneça na camada de recursos sem precisar descer.Resources
Geralmente, eles podem ser criados da mesma maneira que os clientes, e eles pegam todos ou quase todos os mesmos argumentos e os encaminham para seus clientes internos.fonte
my_bucket.upload_file()
(oumy_bucket.upload_fileobj()
se você tiver um objeto BytesIO).resource
faz um trabalho melhor ao tentar novamente? Não consegui encontrar nenhuma indicação desse tipo.Para aqueles que gostariam de simular os
set_contents_from_string
métodos boto2 like, você pode tentarPara Python3:
No python3, o StringIO e o cStringIO se foram . Use a
StringIO
importação como:Para suportar as duas versões:
fonte
fonte
aws configure
comando awscli e serão encontrados automaticamente porbotocore
.Quando você quiser ler um arquivo com uma configuração diferente da padrão, fique à vontade para usar
mpu.aws.s3_download(s3path, destination)
diretamente ou o código copiado e colado:fonte
NameError: name '_s3_path_split' is not defined
Nota: Suponho que você configurou a autenticação separadamente. O código abaixo é para baixar o objeto único do bucket S3.
fonte