📝 API

S3-совместимое объектное хранилище: bucket, key и URL

P
Автор
PyLand Team
📅
Опубликовано
18.09.2026
⏱️
Время чтения
1 мин
👁️
Просмотров
2
🌿
Уровень
Средний

На одном компьютере файл можно сохранить в обычную папку. После деплоя это ненадёжно:
контейнер могут пересоздать, а несколько экземпляров приложения не разделяют один
локальный диск. Здесь помогает объектное хранилище.

S3 хранит файлы как объекты внутри bucket. Приложение находит объект по
key. Это не путь локальной файловой системы, хотя ключ может выглядеть как
covers/uuid.webp. Bucket отвечает на вопрос «где коллекция», а key — «какой объект».

Храни отдельно:

  • key — стабильный идентификатор для чтения и удаления;
  • URL — способ доступа, который может быть временным;
  • метаданные — размер, обнаруженный тип и владелец.

Не извлекай key обратно из URL: домен, кодирование и подпись могут измениться.

Путь одного файла

  1. Приложение проверяет загрузку.
  2. Сервер создаёт непредсказуемый key.
  3. Storage adapter сохраняет байты.
  4. База хранит key и метаданные, но не временную подпись URL.
  5. Для чтения приложение строит URL, а для удаления использует сохранённый key.

Минимальный adapter

from typing import Protocol

class Storage(Protocol):
    def save(self, key: str, data: bytes, content_type: str) -> str: ...
    def delete(self, key: str) -> None: ...

Один контракт позволяет использовать локальную реализацию в разработке и тестах,
а S3 — в production. Маршрут FastAPI не должен знать детали boto3.

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

Безопасность

  • создавай непредсказуемые ключи на сервере;
  • выдавай IAM-пользователю только нужные bucket и операции;
  • не коммить access key и secret key;
  • указывай корректный ContentType;
  • не делай bucket публичным ради одного файла;
  • для приватного доступа создавай короткоживущий presigned URL.

Presigned URL даёт ограниченный по времени доступ с полномочиями создавшей его
учётной записи. Он не заменяет авторизацию приложения и не является стабильным
значением для базы данных. Сначала пользователь проходит авторизацию в приложении,
и только затем сервер решает, можно ли выдать ссылку. Истечение presigned URL не
удаляет объект — оно прекращает доступ только по этой подписи.

Официальная документация

Ваша реакция на статью

💬 Комментарии (0)

🔐 Войдите в систему, чтобы оставить комментарий
🚪 Войти
💭

Комментариев пока нет

Станьте первым, кто поделится мнением об этой статье!

🔗 Похожие

Похожие статьи

Продолжите изучение с этими материалами

📝

Что такое API и зачем оно нужно

Каждый раз когда ты открываешь приложение погоды, платишь картой или видишь рекомендации в YouTube —...

📅 08.05.2026 👁️ 433
📝

Безопасная загрузка файлов: размер, тип, имя и хр…

Когда пользователь выбирает фотографию, всё выглядит просто: браузер отправляет файл, а сервер сохраняет его. Но...

📅 18.09.2026 👁️ 2
📝

Cookie-сессии и CSRF в серверном веб-приложении

Cookie-сессия связывает запросы браузера с пользователем. В подписанной cookie данные защищены от незаметного изменения, но...

📅 18.09.2026 👁️ 4

Понравилась статья?

Подпишитесь на наши обновления и получайте новые статьи первыми. Развивайтесь вместе с PyLand!