Amazon S3 - другое правило жизненного цикла для "подкаталога", чем для родительского "каталога"
Скажем, у меня есть следующая структура данных:
Можно ли назначить ему следующие правила жизненного цикла:
- /(1 месяц)
- /foo (2 месяца)
- /foo/bar (3 месяца)
- /foo/baz (6 месяцев)
Официальная документация, к сожалению, в этом отношении несогласованна. Кажется, он не работает с консолью AWS, что делает меня несколько сомнительным, что SDK/REST будут разными:)
В противном случае моя основная проблема: у меня есть 4 типа проектов. У самого рудиментарного типа есть несколько тысяч проектов, у других - несколько десятков. Каждый тип, который я обязан хранить в течение другого периода времени. Каждый проект содержит сотни тысяч объектов. Он выглядит более или менее:
- тип A, 90% проектов, требуется x хранения
- тип B, 6% проектов, требуется 2x хранения
- тип C, 3% проектов, требуется 4 раза хранения
- тип D, 1% проектов, требуется 8-кратное хранилище
До сих пор так просто. Однако. Проекты могут быть обновлены или изменены с одного типа на другой. И, как я уже сказал, у меня есть несколько тысяч экземпляров первого типа, поэтому я не могу писать конкретные правила для каждого из них (помните 1000 правил для каждого ведра). И поскольку они могут обновляться с одного типа на другой, я не могу просто вставить их в свои собственные папки (например, только проекты определенного типа) или ведро. Или так я думаю? Существуют ли какие-либо другие варианты для меня, кроме итерации по каждому объекту, каждый раз, когда я хочу очистить файлы с истекшим сроком действия - что я бы скорее не сделал из-за большого количества объектов?
Может быть, какой-то файл "перемещать/переносить" между ведрами, которые не изменяют метаданные времени создания, и не дорого для нашего сервера?
Было бы очень важно:)
Ответы
Ответ 1
Политики жизненного цикла основаны на префиксе, а не в подкаталоге.
Итак, если объекты, соответствующие префиксу foo/
, должны быть удалены через 2 месяца, не логично запрашивать, чтобы объекты с префиксом foo/bar/
были удалены через 3 месяца, поскольку они будут удалены через 2 месяца... так как они также соответствуют префиксу foo/
. Префикс означает префикс. Разделители не являются фактором правил жизненного цикла.
Также обратите внимание, что ключи и префиксы в S3 не начинаются с /
. Политика, влияющая на весь массив, использует пустую строку в качестве префикса, а не /
.
Кроме того, вы, вероятно, хотите запомнить конечные косые черты при указании префиксов, потому что foo/bar
соответствует файлу foo/bart.jpg
, а foo/bar/
- нет.
Итерация по объектам для удаления не так плоха, как вы это делаете, поскольку вызов API объектов списка возвращает 1000 объектов на запрос (или меньше, если хотите) и позволяет указать как префикс, так и разделитель ( обычно вы будете использовать /
в качестве разделителя, если вы хотите, чтобы ответы были сгруппированы с использованием модели псевдопапки, используемой консолью для создания иерархического отображения)... и каждый ключ объекта и дата-метка предоставляются в XML-ответе. Также существует запрос API для удаления нескольких объектов за один вызов.
Любой вид перемещения, передачи, копирования и т.д. всегда будет reset датой создания объекта. Даже изменение метаданных, потому что объекты неизменяемы. Каждый раз, когда вы перемещаете, переносите, копируете или "переименовываете" объект (который на самом деле копирует и удаляет) или изменяют метаданные (которые фактически копируются на один и тот же ключ с разными метаданными), вы фактически создаете новый объект.
Ответ 2
@Zardii вы можете использовать уникальные теги объектов s3 [1] для объектов под этими префиксами
Затем вы можете применить политику жизненного цикла по тегу с различным периодом хранения/удаления.
[1] https://docs.aws.amazon.com/AmazonS3/latest/dev/object-tagging.html
Префикс -теги S3
/ tag => delete_after_one_month
/foo tag => delete_after_two_months
/foo/bar tag => delete_after_three_months
/foo/baz tag => delete_after_six_month