この記事は前回の記事の続編になります.

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の古い知識とつながることも感動します.