Цель

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

Описание

Критически важные снимки создаются каждый день в 18:00, срок жизни 7 дней. Все снимки один раз в неделю в воскресение в 08:00, срок жизни 14 день. Удаление снимков выполняется ежедневно в 23:59.

Графическая схема ссылка

За основу взята публикация https://cloud.yandex.ru/blog/posts/2020/01/snapshot-triggers. После прочтения выявились нюансы:

  • наименование моментального диска формируется из id, что не позволяет различить их
  • нет инструкции по удалению снимков

Ниже приводится пример где

  • имя моментального снимка будет в формате: <Название диск>-ГГГГ-ММ-ДД
  • моментальные снимки будут иметь атрибут срок жизни
  • триггер по удалению снимков с истекшим сроком жизни

Пометим диски для создания снимков

Возможно потребуется инициализация cli, начало работы с CLI

Получим список дисков

yc compute disk list

чтобы получить с метками воспользуемся ConvertFrom-Json

(yc compute disk list --format json | ConvertFrom-Json) | Select id,name,status,labels

Дискам в зависимости от цели установим метки (labels)

  • snapshot-default - все диски для которых выполняются снимки
  • snapshot-critical - только те диски для которых нужно выполнять снимки чаще
yc compute disk update --id <id диска> --labels snapshot-default=14 --labels snapshot-critical=7
yc compute disk update --id <id диска> --labels snapshot-default=14

Если потребуется удалить labels

yc compute disk remove-labels --id <id диска> --labels snapshot-default
yc compute disk remove-labels --id <id диска> --labels snapshot-critical

Создадим функции

Описание метода create https://cloud.yandex.ru/docs/compute/api-ref/Snapshot/create

Создание моментальных снимков для критичных данных с жизненным циклом 7 дней

Будет запускается каждый день

create-snapshot-critical

// Префикс имени диска ГГГГ-ММ-ДД
let today = new Date();
var yyyymmdd = today.toISOString().substring(0, 10);
var hh = today.getHours().toString();
var mm = today.getMinutes().toString();
var ss = today.getSeconds().toString();
var yyyymmddhhmmss = yyyymmdd + "-" + hh + mm + ss;

// Метка диска жизненный цикл
let label = {
   "lifecycle": "7"
};

const ycsdk = require("yandex-cloud/api/compute/v1");
const FOLDER_ID = process.env.FOLDER_ID;
const snapshotService = new ycsdk.SnapshotService();
const diskService = new ycsdk.DiskService();

async function handler(event, context) {

    const diskList = await diskService.list({
        folderId: FOLDER_ID,
    });

    for (const disk of diskList.disks) {
        if ('snapshot-critical' in disk.labels) {
            snapshotService.create({
                folderId: FOLDER_ID,
                diskId: disk.id,
                name: disk.name + "-" + yyyymmddhhmmss,
                labels: label
            });
        }
    }

   return {
        statusCode: 200,
        body: JSON.stringify({
            event: event,
            context: context,
            labels: label
        })
    }

}
exports.handler = handler;

Создание моментальных снимков по умолчанию с жизненным циклом 14 дней

Будет запускаться один раз в неделю

create-snapshot-default

// Префикс имени диска ГГГГ-ММ-ДД
let today = new Date();
var yyyymmdd = today.toISOString().substring(0, 10);
var hh = today.getHours().toString();
var mm = today.getMinutes().toString();
var ss = today.getSeconds().toString();
var yyyymmddhhmmss = yyyymmdd + "-" + hh + mm + ss;

// Метка диска жизненный цикл
let label = {
   "lifecycle": "21"
};

const ycsdk = require("yandex-cloud/api/compute/v1");
const FOLDER_ID = process.env.FOLDER_ID;
const snapshotService = new ycsdk.SnapshotService();
const diskService = new ycsdk.DiskService();

async function handler(event, context) {

    const diskList = await diskService.list({
        folderId: FOLDER_ID,
    });

    for (const disk of diskList.disks) {
        if ('snapshot-default' in disk.labels) {
            snapshotService.create({
                folderId: FOLDER_ID,
                diskId: disk.id,
                name: disk.name + "-" + yyyymmddhhmmss,
                labels: label
            });
        }
    }

   return {
        statusCode: 200,
        body: JSON.stringify({
            event: event,
            context: context,
            labels: label
        })
    }

}
exports.handler = handler;

Удаление моментальных снимков с истекшим жизненным циклом

Будет выполнятся каждый день

delete-snapshot-lifecycle

// yc compute snapshot list - список дисков
// yc compute snapshot get <id> - метка диска
// yc compute snapshot update --id <id>  --labels lifecycle=14 // изменение метки

const today = Date.parse(new Date());
const ycsdk = require("yandex-cloud/api/compute/v1");
const FOLDER_ID = process.env.FOLDER_ID;
const snapshotService = new ycsdk.SnapshotService();
const diskService = new ycsdk.DiskService();

module.exports.handler = async function (event, context) {

    const snapList = await snapshotService.list({
    folderId: FOLDER_ID
    });

    for (const snapshot of snapList.snapshots) {
        if ('lifecycle' in snapshot.labels) {
            let createdAt = snapshot.createdAt.seconds.low * 1000;
            let diff = (today - createdAt) / (60 * 60 * 24 * 1000);
            let snapid = snapshot.id;
            let d = snapshot.labels.lifecycle;
            //throw new Error(diff);
            //throw new Error(d);
            if (diff > d) {
                snapshotService.delete({
                folderId: FOLDER_ID,
                snapshotId: snapshot.id
                });
            }
        }
    }

    return {
        statusCode: 200,
        today: `${today}`,
        body: FOLDER_ID//,
        //createdAt: `${createdAt}`,
    };
};

Создадим триггеры таймеры

Описание cron выражение https://cloud.yandex.ru/docs/functions/concepts/trigger/timer#cron-expression

Создание моментальных снимков каждый день в 18:00

cron-snapshot-create-critical

Cron-выражение: 00 18 ? * 2-6 * Функция: create-snapshot-critical

Создание моментальных снимков каждое воскресение в 18:00

cron-snapshot-create-default

Cron-выражение: 00 18 ? * 1 * Функция: create-snapshot-default

Удаление моментальных снимков каждый день в 12:00

cron-snapshot-delete-lifecycle

Cron-выражение: 00 12 ? * * * Функция: delete-snapshot-lifecycle

Просмотр моментальных снимков

(yc compute snapshot list –format json | ConvertFrom-Json) | Select id,name,labels,status

Дата изменения: