БэкендDevOpsPython

Yandex Object Storage + Python: загружаем файл в S3 через boto3

Подключаем boto3 к Yandex Object Storage, загружаем файл в S3-бакет, проверяем объект, создаём временную ссылку и безопасно храним ключи.

Кодик

Автор

6 мин чтения

Object Storage можно освоить на одном небольшом проекте, если сразу видеть вход, действие и результат. S3-совместимый API позволяет использовать boto3, меняя endpoint и учётные данные, а не переписывая работу с файлами. Ниже вы соберёте работающий пример и проверите обычный и граничный сценарии.

Публичный бакет кажется самым простым решением, но раскрывает файлы; ключи в коде и неверный endpoint приводят к отдельным рискам и ошибкам. Поэтому отделим настройку, входные данные, основное действие и проверку. В этой статье вы соберёте скрипт загрузки файла, проверки metadata и создания presigned URL на пять минут. Проверка: объект появляется под ожидаемым ключом, head_object показывает размер, временная ссылка открывается и затем истекает.

1Соберите минимум

создать boto3 client с endpoint_url. Не расширяйте проект до первого успешного запуска.

2Увидьте данные

объект появляется в бакете. Проверяйте значение, а не отсутствие ошибки.

3Измените правило

После успеха добавьте SHA-256 в metadata и функцию удаления тестового объекта. Так копирование станет практикой.

Как устроен учебный проект Object Storage

Object Storage разделяет подготовку, основное действие, проверку ответа и сохранение результата. Держите ввод, логику и отображение раздельно: тогда каждый этап можно проверить отдельно.

ЭтапДействиеПроверяемый результат
Клиентсоздать boto3 client с endpoint_urlзапрос идёт в Yandex Object Storage
Загрузкапередать bucket, key и ContentTypeобъект появляется в бакете
Проверкавызвать head_objectразмер совпадает с локальным файлом
Ссылкасоздать presigned URL на 300 секундзакрытый объект временно доступен

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

Путь данных в проекте Object Storage
От входных данных до видимого результата. Сначала проверяется вход, затем действие и только потом интерфейс.

Зафиксируйте первый успех Начните с маленького text/plain файла и уникального key в учебном закрытом бакете. Сохраните команду запуска и ожидаемый вывод.

Собираем рабочий пример шаг за шагом

Материал сверялся с официальной документацией сервиса 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 открывает закрытый файл ограниченное время без публикации бакета.
  • Повторный запуск даёт тот же предсказуемый результат.
  • Пустой ввод получает понятное сообщение вместо падения.

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

Хрупкий и проверяемый вариант Object Storage
Что отличает устойчивый проект от случайного запуска. Явные границы делают ошибку локальной и понятной.

Что происходит внутри и почему это работает

Bucket является контейнером, key задаёт имя объекта, endpoint направляет S3-клиент в нужное облако. Подпись запроса формируется из ключей окружения. Логику держите отдельно от вывода: функция получает аргумент и возвращает значение, а интерфейс показывает его. Секреты и персональные данные не должны попадать в репозиторий, журнал или публичный скриншот.

ЧастьЗа что отвечаетЧто проверить
boto3 clientподписывает S3-запросыendpoint и region заданы
upload_fileпередаёт байты и metadatakey не начинается случайно с пути Windows
Presigned URLдаёт временный доступсрок минимально необходимый

Object Storage не является обычной файловой системой: папки существуют как префиксы key, а переименование обычно означает копирование и удаление. Проектируйте ключи заранее. Не прячьте поток в одном обработчике: сохраните вход, проверьте его, вызовите операцию и только затем обновите интерфейс.

Проверьте границу Загрузите один файл под двумя key, затем запросите несуществующий объект. Обработайте ошибку отдельно от сбоя сети. Меняйте одно условие за прогон, чтобы видеть причину.

Проверяем проект и добавляем свою функцию

Добавьте вычисление SHA-256 локального файла и сохраните хеш в metadata для последующей проверки. До правки запишите ожидаемое поведение одним предложением. После граничного теста повторите обычный сценарий.

Проверка своими руками
  1. Сохраните ожидаемый результат: объект появляется под ожидаемым ключом, head_object показывает размер, временная ссылка открывается и затем истекает.
  2. Измените правило: добавьте SHA-256 в metadata и функцию удаления тестового объекта. Сначала предскажите итог.
  3. Передайте граничное значение и убедитесь, что приложение не падает.
  4. Верните корректные данные и объясните роли трёх основных частей.
Готово, если выполняются все пункты
  • запрос идёт в Yandex Object Storage
  • объект появляется в бакете
  • размер совпадает с локальным файлом
  • закрытый объект временно доступен

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

Четыре контрольные точки 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. Используйте окружение или роль.

Endpoint не задан

boto3 обращается к другому S3-провайдеру.

Папки как локальная ФС

Key является строковым именем объекта, а не реальным каталогом.

Сверяйтесь с первичной документацией. Команды и ограничения примера проверены по официальному источнику 1. Если версия инструмента изменилась, официальный источник важнее старого скриншота.

Что получится в итоге

Готовый результат проекта: Yandex Object Storage + Python: загружаем файл в S3 через boto3
Финальный экран показывает результат, состояние запроса и понятное сообщение об ошибке без раскрытия секретов.

Короткие ответы
Что такое key?

Полное имя объекта внутри бакета, включая префиксы.

Зачем presigned URL?

Он временно даёт доступ к конкретной операции без раскрытия ключей и всего бакета.

Что проверять первым, если Object Storage не запускается?

Версию среды, текущую папку, команду запуска и первую строку ошибки.

Как понять, что проект Object Storage работает?

Проверьте основной сценарий, неверный ввод, повторный запуск и один граничный случай.

Можно ли начать с готового кода?

Да. Добейтесь результата, измените одно правило и восстановите ключевую функцию без копирования.

Сделайте один осознанный шаг дальше

Выберите одно улучшение и проведите его от ввода до результата.

Если не хватает основы, перейдите курс Python, затем восстановите ключевую функцию без подсказки.