/yc-serverless-snapshot

A complete solution to make periodic Disc snapshots in Yandex Cloud

Primary LanguageTypeScriptMIT LicenseMIT

UPD 2022-01-06

Пример переписан с использованием нового Nodejs SDK v2 для Yandex Cloud.

Альтернативная реализация на Go. https://github.com/nikolaymatrosov/go-yc-serverless-snapshot

Принцип работы

В облаке существует лимит на количество одновременно запущенных в облаке операций. По умолчанию он равен 15.

Это значит, что если мы хотим делать снепшоты более чем 15 дисков, простое решени с одной функцией которая запустит оперции создания снепшота нам не подойдет.

Чтобы не заморачиваться с ретраями и ожиданием окончания создания снепшота можно воспользоваться очередью сообщений.

И так, первая функция, которая будет триггериться по cron'у будет складывать в очередь сообщений задания для второй функции.

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

В случае если Compute API ответит нам ошибкой, например потому, что превышенно квота на одновремнно запущенные операции, функция выбросит исключение. Сообщение не будет удалено из очереди и через некоторое время снова станет доступно для вычитывания. Таким образом мы получим автоматические ретраи.

create snapshots diagram

С отчисткой старых снепшотов все проще. При создании снепшота ему проставляется лейбл expiration_ts содержащий unix-timestamp когда этот снепшот можно удалить. По cron будет срабатывать триггер и запускать функцию удаления просроченных снепшотов. Тут с ограничениями на количество операций я не сталкнулся.

cleanup snapshots diagram

Deploy

MacOs (Linux)

Предполагается что у вас уже настроены yc и s3cmd. Они понадобятся для скрипта деплоя.

Чтобы задеплоить функции в ваше облако выполните:

  1. Создать файл .env из шаблона из .env.template и заполнить
  2. npm install
  3. npm run create создаст все необходимые объекты в облаке: 3 функции, очередь сообщений и 3 триггера. Запуск срипта идемпотентен и не переписывает уже существующие сущнотсти.
  4. npm run deploy

Windows

Deploy script можно запустить в mingw (git bash).

Возможно потребуются права администаратора.