Версионирование объектов в S3: пример работы с версиями Python

7bf6a304fb124fbf9cb43323df25d623.png

Версионирование объектов в S3-хранилищах — это мощный механизм, который позволяет отслеживать изменения файлов, предотвращать их случайное удаление и восстанавливать предыдущие версии. Это особенно полезно при работе с резервными копиями или чувствительными данными — есть возможность в любой момент вернуться к определенному состоянию объекта или восстановить его даже после удаления.

Всем привет! Меня зовут Гришин Александр, я продакт-менеджер и отвечаю за развитие объектного хранилища и облачных баз данных. В этой статье расскажу, как включить версионирование в объектном хранилище Selectel и работать с ним через Python с использованием библиотеки boto3 и панель управления. Материал пригодится как инженерам облачной инфраструктуры, так и разработчикам приложений.

Используйте навигацию, если не хотите читать текст целиком:

→ Часть работы в панели управления Selectel
→ Включаем версионирование в бакете
→ Загрузка объекта и создание версий
→ Восстановление предыдущей версии
→ Заключение

Часть работы в панели управления Selectel


В целом, здесь нам нужно просто создать и настроить контейнер объектного хранилища. Очень подробный пошаговый гайд вы найдете в статье моего коллеги. Я же перечислю только основные шаги.
  1. Перейдите в панель управления → Объектное хранилище и нажмите Создать контейнер.
  2. Выберите тип адресации vHosted. Что касается типа контейнера, то для работы с чувствительными данными подойдет приватный, а если планируете реализовать доступ к контенту без авторизации, выберите публичный.
  3. Включите версионирование на этот контейнер.
  4. Создайте служебного пользователя с ролью «Администратор объектного хранилища» и доступом в нужный проект.
  5. Создайте S3-ключ в панели управления.
  6. Сохраните Access Key и Secret Key. Будьте внимательны: ключи не хранятся в наших системах и показываются только один раз.

65c8a5f2427cd57855bc173e68c1a046.png

Работа с сервисными пользователями в панели управления.
iyapnnbbh7wcpqs3q71allkcsai.png

Включаем версионирование в бакете


Перед тем, как работать с версиями файлов, необходимо включить версионирование в контейнере. Это переопределяет поведение хранилища.
  • При выключенном версионировании объекты с одним и тем же именем будут перезаписаны при повторной записи.
  • При включенном версионировании вместо перезаписи каждая новая версия объекта будет храниться отдельно. Это позволяет возвращаться к нужному состоянию объекта.

Включение через графический интерфейс


Версионирование можно включить при создании контейнера. Для этого поставьте галочку Версионирование в разделе Защита данных.
819d009108b8ecbf7c44bc52e06a8540.png

Включение версионирования при создании нового контейнера.

Эту функциональность можно включать и выключать также и для существующего контейнера. Стоит учесть, что выключение версионирования не удаляет существующие версии в контейнере версии объектов, а лишь меняет поведение хранилища при записи. Новые версии перестанут записываться отдельным объектом, а будут перезаписывать существующий.

d2157886aeaf92928ebecb4f73a37efb.png

Включение версионирования для уже существующих контейнеров.

Включение через API (Python + boto3)


Если же вам удобнее работать с кодом, то берем библиотеку boto3 и включаем версионирование с помощью нескольких строк:
import boto3
s3 = boto3.client(
    's3',
    endpoint_url='https://s3.storage.selcloud.ru',
    aws_access_key_id='ВАШ_ACCESS_KEY',
    aws_secret_access_key='ВАШ_SECRET_KEY'
)
bucket_name = 'my-versioned-bucket'
# Включаем версионирование
s3.put_bucket_versioning(
    Bucket=bucket_name,
    VersioningConfiguration={'Status': 'Enabled'}
)
print(f'Версионирование включено для бакета {bucket_name}')

Загрузка объекта и создание версий


Попробуем загрузить объект example.txt несколько раз. Любые загрузки файлов с одинаковыми именами создают новые версии, а старые остаются доступными.
file_name = 'example.txt'
with open(file_name, 'w') as f:
f.write('Первая версия файла')
s3.upload_file(file_name, bucket_name, file_name)
# Загружаем обновленную версию файла
with open(file_name, 'w') as f:
f.write('Вторая версия файла')
s3.upload_file(file_name, bucket_name, file_name)

Теперь S3-хранилище хранит все версии этого объекта, их можно удалять или делать основными.

5d1377a2298fa487a3be1607a176b81d.png

Версионирование объектов в панели управления Selectel.

Запросим все версии конкретного файла из кода:

versions = s3.list_object_versions(Bucket=bucket_name, Prefix=file_name)
for version in versions.get('Versions', []):
print(f"Версия: {version['VersionId']} | Последний модифицированный: {version['LastModified']}")

Восстановление предыдущей версии


В любой момент времени можно восстановить старую версию объекта как из API, так и через панель управления. Для этого перейдите на листинг объектов, выберете нужную версию и восстановите объект.
e66067c285f14a92f30e320feb6b0161.png

Восстановление объекта из версий замещает основной объект.

Заключение


Версионирование объектов в S3-хранилище — это удобный инструмент для работы с изменяющимися файлами, защиты данных от случайного удаления и ведения истории изменений. Используя интерфейс панели управления, готовый клиент или S3, можно легко управлять версиями, восстанавливать файлы и автоматизировать обработку данных.

В этой статья я использовал код только для демонстрации работы мультирегиональности в объектном хранилище Selectel. Для большего удобства рекомендую использовать готовые приложения, поддерживающие такую функциональность из коробки. К ним относятся:

  • aws cli,
  • Rclone,
  • s3cmd,
  • cyberduck,
s3fs и другие.
Пользуясь случаем, выделю именно Rclone т. к. недавно мы стали официальными технологическими партнерамии получили нативную поддержку нашей услуги в этом клиенте.

Если у вас есть вопросы или идеи по автоматизации работы с объектным хранилищем Selectel — пишите в комментариях!

© Habrahabr.ru