Удаление строки пользователя редко автоматически очищает объекты в S3, резервные копии, превью и результаты обработки. Без отдельного процесса система теряет связь с файлами, но продолжает платить за хранение и сохраняет нежелательные данные.

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

Что сделать в первую очередь

  • Не удаляйте user row до получения списка зависимостей.
  • Найдите файлы, превью, экспорты и незавершённые multipart uploads.
  • Проверьте политику retention и legal hold.
  • Определите, какие данные удаляются сразу, а какие по расписанию.

Почему возникает проблема

Файлы часто лежат в нескольких сервисах и не имеют внешнего ключа с каскадным удалением.

  • Ключ объекта не содержит owner_id и не индексируется в базе.
  • Удаляется только основной файл, но остаются превью.
  • Задание очистки падает без повторной попытки.
  • Версионирование bucket сохраняет удалённые версии.
  • Резервная копия не учитывается в политике удаления.

Пошаговая диагностика

  • Постройте карту всех мест хранения и производных файлов.
  • Сравните объекты по префиксу с записями базы.
  • Проверьте versioning, lifecycle и delete markers.
  • Посмотрите dead-letter задания очистки.
  • Выполните тест на специально созданном аккаунте.

Как исправить

Удаление пользователя лучше реализовать как состояние и повторяемый workflow, а не одну транзакцию.

  • Создавайте deletion job с манифестом объектов.
  • Блокируйте вход и загрузки на время обработки.
  • Удаляйте производные данные и версии согласно политике.
  • Повторяйте операции идемпотентно до подтверждения.
  • Храните минимальный аудит без удалённого содержимого.

Как проверить результат

  • После процесса не остаётся доступных объектов пользователя.
  • Повторное выполнение безопасно.
  • Ошибки видны администратору и не теряются.
  • Общие файлы других пользователей не затронуты.

Как не допустить повторения

  • Храните явную связь owner_id — object key.
  • Добавьте lifecycle для временных файлов.
  • Регулярно ищите orphan objects.
  • Документируйте сроки резервных копий.

Чего не стоит делать

  • Не удаляйте объекты по непроверенному широкому префиксу.
  • Не обещайте мгновенную очистку резервных копий, если это технически неверно.
  • Не скрывайте неуспешные задания.

Что подготовить для диагностики

  • Список хранилищ и bucket.
  • Схема связей файлов с пользователем.
  • Настройки versioning и lifecycle.
  • Текущая политика удаления и восстановления.

Частые вопросы

Можно ли использовать каскад в базе?

Каскад удалит связанные строки, но не внешние объекты. Для S3 и других сервисов нужен отдельный workflow.

Что делать с резервными копиями?

Обычно данные исчезают по установленному циклу ротации, а доступ к backup строго ограничивается; точный процесс фиксируют в политике.

Когда стоит обратиться за помощью

Если файлы распределены по нескольким сервисам, сначала нужен безопасный манифест, чтобы не удалить чужие или общие объекты.

Итог

Полное удаление аккаунта — управляемый процесс с проверяемым результатом. Я могу спроектировать очередь очистки, учесть S3-версии и добавить контроль оставшихся объектов.