Что-то надоело мне вручную делать бэкапы одного проекта, и я отогнав лень, и собрав волю в кулак, решил таки автоматизировать это дело.
За основу я использовал вот эту оригинальную статью из блога Yandex - просмотрите её сначала, чтобы понимать о чем идет речь ниже. (как заметил в комментарии автор этой статьи Николай Матросов, оригинальная статья была написана для Medium и находится здесь с некоторыми дополнениями).
Но так, как мне было лень заморачиваться с зипованием архива, как описано в статье, то я просто скопипастил скрипт в редактор скриптов:
Не забудьте еще создать файл 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.
Upd: Как подсказали в комментариях, сейчас практически уже вышла новая версия v2 SDK поддерживающая все функции облака, и если вы планируете расширять функционал скрипта, то посмотрите в ее сторону, но придется немного переписать скрипт, так как версии не полностью совместимы.
Протестировав скрипт, я убедился что он работает, и создал триггер для запуска этой функции по расписанию.
Но! Моя ленивая натура понимала, что мне всё еще вручную придется удалять старые снапшоты: новые создаваться не будут после привышения квоты на общий размер снапшотов или их количества.
Поэтому я, повторно взял волю в кулак, и решил довести святое бэкап-дело до конца.
Не вдаваясь в подробности про небольшую возню с 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 - сколько дней хранить снапшоты.
Уверен, кому-то это сэкономит пару часов драгоценного времени.
Всем благ и надежных бакапов!