Автоматическое удаление объектов в DigitalOcean Spaces через политики жизненного цикла
DigitalOcean Spaces поддерживает политики жизненного цикла S3, но установить их в веб-интерфейсе нельзя. Используйте AWS CLI и указывайте endpoint вашего региона, чтобы загрузить JSON с правилами удаления и очистки незавершённых multipart-загрузок. В статье есть пошаговая инструкция, примеры JSON, проверка, чеклисты и рекомендации по отладке.

Что делает эта инструкция
Эта статья показывает, как настроить автоматическое удаление (expiration) объектов в DigitalOcean Spaces с помощью S3-совместимых политик жизненного цикла. Политики пригодятся для ротации бэкапов, логов и временных файлов, чтобы не накапливалось устаревшее хранилище и не росли расходы.
Ключевые идеи в одном предложении
- Политики описываются в JSON и прикрепляются к бакету через aws s3api put-bucket-lifecycle-configuration.
- Обязательно указывайте параметр –endpoint для вашего региона Spaces.
- Поддерживаются правила удаления по возрасту, очистка незавершённых multipart-загрузок; переходы между классами хранилища в DigitalOcean недоступны.
Требования
- Установленный AWS CLI (версия 1.x или 2.x). Проверить: aws –version
- Доступ к DigitalOcean Control Panel для создания ключа доступа Spaces
- Имя вашего Space (бакета) и известный регион (например, nyc3, fra1 и т.д.)
Важно
- Секретная часть ключа показывается только один раз в Control Panel — сохраните её сразу.
- AWS CLI по умолчанию пытается подключиться к AWS. Всегда указывайте –endpoint для DigitalOcean Spaces.
Получение ключей доступа
- Откройте DigitalOcean Control Panel.
- В левой панели нажмите ссылку “API”.
- Под заголовком “Spaces access keys” нажмите Generate New Key.

