Нет возможности пользоваться вложенными папками в хранилище.
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")
Я так понимаю, что необходимо влиять на префикс имени файла, который используется как для бекапа:
@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 параметра для подстановки - может что-то ещё добавить?
Если я правильно понял логику то при восстановлении берется имя бд и делается поиск по бакету всех совпадений, после того как найдены все подходящие бекапы производится поиск самого последнего, и он восстанавливается в бд. Если поиск происходит по бакету, то в принципе для такого алгоритма восстановления неважно где в бакете лежит файл, главное чтобы соблюдалось правильное наименование. Если поис все же делается по директории тогда нужно четко задавать параметры задания этой директории, или цепочки директорий.
- Имя файла всегда должно содержать имя оригинальной бд и временную метку бекпа.
- В идеале путь должен формироваться автоматически и состоять из имябакета/имясервера/имяфайла.
- Параметр нужно иметь возможность переопределить. Задать вручную.
В версии 0.2.2 попробуй так задать переменную:
UBAREC_FILENAME_PREFIX={hostname}/{backup_name}__