Загрузка и хранение дампов в Yandex S3
Регистрация в Yandex Cloud
Регистрируемся в https://console.yandex.cloud/
Создаем платежный аккаунт и получаем 2 стартовых гранта на 4000 рублей
Нажимаем Поиск, вводим Object Storage
, далее Создать бакет
.
Прописываем название бакета, его максимальный размер и класс хранилища, почитать про разницу и тарификацию можно тут. В качестве примера я создаю бакет размером до 100 гигабайт и холодным классом хранилища.
Далее нам необходимо создать сервисную запись: возвращаемся к поиску и вводим Identity and Access Managament
, далее Создать сервисный аккаунт
.
Вводим имя, описание и выбираем роли. Так как нас интересует работа с хранищем, то выбираем: stogare.viewer
, storage.editor
, storage.uploader
.
После создания аккаунта нажимаем Создать новый ключ
, выбирем Создать статический ключ доступа
.
Обязательно сохраняем Идентификатор ключа и сам секретный ключ.
После создания возвращаемся в наш бакет и нажимаем Настроить ACL
.
Добавляем сюда наш сервисный аккаунт и правами READ
и WRITE
. Нажимаем Добавить и Сохранить.
На данном этапе создан бакет, к нему привязан сервисный аккаунт, который может просматривать и загружать объекты в созданное облачное хранилище.
Автоматизация
В качестве примера будем рассматривать бэкапирование 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)
Большое спасибо всем за внимание! Если вам интересны подобные рассуждения - подписывайтесь на мой канал artydev & Co.