Настройки и удаление бакета¶
Страница описывает настройки бакета, которые задаёт пользователь хранилища через S3 API: версионирование, блокировку объектов, теги и правила жизненного цикла, а также удаление бакета. Она нужна разработчику клиентского приложения; сведения для администратора кластера вынесены в подразделы с пометкой «для администратора». Настройки доступа к бакету описаны на странице Управление доступом.
Разделы идут в порядке: защита данных от перезаписи и удаления, теги, автоматическое удаление, удаление бакета. Каждый раздел содержит описание, пример и перечень особенностей и ограничений.
Версионирование объекта¶
Версионирование включается для бакета.
После включения каждая запись создаёт новую версию с собственным VersionId,
а чтение без указания версии возвращает последнюю.
Версионирование нельзя выключить
Выключить версионирование после включения нельзя, можно только приостановить. Удаление с указанием версии удаляет данные безвозвратно.
aws s3api put-bucket-versioning --bucket documents \
--versioning-configuration Status=Enabled
aws s3api get-bucket-versioning --bucket documents
aws s3api list-object-versions --bucket documents --prefix report
# Прочитать конкретную версию
aws s3api get-object --bucket documents --key report.pdf \
--version-id 0000019874f3a1c2 old.pdf
# Удалить конкретную версию: данные удаляются безвозвратно
aws s3api delete-object --bucket documents --key report.pdf \
--version-id 0000019874f3a1c2
Особенности и ограничения
- Удаление без указания версии не удаляет данные, а создаёт
маркер удаления. Ответ на такое
удаление содержит заголовки
x-amz-delete-marker: trueиx-amz-version-idсозданного маркера. - Состояние
Suspendedостанавливает создание новых версий: запись заменяет версию с идентификаторомnull, а прежние версии сохраняются и остаются доступны поVersionId.
Ответы на запросы к версиям и маркерам удаления¶
| Запрос | Ответ |
|---|---|
GET, HEAD, GetObjectTagging, PutObjectTagging, DeleteObjectTagging, GetObjectAcl или PutObjectAcl без указания версии, когда последней версией ключа служит маркер удаления |
NoSuchKey (404) с заголовком x-amz-delete-marker: true |
versionId указывает на сам маркер удаления |
MethodNotAllowed (405) с заголовком x-amz-delete-marker: true |
versionId правильного формата, но у ключа нет такой версии |
NoSuchVersion (404) |
versionId неправильного формата |
NoSuchKey (404) |
Блокировка объектов¶
Блокировка объектов запрещает удалять версию объекта до истечения срока хранения или до снятия юридического удержания.
Срок хранения зависит от часов узлов
Срок хранения сравнивается с системными часами узлов. Если часы отстают
или переведены назад, срок хранения в режиме COMPLIANCE истечёт раньше
назначенного. На узлах хранилища требуется синхронизация времени.
Блокировка включается только при создании бакета и требует версионирования.
aws s3api create-bucket --bucket vault --object-lock-enabled-for-bucket
# Режим и срок хранения по умолчанию для новых объектов
aws s3api put-object-lock-configuration --bucket vault \
--object-lock-configuration \
'ObjectLockEnabled=Enabled,Rule={DefaultRetention={Mode=GOVERNANCE,Days=30}}'
# Срок хранения отдельной версии
aws s3api put-object-retention --bucket vault --key contract.pdf \
--retention 'Mode=COMPLIANCE,RetainUntilDate=2027-01-01T00:00:00Z'
# Юридическое удержание без срока
aws s3api put-object-legal-hold --bucket vault --key contract.pdf \
--legal-hold Status=ON
Особенности и ограничения
- Блокировка защищает версии, а не ключи. Пока срок хранения версии не истёк
или на ней установлено юридическое удержание, удаление этой версии
отклоняется с ответом
AccessDenied. - Запись новой версии поверх заблокированной и создание маркера удаления при этом разрешены.
- Режим
COMPLIANCEне обходится никем, включая владельца бакета. - Юридическое удержание снимается запросом
PutObjectLegalHoldсо значениемStatus=OFFи требует праваs3:PutObjectLegalHold.
Обход режима GOVERNANCE¶
Обход запрашивается заголовком x-amz-bypass-governance-retention: true и
требует права s3:BypassGovernanceRetention.
aws s3api delete-object --bucket vault --key contract.pdf \
--version-id 0000019874f3a1c2 --bypass-governance-retention
| Действие | Без обхода | С обходом режима GOVERNANCE |
|---|---|---|
Удаление версии в режиме GOVERNANCE |
отклоняется | разрешено |
Удаление версии в режиме COMPLIANCE |
отклоняется | отклоняется |
Сокращение срока в режиме GOVERNANCE |
отклоняется | разрешено |
| Продление срока в любом режиме | разрешено | разрешено |
Смена режима GOVERNANCE на COMPLIANCE |
отклоняется | разрешено |
Смена режима COMPLIANCE на GOVERNANCE |
отклоняется | отклоняется |
| Удаление версии с юридическим удержанием | отклоняется | отклоняется |
Теги¶
Теги — пары «ключ — значение», которые задаются для бакета и для объекта.
aws s3api put-object-tagging --bucket documents --key report.pdf \
--tagging 'TagSet=[{Key=class,Value=confidential}]'
aws s3api get-object-tagging --bucket documents --key report.pdf
aws s3api delete-object-tagging --bucket documents --key report.pdf
Особенности и ограничения
- И у бакета, и у объекта может быть не более 10 тегов.
- Теги объекта используются в правилах жизненного цикла и в
условиях политики бакета
(
s3:ExistingObjectTag/<ключ>,s3:RequestObjectTag/<ключ>).
Правила жизненного цикла¶
Правило жизненного цикла определяет, какие объекты и когда удаляются или переносятся в другой класс хранения.
Объект может быть удалён позже срока правила
Срок в правиле — самый ранний момент удаления, а не точный. При массовом истечении срока и после перезапуска инстанса или смены мастера репликасета удаление задерживается (см. Как выполняются правила). Настройки темпа удаления и метрики отставания от срока нет.
cat > lifecycle.json <<'EOF'
{
"Rules": [
{
"ID": "expire-logs",
"Status": "Enabled",
"Filter": {"Prefix": "logs/"},
"Expiration": {"Days": 30}
},
{
"ID": "tidy-versions",
"Status": "Enabled",
"Filter": {},
"NoncurrentVersionExpiration": {"NoncurrentDays": 7},
"AbortIncompleteMultipartUpload": {"DaysAfterInitiation": 1}
},
{
"ID": "large-temp",
"Status": "Enabled",
"Filter": {
"And": {
"Prefix": "tmp/",
"ObjectSizeGreaterThan": 10485760,
"Tags": [{"Key": "class", "Value": "scratch"}]
}
},
"Expiration": {"Days": 1}
}
]
}
EOF
aws s3api put-bucket-lifecycle-configuration --bucket documents \
--lifecycle-configuration file://lifecycle.json
aws s3api get-bucket-lifecycle-configuration --bucket documents
aws s3api delete-bucket-lifecycle --bucket documents
Поддерживаются следующие действия:
Expirationпо числу днейDays, по датеDateи с параметромExpiredObjectDeleteMarker;NoncurrentVersionExpiration, в том числе с параметромNewerNoncurrentVersions;AbortIncompleteMultipartUpload;- переходы между классами хранения
TransitionиNoncurrentVersionTransition.
Фильтр правила задаётся префиксом Prefix, тегом Tag, границами размера
ObjectSizeGreaterThan и ObjectSizeLessThan либо их сочетанием через And.
Особенности и ограничения
- Конфигурация проверяется при записи, и ошибка в ней возвращает ответ
InvalidArgument. - Срок
Daysотсчитывается от создания объекта и округляется вверх до ближайшей полуночи UTC, как в AWS. - Дата
Dateпринимается с точностью до секунды и исполняется в указанный момент, тогда как AWS требует, чтобы дата указывала на полночь. - Если объект попадает под действующее правило удаления, ответы
GETиHEADсодержат заголовокx-amz-expirationс датой удаления и идентификатором правила. Значение вычисляется по правилам при каждом запросе и после изменения правил сразу отражает новые сроки.
Переходы между классами хранения¶
Переход выполняется только в класс с более редким доступом: класс назначения
должен находиться в карте классов ниже текущего, иначе конфигурация отклоняется
с ответом InvalidArgument.
Что происходит с объектом при переходе, зависит от того, где хранится его содержимое:
| Объект | Переход |
|---|---|
| Содержимое хранится на дисках | Данные переписываются в группу размещения яруса нового класса. До завершения переноса объект читается из прежнего размещения |
| Содержимое хранится в строке метаданных | Меняется только метка класса |
| Любой объект в кластере с единственным ярусом | Меняется только метка класса; классом назначения может быть любое имя класса AWS |
Удаление бакета¶
Операция DeleteBucket удаляет только пустой бакет.
aws s3api delete-bucket --bucket documents
Особенности и ограничения
- Если в бакете есть объект, версия или маркер удаления, операция отвечает
BucketNotEmpty. - После успешного ответа новые запросы к бакету, включая запросы к его
настройкам, получают ответ
NoSuchBucket, аListBucketsи консоль бакет не показывают. Так отвечает каждый инстанс, который применил пометку об удалении. - Повторный
DeleteBucketотвечаетNoSuchBucket. - Запись, которая шла одновременно с удалением, либо завершается успешно, и её
объект удаляется вместе с бакетом, либо получает ответ
NoSuchBucket. - Имя бакета освобождается не сразу: пока идёт очистка, создание бакета с тем
же именем отвечает
OperationAborted(409). После очистки имя снова свободно.
Как кластер очищает строки удалённого бакета, описано в разделе Очистка после удаления бакета.