Я пытаюсь сделать "привет мир" с новым клиентом boto3 для AWS.
У меня довольно простой вариант использования: получить объект из S3 и сохранить его в файл.
В boto 2.X я бы сделал это так:
import boto
key = boto.connect_s3().get_bucket('foo').get_key('foo')
key.get_contents_to_filename('/tmp/foo')
В бото 3. Я не могу найти чистый способ сделать то же самое, поэтому я вручную повторяю объект «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)
или
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)
И работает нормально. Мне было интересно, есть ли «родная» функция boto3, которая будет выполнять ту же задачу?
upload_file
метод будет автоматически использовать многокомпонентную загрузку для больших файлов.У boto3 теперь более приятный интерфейс, чем у клиента:
Само по себе это не намного лучше, чем
client
в принятом ответе (хотя в документации говорится, что он лучше выполняет повторные попытки загрузки и скачивания в случае сбоя), но с учетом того, что ресурсы в целом более эргономичны (например, ведро s3 и ресурсы объекта лучше, чем клиентские методы), это позволяет вам оставаться на уровне ресурсов без необходимости выпадать.Resources
обычно могут быть созданы так же, как и клиенты, и они принимают все или большую часть тех же аргументов и просто пересылают их своим внутренним клиентам.источник
my_bucket.upload_file()
(илиmy_bucket.upload_fileobj()
если у вас есть объект BytesIO).resource
повторные попытки лучше? Я не мог найти такого указания.Для тех из вас, кто хотел бы смоделировать
set_contents_from_string
подобные методы boto2, вы можете попробоватьДля Python3:
В python3 отсутствуют как StringIO, так и cStringIO . Используйте
StringIO
импорт как:Для поддержки обеих версий:
источник
источник
aws configure
команды awscli, и они будут найдены автоматически с помощьюbotocore
.Если вы хотите прочитать файл с конфигурацией, отличной от конфигурации по умолчанию, не стесняйтесь использовать либо
mpu.aws.s3_download(s3path, destination)
напрямую, либо скопированный код:источник
NameError: name '_s3_path_split' is not defined
Примечание: я предполагаю, что вы настроили аутентификацию отдельно. Ниже приведен код для загрузки одного объекта из корзины S3.
источник