fgbm/ubarec

Нет возможности пользоваться вложенными папками в хранилище.

Van-Hoffen opened this issue · 3 comments

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

botocore.exceptions.ParamValidationError: Parameter validation failed:
Invalid bucket name "backup_test01\SQL": Bucket name must match the regex "^[a-zA-Z0-9.-_]{1,255}$" or be an ARN matching the regex "^arn:(aws).:(s3|s3-object-lambda):[a-z-0-9]+:[0-9]{12}:accesspoint[/:][a-zA-Z0-9-]{1,63}$|^arn:(aws).:s3-outposts:[a-z-0-9]+:[0-9]{12}:outpost[/:][a-zA-Z0-9-]{1,63}[/:]accesspoint[/:][a-zA-Z0-9-]{1,63}$"

Судя по всему это ограничение на параметр bucket_name библиотеки boto3.
Но загрузка в сабдиректории возможна, нужно только использовать третий параметр key = в котором сейчас задается имя файла используя имя сервера где запускается ПО и имя бекапируемой БД и дата+время.
key=srv-name__dbname__2021-07-24_13-07.7z
Т.к. создание структуры директорий на стороне S3 силами УБАРЕК не совсем правильно и может быть сложно выполнимо. Прошу добавить параметр
UBAREC_BUCKET_PATH
Который будет выполнять роль суффикса при сборке окончательного пути третьего параметра.
т.е. при указании переменной например
UBAREC_BUCKET_PATH=prod-db/dbsrv01
оконечный вид должен быть такой
s3.meta.client.upload_file( "C:\Users...\folder1" + "" + someFile.txt, "your-bucket-name", "prod-db/dbsrv01/dbsrv01-dbname-date+time.txt")

fgbm commented

Я так понимаю, что необходимо влиять на префикс имени файла, который используется как для бекапа:

@property
def s3_filename(self):
    return f'{self.hostname}__{self.driver.backup_name}__{get_now_timestamp()}.7z'.lower()

так и для поиска последнего актуального файла в S3-хранилище при восстановлении:

def find_latest_backup(self) -> str:
    prefix = f'{self.hostname}__{self.driver.backup_name}__'.lower()
    ...

Свойство драйвера СУБД backup_name как правило указывает на имя БД, но в дальнейшем, например в случае SQLite или бекапа отдельных файлов или директорий (1С, к примеру), может указывать на имя файла/директории.

Предлагаю тогда добавить настройку UBAREC_FILENAME_PREFIX и описать логику её определения.

Сейчас есть 2 параметра для подстановки - может что-то ещё добавить?

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

  1. Имя файла всегда должно содержать имя оригинальной бд и временную метку бекпа.
  2. В идеале путь должен формироваться автоматически и состоять из имябакета/имясервера/имяфайла.
  3. Параметр нужно иметь возможность переопределить. Задать вручную.
fgbm commented

В версии 0.2.2 попробуй так задать переменную:

UBAREC_FILENAME_PREFIX={hostname}/{backup_name}__