Автоматическое удаление старых резервных копий из облака реализуется через скрипты с использованием официальных SDK или CLI-инструментов облачных провайдеров в сочетании с системным планировщиком задач. Это экономит место хранения, снижает затраты и исключает ручное управление копиями.
Зачем нужна автоматизация удаления резервных копий
- Экономия денежных средств за счёт уменьшения объёма хранилища
- Освобождение места в облаке для новых резервных копий
- Соответствие политике хранения данных (compliance)
- Исключение ручного контроля и человеческих ошибок
- Автоматизация рутинных операций обслуживания
Подготовка к настройке скрипта
- Доступ к облачному аккаунту с правами на создание и удаление объектов
- Установленный язык программирования (Python, Node.js, Bash)
- AWS CLI, Google Cloud SDK, Azure CLI или аналогичные инструменты провайдера
- Учётные данные (API-ключи, токены доступа) с необходимыми разрешениями
- Доступ к системному планировщику (cron на Linux, Task Scheduler на Windows)
Инструкция для Amazon S3
Установка и настройка AWS CLI
- Скачайте и установите AWS CLI с официального сайта
https://aws.amazon.com/cli/ - Откройте терминал и выполните команду
aws configure - Введите
AWS Access Key IDвашего пользователя IAM - Введите
AWS Secret Access Key - Укажите регион по умолчанию (например,
eu-west-1) - Нажмите
Enterдля завершения конфигурации
Создание Python-скрипта для S3
- Создайте файл
cleanup_s3.py - Вставьте следующий код:
#!/usr/bin/env python3 import boto3 from datetime import datetime, timedelta import sys # Укажите название бакета и количество дней для сохранения копий BUCKET_NAME = "your-bucket-name" RETENTION_DAYS = 30 PREFIX = "backups/" # Папка с резервными копиями s3_client = boto3.client('s3') def delete_old_backups(): try: response = s3_client.list_objects_v2(Bucket=BUCKET_NAME, Prefix=PREFIX) if 'Contents' not in response: print("Нет объектов для удаления") return cutoff_date = datetime.now(response['Contents'][0]['LastModified'].tzinfo) - timedelta(days=RETENTION_DAYS) deleted_count = 0 for obj in response['Contents']: if obj['LastModified'] < cutoff_date: s3_client.delete_object(Bucket=BUCKET_NAME, Key=obj['Key']) print(f"Удалён: {obj['Key']}") deleted_count += 1 print(f"Всего удалено объектов: {deleted_count}") except Exception as e: print(f"Ошибка: {str(e)}", file=sys.stderr) sys.exit(1) if __name__ == "__main__": delete_old_backups() - Замените
your-bucket-nameна название вашего S3-бакета - Измените
RETENTION_DAYSна нужное количество дней - Сохраните файл
- Выполните команду
chmod +x cleanup_s3.py(для Linux/macOS)
Планирование скрипта через cron (Linux/macOS)
- Откройте редактор crontab командой
crontab -e - Добавьте строку для ежедневного запуска в 2:00 ночи:
0 2 * * * /usr/bin/python3 /path/to/cleanup_s3.py >> /var/log/s3_cleanup.log 2>&1 - Замените
/path/to/cleanup_s3.pyна полный путь к вашему скрипту - Сохраните изменения (нажмите
Ctrl+X, затемY, затемEnter)
Планирование скрипта через Task Scheduler (Windows)
- Откройте
Task Scheduler(Планировщик задач) - Нажмите на
Create Basic Task(Создать простую задачу) - Введите имя задачи:
S3 Backup Cleanup - На вкладке
TriggerвыберитеDaily(Ежедневно) - Установите время запуска (например,
02:00) - На вкладке
ActionвыберитеStart a program - В поле
Program/scriptукажитеpython.exe - В поле
Add argumentsвведите полный путь к скрипту:C:\path\to\cleanup_s3.py - Нажмите
Finish
Инструкция для Google Cloud Storage
Установка Google Cloud SDK
- Скачайте Google Cloud SDK с
https://cloud.google.com/sdk/docs/install - Установите SDK
- Откройте терминал и выполните
gcloud init - Авторизуйтесь в своём аккаунте Google
- Выберите проект для работы
Создание Python-скрипта для GCS
- Создайте файл
cleanup_gcs.py - Вставьте следующий код:
#!/usr/bin/env python3 from google.cloud import storage from datetime import datetime, timedelta import sys # Параметры BUCKET_NAME = "your-bucket-name" RETENTION_DAYS = 30 PREFIX = "backups/" storage_client = storage.Client() bucket = storage_client.bucket(BUCKET_NAME) def delete_old_backups(): try: cutoff_date = datetime.utcnow() - timedelta(days=RETENTION_DAYS) deleted_count = 0 for blob in bucket.list_blobs(prefix=PREFIX): if blob.time_created.replace(tzinfo=None) < cutoff_date: bucket.delete_blob(blob.name) print(f"Удалён: {blob.name}") deleted_count += 1 print(f"Всего удалено объектов: {deleted_count}") except Exception as e: print(f"Ошибка: {str(e)}", file=sys.stderr) sys.exit(1) if __name__ == "__main__": delete_old_backups() - Замените
your-bucket-nameна название вашего бакета GCS - Сохраните файл
- Выполните
pip install google-cloud-storageдля установки библиотеки
Развёртывание через Cloud Scheduler
- Откройте Google Cloud Console и перейдите в
Cloud Scheduler - Нажмите
Create Job(Создать задание) - Введите имя:
backup-cleanup - Установите частоту запуска в формате cron:
0 2 * * *(ежедневно в 02:00) - В поле
Timezoneвыберите вашу временную зону - В разделе
Execution settingsвыберитеCloud FunctionsилиCloud Run - Создайте облачную функцию с содержимым вашего скрипта
- Нажмите
Create
Инструкция для Microsoft Azure
Установка Azure CLI
- Скачайте Azure CLI с
https://learn.microsoft.com/en-us/cli/azure/install-azure-cli - Установите приложение
- Выполните команду
az login - Авторизуйтесь в браузере
- Убедитесь, что выбрана нужная подписка командой
az account show
Создание PowerShell-скрипта для Azure Blob Storage
- Создайте файл
cleanup_azure.ps1 - Вставьте следующий код:
param( [string]$StorageAccountName = "yourstorageaccount", [string]$ContainerName = "backups", [int]$RetentionDays = 30 ) # Получение контекста хранилища $storageAccount = Get-AzStorageAccount -ResourceGroupName "your-resource-group" -Name $StorageAccountName $storageContext = $storageAccount.Context # Получение списка блобов $blobs = Get-AzStorageBlob -Container $ContainerName -Context $storageContext $cutoffDate = (Get-Date).AddDays(-$RetentionDays) $deletedCount = 0 foreach ($blob in $blobs) { if ($blob.LastModified -lt $cutoffDate) { Remove-AzStorageBlob -Blob $blob.Name -Container $ContainerName -Context $storageContext -Force Write-Host "Удалён: $($blob.Name)" $deletedCount++ } } Write-Host "Всего удалено объектов: $deletedCount" - Замените
yourstorageaccountна название вашего хранилища - Замените
your-resource-groupна название группы ресурсов - Сохраните файл
Планирование через Azure Automation
- Перейдите в Azure Portal и найдите
Automation Accounts - Создайте новый аккаунт автоматизации или откройте существующий
- В левом меню выберите
Runbooks - Нажмите
Create a runbook(Создать runbook) - Введите имя:
CleanupBackups - Выберите тип:
PowerShell - Нажмите
Create - Скопируйте ваш PowerShell-скрипт в редактор
- Нажмите
Publish - Нажмите
Schedule(Расписание) - Нажмите
Add a schedule - Установите повторение:
Recurring, время:02:00, интервал:1 день - Нажмите
Create
Инструкция для Yandex Cloud
Установка Yandex Cloud CLI
- Скачайте Yandex Cloud CLI с официального сайта
- Установите приложение
- Выполните
yc init - Пройдите авторизацию
- Выберите каталог (folder) для работы
Создание Bash-скрипта для Yandex S3
- Создайте файл
cleanup_yandex.sh - Вставьте следующий код:
#!/bin/bash BUCKET_NAME="your-bucket-name" RETENTION_DAYS=30 ACCESS_KEY="your-access-key" SECRET_KEY="your-secret-key" ENDPOINT="https://storage.yandexcloud.net" # Экспортируем переменные окружения для AWS CLI export AWS_ACCESS_KEY_ID=$ACCESS_KEY export AWS_SECRET_ACCESS_KEY=$SECRET_KEY # Получаем список файлов и удаляем старые CUTOFF_DATE=$(date -d "$RETENTION_DAYS days ago" +%s) aws s3api list-objects-v2 \ --bucket $BUCKET_NAME \ --endpoint-url $ENDPOINT \ --query 'Contents[].{Key:Key,Modified:LastModified}' \ --output text | while read key modified; do MODIFIED_DATE=$(date -d "$modified" +%s) if [ $MODIFIED_DATE -lt $CUTOFF_DATE ]; then aws s3api delete-object \ --bucket $BUCKET_NAME \ --key "$key" \ --endpoint-url $ENDPOINT echo "Удалён: $key" fi done echo "Очистка завершена" - Замените
your-bucket-nameна название бакета - Введите
ACCESS_KEYиSECRET_KEYвашего сервисного аккаунта - Сохраните файл
- Выполните
chmod +x cleanup_yandex.sh
Планирование через cron на Linux
- Откройте редактор crontab:
crontab -e - Добавьте строку:
0 2 * * * /path/to/cleanup_yandex.sh >> /var/log/yandex_cleanup.log 2>&1 - Сохраните файл
Инструкция для DigitalOcean Spaces
Установка и настройка doctl
- Скачайте и установите
doctl(DigitalOcean CLI) сhttps://docs.digitalocean.com/reference/doctl/ - Выполните команду
doctl auth init - Введите ваш API-токен DigitalOcean
- Подтвердите конфигурацию
Создание Python-скрипта для DigitalOcean Spaces
- Создайте файл
cleanup_spaces.py - Вставьте следующий код:
#!/usr/bin/env python3 import boto3 from datetime import datetime, timedelta import sys # Параметры SPACE_NAME = "your-space-name" REGION = "nyc3" RETENTION_DAYS = 30 PREFIX = "backups/" ACCESS_KEY = "your-access-key" SECRET_KEY = "your-secret-key" # Инициализация S3-клиента для Spaces s3_client = boto3.client( 's3', region_name=REGION, endpoint_url=f'https://{REGION}.digitaloceanspaces.com', aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY ) def delete_old_backups(): try: response = s3_client.list_objects_v2(Bucket=SPACE_NAME, Prefix=PREFIX) if 'Contents' not in response: print("Нет объектов для удаления") return cutoff_date = datetime.now(response['Contents'][0]['LastModified'].tzinfo) - timedelta(days=RETENTION_DAYS) deleted_count = 0 for obj in response['Contents']: if obj['LastModified'] < cutoff_date: s3_client.delete_object(Bucket=SPACE_NAME, Key=obj['Key']) print(f"Удалён: {obj['Key']}") deleted_count += 1 print(f"Всего удалено объектов: {deleted_count}") except Exception as e: print(f"Ошибка: {str(e)}", file=sys.stderr) sys.exit(1) if __name__ == "__main__": delete_old_backups() - Замените
your-space-nameна название вашего Space - Введите
ACCESS_KEYиSECRET_KEY - Сохраните файл
- Установите boto3:
pip install boto3
Планирование через cron
- Откройте crontab:
crontab -e - Добавьте строку для ежедневного запуска:
0 2 * * * /usr/bin/python3 /path/to/cleanup_spaces.py >> /var/log/spaces_cleanup.log 2>&1 - Сохраните файл
Мониторинг и логирование
Добавление логирования в Python-скрипты
- Модифицируйте начало скрипта для добавления логирования:
import logging from datetime import datetime # Настройка логирования log_file = f"/var/log/backup_cleanup_{datetime.now().strftime('%Y-%m-%d')}.log" logging.basicConfig( filename=log_file, level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s' ) logging.info("Начало процесса удаления старых резервных копий") - Замените вызовы
print()наlogging.info() - Добавьте обработку ошибок с логированием:
logging.error(str(e))
Отправка уведомлений на email
- Установите библиотеку:
pip install python-dotenv - Добавьте в начало скрипта:
import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart def send_email_notification(subject, body, recipient_email): sender_email = "Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. " sender_password = "your-app-password" message = MIMEMultipart() message["From"] = sender_email message["To"] = recipient_email message["Subject"] = subject message.attach(MIMEText(body, "plain")) try: with smtplib.SMTP_SSL("smtp.gmail.com", 465) as server: server.login(sender_email, sender_password) server.send_message(message) logging.info("Email отправлен успешно") except Exception as e: logging.error(f"Ошибка отправки email: {str(e)}") - Вызовите функцию после удаления объектов:
send_email_notification( "Backup Cleanup Report", f"Удалено объектов: {deleted_count}\nДата: {datetime.now()}", "Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. " )
Безопасность и лучшие практики
Хранение учётных данных
- Не пишите API-ключи и пароли непосредственно в скриптах
- Используйте переменные окружения для хранения чувствительных данных
- На Linux/macOS создайте файл
.env:export AWS_ACCESS_KEY_ID="your-key" export AWS_SECRET_ACCESS_KEY="your-secret" - Выполните команду
source .envперед запуском скрипта - Ограничьте доступ к файлу:
chmod 600 .env - На Windows используйте
setxдля установки переменных окружения
Управление правами доступа
- Создайте отдельного пользователя или сервисный аккаунт для скриптов
- Назначьте минимально необходимые разрешения (только удаление и чтение объектов)
- Для AWS создайте IAM-политику:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetObject", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::your-bucket-name", "arn:aws:s3:::your-bucket-name/backups/*" ] } ] } - Прикрепите политику к пользователю или роли
Тестирование скрипта
- Сначала запустите скрипт в режиме «сухого прогона» (без удаления):
#!/usr/bin/env python3 # Добавьте флаг DRY_RUN в начало скрипта DRY_RUN = True # Замените delete_object на условное удаление: if DRY_RUN: print(f"[DRY RUN] Был бы удалён: {obj['Key']}") else: s3_client.delete_object(Bucket=BUCKET_NAME, Key=obj['Key']) - Запустите скрипт вручную:
python3 cleanup_s3.py - Проверьте логи на ошибки
- Убедитесь, что удаляются только старые файлы
- После проверки установите
DRY_RUN = False
Резервная копия перед удалением (опционально)
- Перед удалением файла перемещайте его в отдельную папку архива:
def archive_before_delete(bucket, key, archive_prefix="archived/"): # Копируем объект в папку архива copy_source = {'Bucket': bucket, 'Key': key} s3_client.copy_object( CopySource=copy_source, Bucket=bucket, Key=archive_prefix + key ) # Затем удаляем оригинальный файл s3_client.delete_object(Bucket=bucket, Key=key) print(f"Заархивирован и удалён: {key}") - Вызовите функцию вместо обычного удаления
- Установите отдельный период удаления для архива (например, 90 дней)
Часто задаваемые вопросы
Может ли скрипт удалить все резервные копии случайно? Нет, если правильно установлены фильтры по дате и префиксу папки. Используйте режим сухого прогона для предварительной проверки списка файлов перед удалением.
Как часто следует запускать скрипт очистки? Рекомендуется ежедневный запуск в ночное время (например, в 02:00), чтобы минимизировать влияние на рабочие процессы. Период удержания копий зависит от требований: обычно 30–90 дней.
Какие логи помогут отследить проблемы с удалением копий? Настройте запись всех операций в файл логов с указанием даты, времени, названия удалённого файла и статуса операции. Проверяйте логи еженедельно и отправляйте уведомления об ошибках через email или систему мониторинга.