Pull to refresh
EPAM
Компания для карьерного и профессионального роста

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

Reading time 2 min
Views 5.6K
Привет! 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. Например хранение бекапов было бы удобно. Также можно найти десяток примеров, где версионирование файлов было бы очень удобным и простым решением.

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

UPD: Например, вывод версий объекта с датами и размерами:
my_bucket=s3.buckets['epamcccctesting']
file = my_bucket.objects["file"]

file.versions.each do |version| 
       puts version.head[:last_modified].to_s + '   ' + version.version_id + '    ' + version.head[:content_length].to_s + ' bytes' 
end

2012-12-20 16:15:11 +0200   NQc0gba0nv6znIfSHRaxR0fT3I.ZaUQ5    4 bytes
2012-12-20 16:14:52 +0200   s73raBjbDF2pZpQT9o4qPu4Yn0piy1wL    3 bytes
2012-12-20 16:13:59 +0200   6Txnrqbcb4LaXo2MGYP9gn61Em0UIrUq    2 bytes


UPD: С недавних пор версионирование можно включить через консоль:
image
Tags:
Hubs:
+12
Comments 21
Comments Comments 21

Articles

Information

Website
www.epam.com
Registered
Founded
1993
Employees
over 10,000 employees
Location
США
Representative
vesyolkinaolga