Гид по технологиям

Автоматическое удаление объектов в DigitalOcean Spaces через политики жизненного цикла

6 min read DevOps Обновлено 14 Dec 2025
Политики жизненного цикла в DigitalOcean Spaces
Политики жизненного цикла в DigitalOcean Spaces

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

Логотип DigitalOcean

Что делает эта инструкция

Эта статья показывает, как настроить автоматическое удаление (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.

Получение ключей доступа

  1. Откройте DigitalOcean Control Panel.
  2. В левой панели нажмите ссылку “API”.
  3. Под заголовком “Spaces access keys” нажмите Generate New Key.

Скриншот создания ключа доступа DigitalOcean Spaces

  1. Дайте ключу имя и подтвердите. Сохраните Access Key и Secret.

В терминале выполните:

aws configure

и введите Access Key и Secret, когда вас попросят.

Примечание о endpoint

Официальный клиент S3 не сохраняет кастомный endpoint вместе с профилем. Это значит, что в каждой команде нужно передавать флаг –endpoint=https://.digitaloceanspaces.com, например:

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.

Тестовые случаи и приёмка

  1. Тест применения правила

    • Создайте тестовый бакет и загрузите объект test-ttl.txt.
    • Примените policy с Expiration.Days = 1.
    • Убедитесь, что через 24–48 часов объект удалён.
  2. Тест префиксов

    • Создайте два объекта: temp/a.txt и data/b.txt.
    • Примените правило с Prefix: “temp/“ и Days: 1.
    • Проверьте, что удалился только temp/a.txt.
  3. Тест AbortIncompleteMultipartUpload

    • Инициируйте multipart-загрузку и не завершайте её.
    • Примените правило с DaysAfterInitiation = 1.
    • Проверьте, что через указанный период незавершённые части исчезли.

SOP для команды DevOps

Шаги для безопасного внедрения политики в production

  1. Подготовка
    • Создать backup текущей конфигурации бакета (если есть другие политики).
    • Тестировать на копии бакета или в тестовом проекте.
  2. Валидация JSON
    • Проверить синтаксис JSON-инструментом.
  3. Применение
    • Выполнить put-bucket-lifecycle-configuration с –endpoint.
  4. Мониторинг
    • Проверить через get-bucket-lifecycle-configuration.
    • Отслеживать логи и используемое пространство в течение 48–72 часов.
  5. Откат
    • Если нужно вернуть ранее: выполнить 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 недоступен, поэтому экономии за счёт смены класса не произойдёт — удаление остаётся основным инструментом для управления объёмом.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Как установить HarmonyOS 2.0 на Huawei
Мобильные ОС

Как установить HarmonyOS 2.0 на Huawei

Изменить фон в Microsoft Teams — быстрое руководство
Microsoft Teams

Изменить фон в Microsoft Teams — быстрое руководство

Мгновенные видео‑сообщения в WhatsApp
Мессенджеры

Мгновенные видео‑сообщения в WhatsApp

Кнопка Action на iPhone без физической кнопки
Гайды

Кнопка Action на iPhone без физической кнопки

Flatseal: управление правами Flatpak на Linux
Linux

Flatseal: управление правами Flatpak на Linux

Lubuntu в стиле Windows XP — полное руководство
Linux

Lubuntu в стиле Windows XP — полное руководство