Автоматическое удаление старых резервных копий из облака через скрипт

Как настроить автоматическое удаление старых резервных копий из облака через скрипт

Автоматическое удаление старых резервных копий из облака реализуется через скрипты с использованием официальных SDK или CLI-инструментов облачных провайдеров в сочетании с системным планировщиком задач. Это экономит место хранения, снижает затраты и исключает ручное управление копиями.

Зачем нужна автоматизация удаления резервных копий

  • Экономия денежных средств за счёт уменьшения объёма хранилища
  • Освобождение места в облаке для новых резервных копий
  • Соответствие политике хранения данных (compliance)
  • Исключение ручного контроля и человеческих ошибок
  • Автоматизация рутинных операций обслуживания

Подготовка к настройке скрипта

  • Доступ к облачному аккаунту с правами на создание и удаление объектов
  • Установленный язык программирования (Python, Node.js, Bash)
  • AWS CLI, Google Cloud SDK, Azure CLI или аналогичные инструменты провайдера
  • Учётные данные (API-ключи, токены доступа) с необходимыми разрешениями
  • Доступ к системному планировщику (cron на Linux, Task Scheduler на Windows)

Инструкция для Amazon S3

Установка и настройка AWS CLI

  1. Скачайте и установите AWS CLI с официального сайта https://aws.amazon.com/cli/
  2. Откройте терминал и выполните команду aws configure
  3. Введите AWS Access Key ID вашего пользователя IAM
  4. Введите AWS Secret Access Key
  5. Укажите регион по умолчанию (например, eu-west-1)
  6. Нажмите Enter для завершения конфигурации

Создание Python-скрипта для S3

  1. Создайте файл cleanup_s3.py
  2. Вставьте следующий код:
    #!/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()
    
  3. Замените your-bucket-name на название вашего S3-бакета
  4. Измените RETENTION_DAYS на нужное количество дней
  5. Сохраните файл
  6. Выполните команду chmod +x cleanup_s3.py (для Linux/macOS)

Планирование скрипта через cron (Linux/macOS)

  1. Откройте редактор crontab командой crontab -e
  2. Добавьте строку для ежедневного запуска в 2:00 ночи:
    0 2 * * * /usr/bin/python3 /path/to/cleanup_s3.py >> /var/log/s3_cleanup.log 2>&1
  3. Замените /path/to/cleanup_s3.py на полный путь к вашему скрипту
  4. Сохраните изменения (нажмите Ctrl+X, затем Y, затем Enter)

Планирование скрипта через Task Scheduler (Windows)

  1. Откройте Task Scheduler (Планировщик задач)
  2. Нажмите на Create Basic Task (Создать простую задачу)
  3. Введите имя задачи: S3 Backup Cleanup
  4. На вкладке Trigger выберите Daily (Ежедневно)
  5. Установите время запуска (например, 02:00)
  6. На вкладке Action выберите Start a program
  7. В поле Program/script укажите python.exe
  8. В поле Add arguments введите полный путь к скрипту: C:\path\to\cleanup_s3.py
  9. Нажмите Finish

Инструкция для Google Cloud Storage

Установка Google Cloud SDK

  1. Скачайте Google Cloud SDK с https://cloud.google.com/sdk/docs/install
  2. Установите SDK
  3. Откройте терминал и выполните gcloud init
  4. Авторизуйтесь в своём аккаунте Google
  5. Выберите проект для работы

Создание Python-скрипта для GCS

  1. Создайте файл cleanup_gcs.py
  2. Вставьте следующий код:
    #!/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()
    
  3. Замените your-bucket-name на название вашего бакета GCS
  4. Сохраните файл
  5. Выполните pip install google-cloud-storage для установки библиотеки

Развёртывание через Cloud Scheduler

  1. Откройте Google Cloud Console и перейдите в Cloud Scheduler
  2. Нажмите Create Job (Создать задание)
  3. Введите имя: backup-cleanup
  4. Установите частоту запуска в формате cron: 0 2 * * * (ежедневно в 02:00)
  5. В поле Timezone выберите вашу временную зону
  6. В разделе Execution settings выберите Cloud Functions или Cloud Run
  7. Создайте облачную функцию с содержимым вашего скрипта
  8. Нажмите Create

Инструкция для Microsoft Azure

Установка Azure CLI

  1. Скачайте Azure CLI с https://learn.microsoft.com/en-us/cli/azure/install-azure-cli
  2. Установите приложение
  3. Выполните команду az login
  4. Авторизуйтесь в браузере
  5. Убедитесь, что выбрана нужная подписка командой az account show

Создание PowerShell-скрипта для Azure Blob Storage

  1. Создайте файл cleanup_azure.ps1
  2. Вставьте следующий код:
    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"
    
  3. Замените yourstorageaccount на название вашего хранилища
  4. Замените your-resource-group на название группы ресурсов
  5. Сохраните файл

Планирование через Azure Automation

  1. Перейдите в Azure Portal и найдите Automation Accounts
  2. Создайте новый аккаунт автоматизации или откройте существующий
  3. В левом меню выберите Runbooks
  4. Нажмите Create a runbook (Создать runbook)
  5. Введите имя: CleanupBackups
  6. Выберите тип: PowerShell
  7. Нажмите Create
  8. Скопируйте ваш PowerShell-скрипт в редактор
  9. Нажмите Publish
  10. Нажмите Schedule (Расписание)
  11. Нажмите Add a schedule
  12. Установите повторение: Recurring, время: 02:00, интервал: 1 день
  13. Нажмите Create

