Пример переписан с использованием нового Nodejs SDK v2 для Yandex Cloud.
Альтернативная реализация на Go. https://github.com/nikolaymatrosov/go-yc-serverless-snapshot
В облаке существует лимит на количество одновременно запущенных в облаке операций. По умолчанию он равен 15.
Это значит, что если мы хотим делать снепшоты более чем 15 дисков, простое решени с одной функцией которая запустит оперции создания снепшота нам не подойдет.
Чтобы не заморачиваться с ретраями и ожиданием окончания создания снепшота можно воспользоваться очередью сообщений.
И так, первая функция, которая будет триггериться по cron'у будет складывать в очередь сообщений задания для второй функции.
Вторая функция будет срабатывать по триггеру, который мы свяжем с очередью сообщений, будет как раз выполнять полезную работу — создавть снепшоты.
В случае если Compute API ответит нам ошибкой, например потому, что превышенно квота на одновремнно запущенные операции, функция выбросит исключение. Сообщение не будет удалено из очереди и через некоторое время снова станет доступно для вычитывания. Таким образом мы получим автоматические ретраи.
С отчисткой старых снепшотов все проще. При создании снепшота ему проставляется лейбл expiration_ts
содержащий unix-timestamp когда этот снепшот можно удалить.
По cron будет срабатывать триггер и запускать функцию удаления просроченных снепшотов. Тут с ограничениями на количество операций я не сталкнулся.
Предполагается что у вас уже настроены yc и s3cmd. Они понадобятся для скрипта деплоя.
Чтобы задеплоить функции в ваше облако выполните:
- Создать файл
.env
из шаблона из.env.template
и заполнить npm install
npm run create
создаст все необходимые объекты в облаке: 3 функции, очередь сообщений и 3 триггера. Запуск срипта идемпотентен и не переписывает уже существующие сущнотсти.npm run deploy
Deploy script можно запустить в mingw (git bash).
Возможно потребуются права администаратора.