
Что-то надоело мне вручную делать бэкапы одного проекта, и я отогнав лень, и собрав волю в кулак, решил таки автоматизировать это дело.
За основу я использовал вот эту оригинальную статью из блога Yandex (просмотрите её сначала, чтобы понимать о чем идет речь ниже).
Но так, как мне было лень заморачиваться с зипованием архива, как описано в статье, то я просто скопипастил скрипт в редактор скриптов:

Не забудьте еще создать файл package.json примерно такого содержания:
{ "name": "snappy-yc", "version": "1.0.0", "description": "", "main": "index.js", "author": "bogdoslavik", "license": "ISC", "dependencies": { "yandex-cloud": "^1.3.3" } }
Тут важна версия "yandex-cloud": "^1.3.3" для Node.js 12.
Протестировав скрипт, я убедился что он работает, и создал триггер для запуска этой функции по расписанию.
Но! Моя ленивая натура понимала, что мне всё еще вручную придется удалять старые снапшоты: новые создаваться не будут после привышения квоты на общий размер снапшотов или их количества.
Поэтому я, повторно взял волю в кулак, и решил довести святое бэкап-дело до конца.
Не вдаваясь в подробности про небольшую возню с created_at снапшота, который хранится в волшебном формате google.protobuf.Timestamp родился вот такой простой скрипт:
const ycsdk = require("yandex-cloud/api/compute/v1"); const FOLDER_ID = process.env.FOLDER_ID; const MAX_DAYS = process.env.MAX_DAYS; async function handler(event, context) { const snapshotService = new ycsdk.SnapshotService(); const diskService = new ycsdk.DiskService(); const diskList = await diskService.list({ folderId: FOLDER_ID, }); console.log('Removing old snapshots'); const {snapshots} = await snapshotService.list({folderId: FOLDER_ID}); for ( let i in snapshots ) { const snapshot = snapshots[i]; const createdMin = Date.now() / 1000 - (60 * 60 * 24 * MAX_DAYS); if ( snapshot && snapshot.createdAt && snapshot.createdAt.seconds.low < createdMin ) { snapshotService.delete({snapshotId: snapshot.id}); } } console.log('Iterating disks'); for (const disk of diskList.disks) { console.log('disk.id',disk.id, 'name:', disk.name); if ('snapshot' in disk.labels) { snapshotService.create({ folderId: FOLDER_ID, diskId: disk.id, description: disk.name }); console.log('Creating snapshot'); } } return {body: 'OK' } } exports.handler = handler;
Перфекционисты могут почикать console.log 🙂
Остается только добавить переменную окружения для скрипта MAX_DAYS — сколько дней хранить снапшоты.

Уверен, кому-то это сэкономит пару часов драгоценного времени.
Всем благ и надежных бакапов!
ссылка на оригинал статьи https://habr.com/ru/post/645719/
Добавить комментарий