Последнее время я неспешно работаю над своим новостным C++ ботом и в качестве заключительного шага его нужно где-то “поселить” жить. Вариантов, конечно же довольно много, начиная своим компьютером заканчивая облаками, но наиболее экономически целесообразным и простым в поддержке выглядит какое-либо бессерверное решение, например AWS Lambda. Так как Clojure приложение как Lambda я еще никогда не запускал, то решил вынести эксперименты отдельно от основного проекта. Оказалось не сложнее чем с Go, всего-то нужно взять подходящую библиотеку для простой и наглядной реализации точки входа, сделать правильную сборку, да не забыть про Terraform для удобного управления инфраструктурой.
Точка входа и правильная сборка
По большому счету это единственные сложности которые возникают при попытке запустить Clojure приложение как Lambda. Вполне ожидаемо, для запуска Java приложения AWS Lambda необходимо знать имя точки входа и эта точка входа должна быть реализована в виде Java класса. По умолчанию Clojure не создает Java классы, но об этом можно попросить при помощи
Со сборкой так же есть небольшие тонкости. По умолчанию Clojure компилирует в JVM на лету, что не совсем хорошая идея для AWS Lambda, где время выполнения довольно жестко лимитировано окружением. Так же не маловажно то, что
(println "Print during compilation?")
1))
Для активации компиляции Ahead-of-time достаточно добавить флаг
...
:profiles {:uberjar {:aot :all}})
Причем тут Terraform?
Создавать лямбду можно и через web-консоль, но так как я планирую добавлять к боту новый функционал, то чем меньше действий вручную, тем больше вероятность что я не обленюсь и не брошу дело на полпути. Как оказалось, единственная Clojure-специфичная вещь – это минимальный объем памяти. Доступные по умолчанию 128 Мб ни на что не хватает и лябда падает на старте c
Для того что-бы Terraform мог отслеживать не только изменения в инфраструктуре AWS, но еще и обновление jar-архива с кодом, важно не забыть о поле
Почему clojure а не какая-нибудь другая реализация lisp?
На мой взгляд только Clojure из всего семейства LISP-ов (оставим elisp в стороне) имеет практический смысл в современном мире. Потому как это LISP с одной стороны, и все библиотеки мира JVM с другой.