Инструкция для Yandex Cloud

Установка Yandex Cloud CLI

  1. Скачайте Yandex Cloud CLI с официального сайта
  2. Установите приложение
  3. Выполните yc init
  4. Пройдите авторизацию
  5. Выберите каталог (folder) для работы

Создание Bash-скрипта для Yandex S3

  1. Создайте файл cleanup_yandex.sh
  2. Вставьте следующий код:
    #!/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 "Очистка завершена"
    
  3. Замените your-bucket-name на название бакета
  4. Введите ACCESS_KEY и SECRET_KEY вашего сервисного аккаунта
  5. Сохраните файл
  6. Выполните chmod +x cleanup_yandex.sh

Планирование через cron на Linux

  1. Откройте редактор crontab: crontab -e
  2. Добавьте строку:
    0 2 * * * /path/to/cleanup_yandex.sh >> /var/log/yandex_cleanup.log 2>&1
  3. Сохраните файл

Инструкция для DigitalOcean Spaces

Установка и настройка doctl

  1. Скачайте и установите doctl (DigitalOcean CLI) с https://docs.digitalocean.com/reference/doctl/
  2. Выполните команду doctl auth init
  3. Введите ваш API-токен DigitalOcean
  4. Подтвердите конфигурацию

Создание Python-скрипта для DigitalOcean Spaces

  1. Создайте файл cleanup_spaces.py
  2. Вставьте следующий код:
    #!/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()
    
  3. Замените your-space-name на название вашего Space
  4. Введите ACCESS_KEY и SECRET_KEY
  5. Сохраните файл
  6. Установите boto3: pip install boto3

Планирование через cron

  1. Откройте crontab: crontab -e
  2. Добавьте строку для ежедневного запуска:
    0 2 * * * /usr/bin/python3 /path/to/cleanup_spaces.py >> /var/log/spaces_cleanup.log 2>&1
  3. Сохраните файл

Мониторинг и логирование

Добавление логирования в Python-скрипты

  1. Модифицируйте начало скрипта для добавления логирования:
    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("Начало процесса удаления старых резервных копий")
    
  2. Замените вызовы print() на logging.info()
  3. Добавьте обработку ошибок с логированием: logging.error(str(e))

Отправка уведомлений на email

  1. Установите библиотеку: pip install python-dotenv
  2. Добавьте в начало скрипта:
    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)}")
    
  3. Вызовите функцию после удаления объектов:
    send_email_notification(
        "Backup Cleanup Report",
        f"Удалено объектов: {deleted_count}\nДата: {datetime.now()}",
        "Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript."
    )
    

Безопасность и лучшие практики

Хранение учётных данных

  1. Не пишите API-ключи и пароли непосредственно в скриптах
  2. Используйте переменные окружения для хранения чувствительных данных
  3. На Linux/macOS создайте файл .env:
    export AWS_ACCESS_KEY_ID="your-key"
    export AWS_SECRET_ACCESS_KEY="your-secret"
    
  4. Выполните команду source .env перед запуском скрипта
  5. Ограничьте доступ к файлу: chmod 600 .env
  6. На Windows используйте setx для установки переменных окружения

Управление правами доступа

  1. Создайте отдельного пользователя или сервисный аккаунт для скриптов
  2. Назначьте минимально необходимые разрешения (только удаление и чтение объектов)
  3. Для 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/*"
          ]
        }
      ]
    }
    
  4. Прикрепите политику к пользователю или роли

Тестирование скрипта

  1. Сначала запустите скрипт в режиме «сухого прогона» (без удаления):
    #!/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'])
    
  2. Запустите скрипт вручную: python3 cleanup_s3.py
  3. Проверьте логи на ошибки
  4. Убедитесь, что удаляются только старые файлы
  5. После проверки установите DRY_RUN = False

Резервная копия перед удалением (опционально)

  1. Перед удалением файла перемещайте его в отдельную папку архива:
    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}")
    
  2. Вызовите функцию вместо обычного удаления
  3. Установите отдельный период удаления для архива (например, 90 дней)

Часто задаваемые вопросы

Может ли скрипт удалить все резервные копии случайно? Нет, если правильно установлены фильтры по дате и префиксу папки. Используйте режим сухого прогона для предварительной проверки списка файлов перед удалением.

Как часто следует запускать скрипт очистки? Рекомендуется ежедневный запуск в ночное время (например, в 02:00), чтобы минимизировать влияние на рабочие процессы. Период удержания копий зависит от требований: обычно 30–90 дней.

Какие логи помогут отследить проблемы с удалением копий? Настройте запись всех операций в файл логов с указанием даты, времени, названия удалённого файла и статуса операции. Проверяйте логи еженедельно и отправляйте уведомления об ошибках через email или систему мониторинга.

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

Макросы и автокликер внутри эмулятора BlueStacks для автоматизации задач
Ошибка сбоя инициализации видеокарты в эмуляторе Nox
Освободить место на жестком диске используя функцию Диск-О или Облако