Версионирование объектов в S3

в 14:30, , рубрики: Amazon Web Services, AWS, Блог компании EPAM Systems Ukraine, метки:

Привет! image

Сегодня я хочу поделиться результатами своего исследования в области версионирования объектов в 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 — не будем на них зацикливаться.

Итак, в консоли мы увидим, что версионирование включено:
image

Итак, как же происходит версионирование? Да просто. AWS при попытке заменить файл не заменяет его, а присваивает новую версию, которую отдаёт в хедерах POST реквеста. Ну или в параметрах в библиотеке.

Версии выгладят так:

x-amz-version-id: mHYT.SyFXgHoG6xCy5yQVk6n6riJct4u
x-amz-version-id: .KSpevNIkZSgBoCz4vU3iTBttGWXWqIc

После этого GET запросом можно обратиться к интересующей версии файла, вставив в гет-параметры versionId. Без указания этого параметра мы получим последнюю версию этого файла.

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

Всё довольно просто. Удаление файла так же с параметром versionId.

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

Может вы используете где-то версионирование? Расскажите что-то интересное?

Автор: korjik

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js