Google Cloud with Clojure開発まとめ
🔖GCPを🔖Clojureや🔖ClojureScriptからつかうノウハウまとめ.
GCP with Clojure
💡Firebase/Google Cloud w/ Clojure
ref: https://github.com/tsu-nera/meigen-bot-firebase-clj
💡Google Cloud Run w/ Clojure
🔖Jib を利用してコンテナビルドする.
- Clojure in Google Cloud Run with Jib – Hannu Hartikainen
- Clojure app on Google Cloud Run | 3sky’s notes
- Google Cloud Run で Clojure アプリケーションを実行しよう | Micheam’s TechBlog
実際に検証した感触ではCloud Functionsよりも圧倒的に楽.
refs:
- GitHub - tsu-nera/meigen-bot-gcloud-run-clj
- 🖊Clojure/Firebaseで努力の名言Serverless Twitter Bot作成した | Futurismo
最近, jibbit というclojureからjibを扱いやすしたツールも登場(2022/01).
- https://twitter.com/kipzter/status/1480982692036591620
- Containerizing a Clojure Project | Atomist Blog
tag: 🔖GCR
💡Google Cloud Functions with Clojure
tags: 🔖GCF
基本方針としては, Google Cluud FunctionsのJava11ランタイムのページをみながら, functions-framework-java を利用する.
- https://cloud.google.com/functions/docs/concepts/java-runtime
- https://github.com/GoogleCloudPlatform/functions-framework-java
2022.01時点での注意点としては,
- 他のJVM言語のところにClojureが登場しない.
- https://cloud.google.com/functions/docs/concepts/jvm-langs
- Scala, Kotlin, Groovyは登場する.
- 他のJVM言語を真似してClojureを実行しようとすると,エラー.
- デプロイ方式は2つあるがおそらくローカルビルドでないと失敗.
- https://cloud.google.com/functions/docs/concepts/java-deploy
- ソースからのデプロイはpom.xmlとソースのuploadは成功するがclojureのビルドでコケる. そもそもCloud Functionsで使われているCloud BulildでClojureのビルドに対応しているのか怪しい. ClojureCoreその他ははdefaultでJava8でビルドされている. 一方Cloud Functionsのランタイムは11.
- したがってuberjar(fatjar)をローカルで作成して.classファイルと一緒にuploadするのがいい.
- 以下の3つのリポジトリが参考になる.
- ハマりポイントはエントリポイントをJavaで用意するところ.
- Clojureで用意しようとしてもビルドエラーする.
- ruberjarのビルドにはの 📝tools.build のguideをみて, JavaソースをコンパイルしてClojureコードをuberjarで.jarファイルに含める.
💡Google Cloud Firestore with Clojure
せっかくのClojureなのでClojure onlyで頑張らずにJavaやnode.jsの資産を活用する方向がいいかな…Java資産活用しないとリッチーヒッキーの開発モチベに反する🤔
- Add the Firebase Admin SDK to your server | Firebase Documentation
- Get started with Cloud Firestore | Firebase Documentation
ref: 📝Firebase Firestore
client libraries
firestore-cljがよくできている. これをベースに他のリポジトリを参考にカスタマイズするとよい.
- https://github.com/lurodrigo/firestore-clj
- java sdk
- https://github.com/samedhi/firemore
- javascript sdk with clojurescript
- https://github.com/cloudfuji/taika
- rest api
- https://github.com/alekcz/fire
- rest api
💡Firestoreのスキーマレスのメリットとclojure.specの思想が反する
FirestoreはスキーマレスDBということを留意する.
すなわちこの特性によりスキーマ設計が不要というメリットを活かすならば動的言語であるClojureとの 相性がよくJSON Schema(Shcema/Malli/clojure.spce)は不要かもしれない.
ref. 📝Clojure spec
💡FirestoreのドキュメントデータベースパラダイムとClojureプロトコルの思想が反する
またFirestoreは ドキュメントデータベースということも注意.
ドキュメントのモデルを作成してプロトコルを定義する必要はあるのか?
なぜならばドキュメントはコレクションに格納されてその範囲内でのみシーケンス処理される.
プロトコルとは操作抽象であり異なるデータ型を同一IFでシーケンシャルに処理することが目的であるがそもそもドキュメントデータベースのパラダイムにおいては異なるドキュメントを同一コレクションに入れるのかという問題がある.
ref: defprotocol
タイムスタンプの扱い
調査中だがわかったところまで,
- java.time.x でFirestoreにデータを送るとobjectとして格納される.
- java.instantでFirestoreにデータを送るとobjectとして格納される.
- java.data.utilでFirestoreにデータを送るとTimestampとして格納される.
なのでタイムスタンプ型として時刻を格納するときはjava.util.Dateで投げる.
GCP with ClojureScript
Cloud Functions with ClojureScript
- Having Fun with Clojurescript on Google Cloud Function | Medium
- ClojureScript on Firebase Cloud Functions
- https://github.com/thosmos/cljs-cloud-functions