Привет!
Сегодня я хочу поделиться результатами своего исследования в области версионирования объектов в S3. Я про эту фичу слышал давно, но особо много не знал. Да и сейчас не особо много знаю — расскажу, как включить версионирование в бакете и получение объектов разных версий.
Моё исследование показало, что эта функция не особо востребована, а готовых бесплатных утилит для версионирования вообще не существует. Зато есть библиотеки, в которых есть этот функционал. Нужно — разрабатывайте, мол.
Итак, для версионирования, в бакете нам прежде всего нужно его включить. Есть 2 доступных способа это сделать, и оба они завязаны на API.
- Чистый REST/SOAP запрос
- Через библиотеку
Я воспользуюсь Ruby библиотекой aws-sdk, которую и установим:
$ gem install aws-sdk
После этого зайдем в Ruby консоль:
$ irb
Далее авторизуемся и включим версионирование для бакета:
require 'aws-sdk'
s3 = AWS::S3.new(
:access_key_id => ENV['AMAZON_ACCESS_KEY_ID'],
:secret_access_key => ENV['AMAZON_SECRET_ACCESS_KEY']
)
my_bucket=s3.buckets['epamcccctesting']
my_bucket.enable_versioning
Я думаю, что вы в курсе, что означают переменные окружения AMAZON_ACCESS_KEY_ID и AMAZON_SECRET_ACCESS_KEY — не будем на них зацикливаться.
Итак, в консоли мы увидим, что версионирование включено:
Итак, как же происходит версионирование? Да просто. AWS при попытке заменить файл не заменяет его, а присваивает новую версию, которую отдаёт в хедерах POST реквеста. Ну или в параметрах в библиотеке.
Версии выгладят так:
x-amz-version-id: mHYT.SyFXgHoG6xCy5yQVk6n6riJct4u
x-amz-version-id: .KSpevNIkZSgBoCz4vU3iTBttGWXWqIc
После этого GET запросом можно обратиться к интересующей версии файла, вставив в гет-параметры versionId. Без указания этого параметра мы получим последнюю версию этого файла.
Пример: я загрузил в бакет 3 версии файла и получил разные версии в хедерах. По следующим ссылкам можно получить эти версии:
Всё довольно просто. Удаление файла так же с параметром versionId.
В общем, ясно, что функционал есть, но не ясно, почему до сих пор широко не используется и нет нормальной и удобной имплементации для CLI. Например хранение бекапов было бы удобно. Также можно найти десяток примеров, где версионирование файлов было бы очень удобным и простым решением.
Может вы используете где-то версионирование? Расскажите что-то интересное?
Автор: korjik