Рубрики
Без рубрики

Botocore ужасен, поэтому я написал лучшего клиента Python для AWS S3

Если вы когда -либо были достаточно неудачны, чтобы пришлось работать с Potocore, Amazon Web Services ‘Python … Tagged с Python, AWS, Cloud.

Если вы когда -либо были достаточно неудачны, чтобы пришлось работать с API Python Api Amazon Web Services, вы знаете, что это ужасно. Существуют десятки способов выполнения любой задачи, и различия между каждым в лучшем случае неясны. Недавно я обнаружил, что работаю с ботокором, пытаясь превратить некоторые функции S3 в CodeLighthouse , и я очень расстроился этим, очень быстро.

AWS S3 (Простая служба хранения) не является сложной – это хранение объектов. Вы можете Получить , Положить , Удалить и Копия Объекты, с несколькими другими функциями. Просто, верно? Тем не менее, по какой -то причине, если бы вы напечатали документацию Botocore для службы S3, вы бы вышли на 525 печатных страниц.

Я решил использовать API объекта, который является API самого высокого уровня, предоставленного ресурсом S3 в ботокоре, и это все еще была головной болью. Например, API объекта не бросает различные типы исключений – он бросает один тип исключения, который обладает многочисленными свойствами, которые вы должны проанализировать, чтобы определить, что на самом деле пошло не так.

Уже есть несколько пакетов с открытым исходным кодом, но я обнаружил, что большинство из них оставили желать лучшего – некоторые из них писали XML, а другие были просто сложнее, чем они должны были быть.

Чтобы спасти себя от сумасшествия, пытаясь расшифровать документы, я написал пользовательский драйвер высокого уровня, который потребляет этот низкоуровневый ботокоре-API для выполнения большинства основных функциональных возможностей ботокора.

Чтобы спасти других разработчиков от той же судьбы, которую я узко избегал, я Открытый код и опубликовал его на PYPI Таким образом, вы можете легко использовать его во всех своих проектах.

Давайте начнем

Установка моего пользовательского клиента AWS S3

Поскольку мой клиент -код размещен через Pypi , это очень легко установить:

pip install s3-bucket

Настройка клиента S3

Чтобы получить доступ к вашим ковшам S3, вам понадобится идентификатор ключа AWS Secret Access и ключ AWS Secret Access. Я написал метод, который вы можете передать его, чтобы настроить клиента, чтобы вы могли использовать свои ведра. Я сильно предложить не Тщательно кодировать эти значения в вашем коде, поскольку это может создать уязвимости безопасности и плохая практика. Вместо этого я рекомендую хранить их в переменных среды и использовать ОС модуль, чтобы принести их:

import s3_bucket as S3
import os

# get your key data from environment variables
AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')

# initialize the package
S3.Bucket.prepare(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)

Использование клиента S3

Я разработал API клиента S3, чтобы быть логически похожим на то, как конструкции AWS S3. Вместо того, чтобы возиться с ботокором Клиент , Ресурс , Сессия и Объект API, есть один, простой API: Ведро API

Ведро API

Ведро API прост и предоставляет большинство основных методов, которые вы хотите использовать для ведра S3. После того, как вы инициализируете клиент S3 с помощью ключей, как описано в предыдущем разделе, вы можете инициализировать Ведро объект, передав его имя ведра:

bucket = S3.Bucket('your bucket name')

#example
bucket = S3.Bucket('my-website-data')

После того, как вы это сделаете, это плавное плавание – вы можете использовать любой из следующих методов:

bucket.get (key) Возвращает две гуля, содержащие байты объекта, и дикт, содержащий метаданные объекта
bucket.put (ключ, данные,) Загрузите данные как объект с ключом в качестве ключа объекта. Данные могут быть либо типом STR, либо типом байтов. Метаданные – это дополнительный аргумент, который должен быть диктом, содержащим метаданные для хранения с объектом.
bucket.delete (ключ) Удалить объект в ведре, указанный ключом
bucket.upload_file (local_filepath, key) Загрузите файл, указанный local_filepath в ведро с ключом в качестве ключа объекта.
bucket.download_file (key, local_filepath) Загрузите объект, указанный ключом из ведра, и храните его в локальном файле Local_filepath.

Пользовательские исключения

Как я упоминал ранее, то, как ботокоре поднимает исключения, несколько удивительно. Вместо того, чтобы поднимать различные типы исключений, чтобы указать различные типы проблем, он бросает один тип исключения, который содержит свойства, которые вы должны использовать, чтобы определить, что пошло не так. Это действительно тупо и плохой шаблон дизайна.

Вместо того, чтобы полагаться на ваш клиент -код, чтобы расшифровать исключения Botocore, я написал пользовательские классы исключений, которые вы можете использовать для обработки наиболее распространенных типов ошибок S3.

Супер класс для всех других исключений ведра. Можно использовать для общего улавливания исключений, поднятых API. BucketException ведро, сообщение
Повышен, если вы попытаетесь получить доступ к ведро, которого не существует. Nosuchbucket ведро, ключ, сообщение
Поднимается, если вы попытаетесь получить доступ к объекту, который не существует в существующем ведре. Nosuchkey ведро, ключ, сообщение
AWS отрицал доступ к ведро, к которому вы пытались получить доступ. Это может не существовать, или у вас может не быть разрешения для доступа к нему. BucketAccessded ведро, сообщение
Ботокоре бросил исключение, которое этот клиент не был запрограммирован для обработки. Неизвестный BucketException ведро, error_code, error_message

Чтобы использовать эти исключения, вы можете сделать следующее:

try:
    bucket = S3.Bucket('my-bucket-name') 
    data, metadata = bucket.get('some key')
except S3.Exceptions.NoSuchBucket as e:
    # some error handling here
    pass

Примеры

Ниже я дал пример нескольких вариантов использования для клиента S3.

Загрузка и загрузка файлов

В этом примере показано, как загружать и загружать файлы в/из вашего S3 Bucket

import s3_bucket as S3
import os

# get your key data from environment variables
AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')

# initialize the package
S3.Bucket.prepare(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)

# initialize a bucket
my_bucket = S3.Bucket('my-bucket')

# UPLOAD A FILE
my_bucket.upload_file('/tmp/file_to_upload.txt', 'myfile.txt')
my_bucket.download_file('myfile.txt', '/tmp/destination_filename.txt')

Хранение и получение больших каплей текста

Причина, по которой я первоначально создал этот клиент, заключалась в том, чтобы справиться с хранением и получением больших каплей данных JSON, которые были большими для хранения в моей базе данных. Пример ниже показывает, как это сделать.

import s3_bucket as S3
import os

# get your key data from environment variables
AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')

# initialize the package
S3.Bucket.prepare(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)

# initialize a bucket
my_bucket = S3.bucket('my-bucket')

# some json string
my_json_str = "{'a': 1, 'b': 2}" # an example json string

my_bucket.put('json_data_1', my_json_str)

data, metadata = my_bucket.get('json_data_1')

Вывод

Я надеюсь, что вы найдете это таким же полезным, как и я! Дайте мне знать, что вы думаете в комментариях ниже.

Если вы пишете код для облачных приложений, вам нужно пойти, когда что -то пойдет не так. Я построил CodeLighthouse Чтобы отправить уведомления об ошибках приложения в реальном времени прямо в разработчиков, чтобы вы могли быстрее найти ошибки и исправлять ошибки. Начните бесплатно в CodeLighthouse.io сегодня!

Оригинал: “https://dev.to/kmistele/botocore-is-awful-so-i-wrote-a-better-python-client-for-aws-s3-21gd”