Руководство по решению проблемы управления версиями для конкретных объектов в корзине AWS S3 с помощью Python.

Это мой первый блог. Идея написать о версиях S3 Bucket возникла благодаря моему личному опыту и тому, что я сделал для преодоления трудностей. Найдите файлы этого блога на GitHub здесь. Итак, прежде чем двигаться дальше, позвольте мне перечислить темы, которые я буду освещать в этом блоге.

  1. Краткое введение в AWS S3 Bucket
  2. Предпосылка
  3. Управление версиями в S3
  4. Проблема управления версиями для конкретных объектов в корзине S3
  5. Решение
  6. Краткое содержание

1. Краткое введение в AWS S3 Bucket

Amazon Web Services (AWS) — это облачная платформа, предоставляющая потрясающие облачные сервисы. Эти сервисы позволяют пользователям больше сосредоточиться на разработке приложения, а не на ресурсах/среде, поскольку этим будет заниматься AWS. Одним из самых известных сервисов AWS является AWS S3 (Simple Storage Service).

Amazon Simple Storage Service (Amazon S3) – это служба хранения объектов, обеспечивающая лучшую в отрасли масштабируемость, доступность данных, безопасность и производительность. Amazon S3 предоставляет функции управления, позволяющие оптимизировать, организовывать и настраивать доступ к своим данным в соответствии с конкретными бизнес-требованиями, организационными требованиями и требованиями соответствия. [1]

AWS S3 предоставляет множество функций, которые вы можете проверить на его оригинальном веб-сайте. Здесь мы сосредоточимся только на «Управлении версиями сегментов S3». AWS S3 — это служба хранения, в которой мы можем хранить любые данные/файлы в форме объекта, не особо беспокоясь об управлении ими. S3 относится к любым данным/файлам как к объекту, и эти объекты должны храниться в определенном сегменте.

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

Каждый объект имеет свой уникальный идентификатор, известный как Ключ. Комбинация корзины, ключа объекта и (необязательно) идентификатора версии (если для корзины включено управление версиями S3) однозначно идентифицирует каждый объект.

Эти ключи выглядят как путь к файлу, например, «reports/Sales_Records_2021.xlsx» — это имя ключа в корзине «Bucket-Sale». В корзине не может быть двух одинаковых ключей.

Это краткое введение в корзину AWS S3. Поскольку эта сессия посвящена проблемам, возникающим при управлении версиями корзины AWS S3, мы продолжим нашу тему. Чтобы получить больше информации по теме, посетите официальный веб-сайт AWS S3. [1]

2. Обязательное условие

Для доступа к сервису AWS S3 у вас должна быть учетная запись на AWS с ролью пользователя IAM. Для доступа за пределами его среды вам потребуется идентификатор ключа доступа AWS и секретный ключ доступа AWS. Тогда вы можете идти.

3. Управление версиями в S3

Как следует из названия, «Управление версиями в S3» означает добавление версии к объектам корзины. AWS S3 дает право добавлять несколько версий объекта. Мотивом этого является сохранение всех предыдущих версий объекта. Это похоже на сохранение старой версии в качестве резервной копии. Это очень полезно, когда текущая версия не работает должным образом или может восстановиться в случае какой-либо аварии.

При включении управления версиями S3 в корзине Amazon S3 создает уникальный идентификатор версии для каждого объекта, добавленного в корзину. Объекты, которые уже существовали в корзине на момент включения управления версиями, имеют нулевой идентификатор версии. Если вы изменяете эти (или любые другие) объекты другими операциями, такими как CopyObject и PutObject, новые объекты получают уникальный идентификатор версии. [2]

4. Проблема объектно-ориентированного управления версиями в корзине S3

Теперь вы знаете, что управление версиями добавлено ко всем объектам корзины (версия включена). Но что, если мы не хотим добавлять управление версиями ко всем объектам в корзине. Могут быть случаи, когда мы хотим управлять версиями только для некоторых файлов, а остальные должны быть перезаписаны.

