Log in to leave a comment
No posts yet
Я прекрасно понимаю то чувство холодка по коже, которое возникает каждый раз при просмотре счета за Amazon S3. Для инженера данных S3 — это как воздух, но когда для тестирования вы вызываете API десятки тысяч раз и перемещаете огромные файлы, стоимость обслуживания может легко превысить пользу от самого проекта. По состоянию на 2025 год стоимость хранения S3 Standard составляет 0,023 доллара за ГБ, но по-настоящему пугает стоимость передачи данных (Egress). Стоит превысить порог в 100 ГБ, как приходится платить 0,09 доллара за ГБ, что почти в 4 раза выше стоимости хранения. Чтобы сэкономить, многие запускают MinIO локально, но часто сталкиваются с трудностями из-за расхождений с реальным рабочим кодом. Поэтому я собрал воедино методы настройки, которые использую в практике.
Прописывать адрес S3 напрямую в коде приложения — опасная привычка. Если при развертывании вы по ошибке оставите локальный адрес, это приведет к сбою. Библиотека Boto3 считывает системные переменные окружения раньше, чем внутренние настройки кода. Используя этот приоритет, можно сделать так, чтобы локально приложение смотрело на MinIO, а в рабочей среде автоматически использовало AWS S3.
Способ настройки
AWS_S3_ENDPOINT_URL=http://localhost:9000 в файле .env локальной среды.os.getenv("AWS_S3_ENDPOINT_URL").boto3.client("s3", endpoint_url=endpoint).При такой настройке на рабочем сервере данной переменной окружения не будет, поэтому Boto3 обратится к стандартному адресу AWS. Это самый надежный способ свести к нулю затраты на десятки тысяч PUT/GET-запросов, возникающих на этапе локального тестирования.
Если вы попытаетесь использовать код Terraform, определяющий коммерческую инфраструктуру, напрямую с локальным MinIO, вы столкнетесь с ошибкой. Это происходит потому, что AWS-провайдер Terraform по умолчанию пытается проверить реальный ID аккаунта AWS. В локальной среде этот процесс проверки нужно перехватить и подменить.
Пример настройки Terraform
endpoints укажите s3 = "http://localhost:9000".s3_use_path_style, skip_credentials_validation и skip_requesting_account_id, установив их в значение true.access_key и secret_key введите любые строки, например mock_key.После этих настроек Terraform создаст политики бакетов и правила жизненного цикла (Lifecycle Rules) в локальном MinIO без подключения к реальному аккаунту AWS. Это эффективно для снижения процента неудачных развертываний, позволяя заранее выявить ошибки в определении инфраструктуры.
Чтобы адекватно оценить производительность запросов, даже фиктивные данные должны быть масштабными. Однако создание данных через обычные циклы происходит слишком медленно и изматывает. Я использую Polars или Apache Arrow. Polars использует векторизованные вычисления, поэтому он работает до 10 раз быстрее, чем Pandas.
Процесс создания данных
Faker и создайте чанки по 100 000 строк через Polars.write_to_dataset движка pyarrow для сохранения Parquet-файлов с партиционированием в стиле Hive (year=2026/month=04).Многократная загрузка и выгрузка 100 ГБ данных в облаке может стоить сотни долларов. Тестирование с использованием локального оборудования на пределе его возможностей гораздо полезнее для здоровья вашего кошелька.
Для локального тестирования бессерверной (serverless) логики, которая срабатывает автоматически при загрузке файла, можно использовать функцию уведомлений бакета MinIO. MinIO поддерживает функцию Webhook, которая отправляет JSON-данные на указанный HTTP-эндпоинт при создании объекта.
Порядок реализации
MINIO_NOTIFY_WEBHOOK_ENDPOINT к адресу локального сервера.s3:ObjectCreated:Put на локальный сервер.Надежность при наплыве событий определяется размером очереди и частотой возникновения событий (
). В локальной среде тестирования для душевного спокойствия лучше щедро увеличить значение queue_limit.
Иногда файлы, созданные внутри контейнера Docker, не открываются на хост-машине из-за проблем с правами доступа. Пользователям macOS особенно важно проверить, включена ли опция «VirtioFS» в настройках Docker Desktop. VirtioFS работает на 98% быстрее, чем старый метод gRPC FUSE, при обработке файловой системы. При работе с большими объемами данных эта разница очень ощутима.
Решение проблем с правами доступа
docker run используйте опцию --user $(id -u):$(id -g), чтобы синхронизировать права хоста и контейнера./data в контейнере.Хорошо выстроенная локальная среда — это полноценная лаборатория, где можно изучать принципы работы инфраструктуры, не беспокоясь о расходах. Это не просто экономия денег, а возможность обрести независимый ритм разработки, не продиктованный условиями облачных провайдеров.