Загрузка и хранение дампов в Yandex S3

2 minute read

img

Регистрация в Yandex Cloud

Регистрируемся в https://console.yandex.cloud/
Создаем платежный аккаунт и получаем 2 стартовых гранта на 4000 рублей

Нажимаем Поиск, вводим Object Storage, далее Создать бакет.

img

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

img

Далее нам необходимо создать сервисную запись: возвращаемся к поиску и вводим Identity and Access Managament, далее Создать сервисный аккаунт.

img

Вводим имя, описание и выбираем роли. Так как нас интересует работа с хранищем, то выбираем: stogare.viewer, storage.editor, storage.uploader.

img

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

img

Обязательно сохраняем Идентификатор ключа и сам секретный ключ.

img

После создания возвращаемся в наш бакет и нажимаем Настроить ACL.

img

Добавляем сюда наш сервисный аккаунт и правами READ и WRITE. Нажимаем Добавить и Сохранить.

img

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

Автоматизация

В качестве примера будем рассматривать бэкапирование PostgreSQL в s3 бакет.

Создаем в домашней дирекории 2 файла и директорию .aws/credentials, файл pgpass необходим для того, чтобы команда снятия дампа не запрашивала пароль.

cd $HOME ;\
touch ~/.pgpass ;\
chmod 600 ~/.pgpass ;\
mkdir -p ~/.aws ;\
touch ~/.aws/credentials

Формат файла .pgpass

localhost:5432:database_name:username:password

Формат файла .aws/credentials

[default]
aws_access_key_id = <>
aws_secret_access_key = <>

Снимаем дамп с помощью pg_dump, сжимаем с помощью gzip и шифруем с помощью openssl.
<your ssl decrypt password> - меняем на свой пароль.

pg_dump database_name  \
-U user \
-h localhost \
-v \
| gzip -c --best \
| openssl enc \
-aes-256-cbc \
-salt \
-pbkdf2 \
-iter 100000 \
-out <output file> \
-pass pass:<your ssl decrypt password>

Для расшифровки файла используем команду

openssl enc -d \
-aes-256-cbc \
-pbkdf2 \
-iter 100000 \
-in pg_dump_2025-04-24.sql.gz.enc \
-out pg_dump_2025-04-24.sql.gz \
-pass pass:<your ssl decrypt password>

Для распаковки файла используем команду

gzip -f -k -d pg_dump_2025-04-24.sql.gz > pg_dump_2025-04-24.sql

Готовый python код

Для работы с s3 нам понадобится библиотека boto3, ниже прикладываю упрощенный вариант скрипта загрузки файла в бакет.

import boto3

S3_BUCKET = "bucket name"
DUMP_FILE_NAME = "pg_dump_2025-04-24.sql.gz.enc"

def get_s3_instance():
    session = boto3.session.Session()
    return session.client(
        service_name='s3',
        endpoint_url='https://storage.yandexcloud.net'
    )

def upload_dump_to_s3(dump_file: str):
    get_s3_instance().upload_file(
        Filename=dump_file,
        Bucket=S3_BUCKET,
        Key=dump_file
    )

if __name__ == "__main__":
    get_s3_instance().upload_dump_to_s3(DUMP_FILE_NAME)

Большое спасибо всем за внимание! Если вам интересны подобные рассуждения - подписывайтесь на мой канал  Telegram_logo artydev & Co.