- Дайте ключу имя и подтвердите. Сохраните Access Key и Secret.
В терминале выполните:
aws configureи введите Access Key и Secret, когда вас попросят.
Примечание о endpoint
Официальный клиент S3 не сохраняет кастомный endpoint вместе с профилем. Это значит, что в каждой команде нужно передавать флаг –endpoint=https://
aws s3 ls --endpoint=https://nyc3.digitaloceanspaces.com --bucket my-bucketПодставьте ваш регион вместо nyc3.
Создание политики жизненного цикла
Политика описывается JSON-файлом. Создайте файл my-policy.json (или другое имя) и вставьте правила. Минимальный пример, удаляющий объекты через 30 дней:
{
"Rules": [
{
"ID": "Prune old files",
"Status": "Enabled",
"Prefix": "",
"Expiration": {
"Days": 30
}
}
]
}Пояснения к полям
- Rules — массив правил. Каждый элемент описывает одно правило.
- ID — читабельный идентификатор правила.
- Status — Enabled или Disabled. Enabled означает, что правило активно.
- Prefix — префикс ключей объекта; пустая строка применяет правило ко всему бакету.
- Expiration.Days — число дней с момента создания объекта до его удаления.
Совет
Используйте Prefix для целевых удалений, например temp/ или backups/daily/.
Применение политики
Выполните команду:
aws s3api put-bucket-lifecycle-configuration \
--bucket my-bucket \
--endpoint https://nyc3.digitaloceanspaces.com \
--lifecycle-configuration file://my-policy.jsonПодставьте имя вашего бакета и регион.
Проверка применённой политики:
aws s3api get-bucket-lifecycle-configuration \
--bucket my-bucket \
--endpoint https://nyc3.digitaloceanspaces.comКоманда вернёт JSON правил, привязанных к бакету.
Критерии приёмки
- Команда get-bucket-lifecycle-configuration возвращает JSON с ожидаемыми правилами.
- После наступления срока Expiration объекты удаляются автоматически.
Несколько правил
В Rules можно добавить несколько правил, чтобы по-разному обрабатывать разные префиксы. Пример:
{
"Rules": [
{
"ID": "Prune Invoices",
"Status": "Enabled",
"Prefix": "invoices/",
"Expiration": {
"Days": 90
}
},
{
"ID": "Prune Quotations",
"Status": "Enabled",
"Prefix": "quotations/",
"Expiration": {
"Days": 30
}
}
]
}Заметки
- Каждому бакету разрешено до 100 правил.
- Правила обрабатываются независимо; если несколько правил применимы к одному объекту, может быть выбрано поведение в соответствии с S3-логикой (обычно наиболее ранняя дата удаления).
Очистка незавершённых multipart-загрузок
При больших файлах S3 API разбивает загрузку на части. Если клиент прерывается, остаются незавершённые части, которые занимают место. Добавьте правило AbortIncompleteMultipartUpload:
{
"Rules": [
{
"ID": "AbortIncompleteMultipartUpload",
"Prefix": "",
"Status": "Enabled",
"AbortIncompleteMultipartUpload": {
"DaysAfterInitiation": 1
}
}
]
}Это приведёт к очистке незавершённых частей через 1 день после инициации загрузки. Помните, что после удаления частей восстановить оригинальную загрузку нельзя — клиент должен начать заново.
Частые ошибки и способы исправления
Неправильный endpoint
- Симптом: ошибка соединения или попытка аутентификации к AWS.
- Решение: добавить –endpoint=https://
.digitaloceanspaces.com.
Неправильное значение Status
- Симптом: команда put-bucket-lifecycle-configuration может принять JSON, но поведение правил не соответствует ожиданиям; если значение Status не “Enabled”/“Disabled”, правило некорректно.
- Решение: убедитесь, что Status: “Enabled”.
Неправильный синтаксис JSON
- Симптом: ошибка парсинга от aws cli.
- Решение: проверяйте JSON через jsonlint или запуская aws s3api get-bucket-lifecycle-configuration после загрузки.
Разрешения ключа
- Симптом: AccessDenied при вызове put-bucket-lifecycle-configuration.
- Решение: проверьте, что ключ принадлежит учётной записи с правами на управление конфигурацией Space.
Тестовые случаи и приёмка
Тест применения правила
- Создайте тестовый бакет и загрузите объект test-ttl.txt.
- Примените policy с Expiration.Days = 1.
- Убедитесь, что через 24–48 часов объект удалён.
Тест префиксов
- Создайте два объекта: temp/a.txt и data/b.txt.
- Примените правило с Prefix: “temp/“ и Days: 1.
- Проверьте, что удалился только temp/a.txt.
Тест AbortIncompleteMultipartUpload
- Инициируйте multipart-загрузку и не завершайте её.
- Примените правило с DaysAfterInitiation = 1.
- Проверьте, что через указанный период незавершённые части исчезли.
SOP для команды DevOps
Шаги для безопасного внедрения политики в production
- Подготовка
- Создать backup текущей конфигурации бакета (если есть другие политики).
- Тестировать на копии бакета или в тестовом проекте.
- Валидация JSON
- Проверить синтаксис JSON-инструментом.
- Применение
- Выполнить put-bucket-lifecycle-configuration с –endpoint.
- Мониторинг
- Проверить через get-bucket-lifecycle-configuration.
- Отслеживать логи и используемое пространство в течение 48–72 часов.
- Откат
- Если нужно вернуть ранее: выполнить put-bucket-lifecycle-configuration с прежним JSON или пустым Rules для удаления правил.
Критерии приёмки
- Политика присутствует в конфигурации бакета.
- Непрошедшие объекты удаляются в ожидаемый срок.
- Нет побочных удалений нужных данных.
Рекомендации по безопасности и хранению секретов
- Никогда не сохраняйте секреты в коммитах репозитория.
- Храните ключи в защищённых хранилищах (Vault, Secret Manager) и выдавайте временные креды для CI/CD.
- Ограничьте права ключа минимально необходимыми операциями.
Когда политики не решают задачу
Контрпримеры
- Если вам нужна автоматическая миграция между классами хранения (например, переход к архивному классу), DigitalOcean Spaces такой возможности не предоставляет — это характерно для S3 Glacier и других классов AWS. В этом случае политика жизненного цикла не даст экономии, потому что у Spaces один тарифный план.
Альтернативные подходы
- Хранение старых данных в другом Space с периодической ротацией через cron и aws s3 mv/cp.
- Экспорт метаданных и использование внешнего оркестра для удаления по собственной логике.
Шаблоны и сниппеты
Пример политики с комбинированными правилами (expiration + abort):
{
"Rules": [
{
"ID": "Cleanup temp",
"Status": "Enabled",
"Prefix": "temp/",
"Expiration": { "Days": 7 }
},
{
"ID": "Abort incomplete",
"Status": "Enabled",
"Prefix": "",
"AbortIncompleteMultipartUpload": { "DaysAfterInitiation": 2 }
}
]
}Чеклист перед применением политики
- Сделан бэкап существующей конфигурации
- JSON валиден
- Проверен endpoint
- Ключи доступа действительны
- Проведён тест на тестовом бакете
Модель принятия решения
Mermaid диаграмма для выбора политики
flowchart TD
A[Есть требование удалять устаревшие файлы?] -->|Нет| B[Не применять политики]
A -->|Да| C[Есть разные классы файлов?]
C -->|Да| D[Использовать Prefix для группировки]
C -->|Нет| E[Применить одно правило для всего бакета]
D --> F[Указать Days для каждой группы]
E --> F
F --> G[Добавить AbortIncompleteMultipartUpload если есть большие файлы]
G --> H[Применить policy через AWS CLI с --endpoint]1‑строчное глоссарий
- Space — бакет в DigitalOcean, S3-совместимый контейнер объектов.
- Expiration — автоматическое удаление объекта по возрасту.
- AbortIncompleteMultipartUpload — удаление незавершённых частей multipart-загрузки.
- Prefix — префикс ключа объекта, используется для группировки объектов.
Короткое объявление для команды (пример)
Мы настроили автоматическую очистку устаревших объектов в DigitalOcean Spaces с помощью S3-совместимых политик жизненного цикла. Политики применяются через aws cli с указанием endpoint региона. Это уменьшит ручную ротацию и снизит объём занимаемого места в Spaces для временных данных.
Итог
DigitalOcean Spaces поддерживает S3-подобные политики жизненного цикла, хотя UI не предоставляет инструментов для их управления. Используя aws cli и указывая endpoint вашего региона, вы можете применять правила удаления по возрасту и автоматически очищать незавершённые multipart-загрузки. Внедряйте политики сначала в тестовой среде, проверяйте JSON и права доступа, и используйте Prefix для тонкой настройки.
Важно
Переход объектов между классами хранения в DigitalOcean недоступен, поэтому экономии за счёт смены класса не произойдёт — удаление остаётся основным инструментом для управления объёмом.
Похожие материалы
Как установить HarmonyOS 2.0 на Huawei
Изменить фон в Microsoft Teams — быстрое руководство
Мгновенные видео‑сообщения в WhatsApp
Кнопка Action на iPhone без физической кнопки
Flatseal: управление правами Flatpak на Linux