Кроме того, если мы хотим получить версии для нескольких файлов, мы все равно должны заплатить полную стоимость версии ведра. За время своей работы я столкнулся с таким сценарием. Мне нужно хранить некоторые файлы в уже существующей корзине S3 с функцией управления версиями, а в этой корзине управление версиями не включено. Но как разработчик, я должен найти какое-то решение этой проблемы. Поэтому перейдите к следующему разделу, чтобы получить альтернативу этой проблеме.

5. Решение

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

Возьмем 3 сценария:

1. Нет версионности объектов.

2. Отдельное управление версиями для каждого объекта.

3. Тот же номер версии для набора объектов.

Сценарий 1: Нет управления версиями объектов

Здесь идентификатор версии будет нулевым для всех объектов, поэтому объекты будут заменены существующим объектом.

Old object key: S3_no_version/object_with_null_version.pdf
New object key: S3_no_version/object_with_null_version.pdf

Примечание. Не обращайте внимания на тип файла, он может быть любого типа (XLSX, py, TXT, JPG и т. д.).

Сценарий 2. Раздельное управление версиями для каждого объекта

Предположим, у нас есть два объекта в ведре с именем S3_Demo_Bucket.

Object 1 key: S3_with_version/demo_object_1.pdf
Object 2 key: S3_with_version/demo_object_2.pdf

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

В этом случае вам нужно сохранить учетную запись в текущей версии или можно сделать это, используя дату и время, в зависимости от того, что удовлетворяет вашему условию.

Вот некоторые из примеров добавления версии к объекту:

1. Object_name_v_01.pdf
2. Object_name_281020211007.pdf // appended with current date and time
3. Object_name_1.pdf

Здесь v_01 и _1 — это номер версии. Вы можете сохранить этот номер версии в переменной, а затем последовательно увеличивать его, когда приходит обновленный объект.

Примечание: будет сложно добавлять версии дробями (например, 1,2, 23,9 и т. д.), т.к.

Пример кода приведен для справки (на Python):

Вывод:

Old file name = object_name_v_54.py
Current Version Number = 54
New object key = bucket_name/folder_name/object_name_v_55.py

Вышеупомянутое может быть изменено и обновлено в соответствии с вашими требованиями. Кроме того, этот пример кода — не лучшее решение, вы можете попробовать свою версию и поделиться ею со всеми.

Теперь здесь вы можете видеть, что множество разделений строк и объединений работают вместе, чтобы получить желаемый результат, и это будет неэффективно, если мы хотим, чтобы какой-то набор файлов следовал одной и той же версии. Решение этой проблемы описано в следующем разделе.

Сценарий 3. Один и тот же номер версии для набора объектов

В некоторых случаях мы хотим установить один и тот же номер версии для набора объектов.

Например: если вы хотите сохранить файл публикаций в S3 и ключ объекта выглядит как "Publication_list/Plants_growth.docx", а также хотите добавить файл статистики с именем ключа “ Publication_list/Plants_growth_statistics.xlsx», статистика которого описана/упомянута в файле Plants_growth.docx, то каждый раз, когда вы обновляете свою статистику, вам также необходимо вносить изменения в документ публикации. В этом случае вы должны сохранить один и тот же номер версии для обоих файлов.

Вот решение. Вместо добавления номера версии к имени файла лучше добавить номер версии в ключ объекта.

Нравиться:

Publication_list/1/Plants_growth_statistics.xlsx and Publication_list/1/Plants_growth.docx

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

Пример кода приведен ниже.

Вывод:

Old Version Number = 2
New object key = bucket_name/folder_name/3/object_name.py

Может быть несколько методов добавления версий по объектам. Это методы, которые я использовал.

6. Резюме

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

Это все на данный момент. Если у вас есть что-то еще, что не описано в этом, дайте мне знать в комментариях ниже.

Приятного чтения!

(Спасибо Rohit за помощь в этом блоге)

Больше контента на plainenglish.io