Saya mencoba melakukan "hello world" dengan klien boto3 baru untuk AWS.
Use-case yang saya miliki cukup sederhana: dapatkan objek dari S3 dan simpan ke file.
Dalam boto 2.XI akan melakukannya seperti ini:
import boto
key = boto.connect_s3().get_bucket('foo').get_key('foo')
key.get_contents_to_filename('/tmp/foo')
Dalam boto 3. Saya tidak dapat menemukan cara bersih untuk melakukan hal yang sama, jadi saya mengulangi secara manual objek "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)
atau
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)
Dan itu bekerja dengan baik. Saya bertanya-tanya apakah ada fungsi "asli" boto3 yang akan melakukan tugas yang sama?
upload_file
metode ini akan secara otomatis menggunakan unggahan multi bagian untuk file besar.boto3 sekarang memiliki antarmuka yang lebih bagus daripada klien:
Ini dengan sendirinya tidak jauh lebih baik daripada
client
dalam jawaban yang diterima (meskipun dokumen mengatakan bahwa itu melakukan pekerjaan yang lebih baik mencoba mengunggah unggahan dan unduhan pada kegagalan) tetapi mengingat bahwa sumber daya umumnya lebih ergonomis (misalnya, ember s3 dan sumber daya objek lebih bagus daripada metode klien) ini memungkinkan Anda untuk tetap berada di lapisan sumber daya tanpa harus drop down.Resources
umumnya dapat dibuat dengan cara yang sama seperti klien, dan mereka mengambil semua atau sebagian besar argumen yang sama dan hanya meneruskannya ke klien internal mereka.sumber
my_bucket.upload_file()
(ataumy_bucket.upload_fileobj()
jika Anda memiliki objek BytesIO).resource
melakukan pekerjaan yang lebih baik dalam mencoba ulang? Saya tidak dapat menemukan indikasi seperti itu.Bagi Anda yang ingin mensimulasikan
set_contents_from_string
metode boto2 seperti, Anda dapat mencobaUntuk Python3:
Dalam python3 baik StringIO dan cStringIO hilang . Gunakan
StringIO
impor seperti:Untuk mendukung kedua versi:
sumber
sumber
aws configure
perintah awscli dan mereka akan ditemukan secara otomatis olehbotocore
.Saat Anda ingin membaca file dengan konfigurasi yang berbeda dari yang standar, jangan ragu untuk menggunakan
mpu.aws.s3_download(s3path, destination)
kode yang disalin secara langsung atau yang disalin:sumber
NameError: name '_s3_path_split' is not defined
Catatan: Saya berasumsi Anda telah mengonfigurasi otentikasi secara terpisah. Kode di bawah ini untuk mengunduh objek tunggal dari bucket S3.
sumber