この記事は前回の記事の続編になります.
ref: Clojureで努力の名言Twitter Botを作成した | Futurismo
以前はClojure Twitter BotをHeroku上で動作させました. 今回は Firebase上で動作させます. 具体的には
- Firebase Cloud Functions (aka. Google Cloud Functions)
- Firebase Cloud Firestore (aka. Google Cloud Firestore)
- Google Cloud Scheduler
を利用しました.
https://github.com/tsu-nera/meigen-bot-firebase-clj
Clojure x Cloud FirestoreはJava資産活用
おそらくネット上にある情報だと FirebaseとClojureScriptの組み合わせが多いです.
なぜ今回Clojureにこだわったかというと, もちろん学習目的と技術検証は目的ではあるものの, わたしはバックグラウンドでJavaの経験が多くJavaScriptの経験が少ないので ClojureでいけるならばClojureをFirebase で動かしたいと思ったからです.
結論からいうと, Cloud Functionsが鬼門です, Firestoreは楽です.
そもそもClojureはLispからJavaの広大な資産を活用することが有利であるため, Javaでライブラリを仕えるならそれでいいやと思っています(今の所).
実際ClojureからFirestoreへはJavaのIFを経由すれば楽でした.
Clojure x Cloud Functionsは茨の道
問題はCloud Functions. まず提供されているJava Functions Frameworkが HttpFunctionインタフェースの実装としてクラス定義をする必要があるのですが, そもそもクラスとか継承とかの概念をClojureが嫌ってるし, 一応実装できるものの情報も少なく苦戦. そして結局ローカルでは動いてもCloudで動作せずに挫折.
ref: https://cloud.google.com/functions/docs/concepts/java-runtime
どうもClojureにそもそもGoogle Cloud Buildが対応しているのか怪しい.
もしくはJava11とJava8のコンフリクトかもしれないが, 拙いClojure力ではトラブルシューティングツールできず.
Cloud Functionsの他のJVM言語の動かし方ページはClojureが登場せず.
ref: https://cloud.google.com/functions/docs/concepts/jvm-langs
結局, HTTPリクエストを受け取るentry-pointだけJavaで書くという謎の対応で乗り切る.
https://github.com/pepijn/google-cloud-functions-clojure
Clojure Google Cloud Runがいいのかも…
そもそもCloujureは Cloud FunctionsよりもCloud Runがいいのかもしれません.
ref: https://cloud.google.com/run?hl=ja
これは個人的な推測です. そしてCloud Runという技術そのものへの驚きとワクワク感で偏見がかかっています.
Googleが今後の大局的な技術投資をどこにするかというと, 先発のFunctionsよりもCloud Runのような気がしてなりません.
なぜならばFunctionsは機能が限定的で広がりがなく, Cloud Runはバケる可能性があります. FunctionsもCloud Runもサーバレスという点で機能は似ています.
ということで次回はGoogle Cloud RunでClojureを動かそうかと思います(たぶん).
2022.02.23 追記 Cloud Run
Google Cloud Runも試しました.
そこまでいじっていなものの, Cloud Runのほうがビルド周りは楽で好感触.
https://github.com/tsu-nera/meigen-bot-gcloud-run-clj
jibというGoogle提供ツールでさくっとコンテナ作成できるところが特にらく.
https://github.com/GoogleContainerTools/jib
少なくとも公式な手順がどこにも書いてないCloud Functionsよりも, jibをつかってCloud RunでJavaを実行するほうがずっと楽.
サーバレスでJavaのコードが走ることにRunnable Interfaceに似ていて感動した
私が一番ガッツリJava開発をしたのはJava6でした.
ref: はじめて UML で設計を体験した | Futurismo
Java8からJavaにも関数型プログラミングがやってくるので, それ以前でステートレスな方法でThread処理を実行する方法は, Runnable Interfaceを実装する方法を多用しました.
Cloud FunctionsというはなんだかRunnableインタフェースを実行したクラスを Threadで動かすのをCloudでやるような印象を受け, とてもワクワクしました.
昔を回顧して今につなげると技術への感動がより高まります.
微妙にJavaを覚えているがそこそこ忘れている分, Clojureの新しい知識がJavaの古い知識とつながることも感動します.