Object Storage можно освоить на одном небольшом проекте, если сразу видеть вход, действие и результат. S3-совместимый API позволяет использовать boto3, меняя endpoint и учётные данные, а не переписывая работу с файлами. Ниже вы соберёте работающий пример и проверите обычный и граничный сценарии.
Публичный бакет кажется самым простым решением, но раскрывает файлы; ключи в коде и неверный endpoint приводят к отдельным рискам и ошибкам. Поэтому отделим настройку, входные данные, основное действие и проверку. В этой статье вы соберёте скрипт загрузки файла, проверки metadata и создания presigned URL на пять минут. Проверка: объект появляется под ожидаемым ключом, head_object показывает размер, временная ссылка открывается и затем истекает.
создать boto3 client с endpoint_url. Не расширяйте проект до первого успешного запуска.
объект появляется в бакете. Проверяйте значение, а не отсутствие ошибки.
После успеха добавьте SHA-256 в metadata и функцию удаления тестового объекта. Так копирование станет практикой.
Как устроен учебный проект Object Storage
Object Storage разделяет подготовку, основное действие, проверку ответа и сохранение результата. Держите ввод, логику и отображение раздельно: тогда каждый этап можно проверить отдельно.
| Этап | Действие | Проверяемый результат |
|---|---|---|
| Клиент | создать boto3 client с endpoint_url | запрос идёт в Yandex Object Storage |
| Загрузка | передать bucket, key и ContentType | объект появляется в бакете |
| Проверка | вызвать head_object | размер совпадает с локальным файлом |
| Ссылка | создать presigned URL на 300 секунд | закрытый объект временно доступен |
Контрольные точки: клиент, загрузка, проверка и ссылка. Следующий шаг начинается после совпадения с ожидаемым результатом.

От входных данных до видимого результата. Сначала проверяется вход, затем действие и только потом интерфейс.
Собираем рабочий пример шаг за шагом
Материал сверялся с официальной документацией сервиса 21 октября 2026 года. Установите boto3, задайте AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, YC_BUCKET и не печатайте секреты. Проверьте текущую папку через pwd или Get-Location. Вставьте пример целиком, выполните один раз, затем разбирайте по частям.
import os
from pathlib import Path
import boto3
BUCKET = os.environ["YC_BUCKET"]
s3 = boto3.client(
"s3",
endpoint_url="https://storage.yandexcloud.net",
region_name="ru-central1",
)
def upload(filename: str, key: str) -> str:
path = Path(filename)
s3.upload_file(str(path), BUCKET, key, ExtraArgs={"ContentType": "text/plain"})
metadata = s3.head_object(Bucket=BUCKET, Key=key)
if metadata["ContentLength"] != path.stat().st_size:
raise RuntimeError("Размер объекта не совпал")
return s3.generate_presigned_url(
"get_object", Params={"Bucket": BUCKET, "Key": key}, ExpiresIn=300
)
print(upload("hello.txt", "demo/hello.txt"))- head_object возвращает размер, тип и служебные данные загруженного объекта.
- Presigned URL открывает закрытый файл ограниченное время без публикации бакета.
- Повторный запуск даёт тот же предсказуемый результат.
- Пустой ввод получает понятное сообщение вместо падения.
Код держит подготовку отдельно от внешнего действия, поэтому ошибку можно найти на конкретном шаге. Найдите в примере вход, проверку и место формирования результата.

Что отличает устойчивый проект от случайного запуска. Явные границы делают ошибку локальной и понятной.
Что происходит внутри и почему это работает
Bucket является контейнером, key задаёт имя объекта, endpoint направляет S3-клиент в нужное облако. Подпись запроса формируется из ключей окружения. Логику держите отдельно от вывода: функция получает аргумент и возвращает значение, а интерфейс показывает его. Секреты и персональные данные не должны попадать в репозиторий, журнал или публичный скриншот.
| Часть | За что отвечает | Что проверить |
|---|---|---|
| boto3 client | подписывает S3-запросы | endpoint и region заданы |
| upload_file | передаёт байты и metadata | key не начинается случайно с пути Windows |
| Presigned URL | даёт временный доступ | срок минимально необходимый |
Object Storage не является обычной файловой системой: папки существуют как префиксы key, а переименование обычно означает копирование и удаление. Проектируйте ключи заранее. Не прячьте поток в одном обработчике: сохраните вход, проверьте его, вызовите операцию и только затем обновите интерфейс.
Проверяем проект и добавляем свою функцию
Добавьте вычисление SHA-256 локального файла и сохраните хеш в metadata для последующей проверки. До правки запишите ожидаемое поведение одним предложением. После граничного теста повторите обычный сценарий.
- Сохраните ожидаемый результат: объект появляется под ожидаемым ключом, head_object показывает размер, временная ссылка открывается и затем истекает.
- Измените правило: добавьте SHA-256 в metadata и функцию удаления тестового объекта. Сначала предскажите итог.
- Передайте граничное значение и убедитесь, что приложение не падает.
- Верните корректные данные и объясните роли трёх основных частей.
- запрос идёт в Yandex Object Storage
- объект появляется в бакете
- размер совпадает с локальным файлом
- закрытый объект временно доступен
Полезное улучшение сохраняет исходный сценарий и добавляет одну новую проверяемую возможность. Полезная правка проходит от нового ввода до видимого результата.

Четыре проверки перед следующим шагом. Каждый следующий этап начинается после наблюдаемого результата.
Что запомнить и куда двигаться дальше
Для production выдавайте сервисному аккаунту минимальные роли, включите жизненный цикл и не делайте бакет публичным без необходимости. Для закрепления откройте в GitHub Actions для Python, в Docker Compose проекте и в публикации проекта на GitHub.
Как изучить тему в Кодике
Сначала разберите входные данные и один успешный вызов, затем изучайте дополнительные параметры. Сначала восстановите главную функцию и проверьте её на трёх значениях.
| Шаг | Что разобрать | Мини-проверка |
|---|---|---|
| 1. Основа | Файлы, Path, окружение и исключения Python | Объясните вход и выход функции. |
| 2. Инструмент | Bucket, key, endpoint и boto3 client | Повторите команду по памяти. |
| 3. Проект | Загрузку, head_object и presigned URL | Проверьте два сценария. |
| 4. Рефакторинг | Роли, lifecycle, metadata и резервирование | Разделите ввод, логику и вывод. |
Перепишите ключевую функцию по памяти и проверьте её на корректном, пустом и ошибочном вводе. Базовый синтаксис закрепите через курс Python.
Для временной выдачи используйте presigned URL.
Секрет попадает в Git. Используйте окружение или роль.
boto3 обращается к другому S3-провайдеру.
Key является строковым именем объекта, а не реальным каталогом.
Что получится в итоге

Финальный экран показывает результат, состояние запроса и понятное сообщение об ошибке без раскрытия секретов.
Что такое key?
Полное имя объекта внутри бакета, включая префиксы.
Зачем presigned URL?
Он временно даёт доступ к конкретной операции без раскрытия ключей и всего бакета.
Что проверять первым, если Object Storage не запускается?
Версию среды, текущую папку, команду запуска и первую строку ошибки.
Как понять, что проект Object Storage работает?
Проверьте основной сценарий, неверный ввод, повторный запуск и один граничный случай.
Можно ли начать с готового кода?
Да. Добейтесь результата, измените одно правило и восстановите ключевую функцию без копирования.
Выберите одно улучшение и проведите его от ввода до результата.
Если не хватает основы, перейдите курс Python, затем восстановите ключевую функцию без подсказки.