Использование gzip для сжатия запросов boto3
По умолчанию в библиотеке boto3
не включено сжатие для запросов, что может стать серьезной проблемой, так как AWS выдвигает серьезные ограничения к объему передаваемых данных. Все бы ничего, если бы сжатие можно было включить флагом или параметром boto3
, но этого нет.
Так как boto3
является оберткой HTTP клиента, самым очевидным вариантом реализовать сжатие - перехватить запрос до того, как он будет отправлен.
Для подобных ситуаций в библиотеке предусмотрена система евентов, которая позволяет зарегистрировать функцию-обработчик. Как только событие произойдет обработчик, будет вызван с определенными аргументами. Используя данную систему, несложно сжать данные и указать нужный HTTP заголовок.
import boto3
import gzip
s3 = boto3.client('s3')
event_system = s3.meta.events
def gzip_request_body(request, **kwargs):
gzipped_body = gzip.compress(request.body)
request.headers.add_header('Content-Encoding', 'gzip')
request.data = gzipped_body
event_system.register('provide-client-params.s3.PutObject', gzip_request_body)
# Your code here
Система событий очень гибкая: можно зарегистрировать несколько обработчиков или подключиться в пачке эвентов. Что позволяет писать более практичный код и не заниматься monkey-патчингом.