まず結論から
ElixirからFirestoreに簡単に繋ぐ事の出来るライブラリは2019年1月現在存在していません。
Firestoreへの接続はGoogleが公式にサポートしている言語を使用する方が良さそうです。
- Go言語
- Java(JVM言語も「一応」可能)
- PHP
- Ruby
- Python
- Node.js
- C#
など
接続を試してみて
REST APIに関してはライブラリが存在していますが、存在しているだけで特にサポートなどはなく、readmeにもリファレンスにも特に使用方法などの記載はありません。そのため、GCPのAPIに関してある程度知識がなければ接続は困難です。
gRPC APIに関しては公式には存在しておらず、詳細な接続方法のリファレンスなども存在していないので、1から接続出来るところまでもっていくのがまず厳しいですし、接続時のエラーに関してもほぼコード(404か503)のみしか戻ってこないため、接続のどこに問題があってエラーとなっているかを確認する事が出来ません。
よって、「資料が手元にないけどとりあえず繋いでみてエラーが出たらそれを元に考える」というようなスタイルでの開発は非常に困難であると結論づけざるをえません
ElixirからGCPに接続するために使用出来るライブラリ
Goth
GCPのOAuth2トークンを取得するライブラリ。
google_api_firestore
FirestoreのREST APIライブラリ。Google製。
grpc
ElixirのgRPCライブラリ。接続部分の提供のみであり、.protoファイルからpb.exファイルを作成することは出来ない。(同作者の別ライブラリが存在する)→protobuf
googleapis
Googleが提供するAPI群の.protoファイル集
Firestore APIの資料
今回得られた知見(小ネタ)
gRPCの接続先をHTTPSにしたい場合
GRPC.Credential.new(ssl: [cacertfile: "your/cert.file"])
GRPC.Stub.connect("firestore.googleapis.com:443", cred: cred)
接続時に上記のようにしてcertファイルを渡すことでHTTPS接続が可能になる
通信時にトークンなどのメタデータを渡したい場合
{:ok, token} = Goth.Token.for_scope("https://www.googleapis.com/auth/datastore")
metadata = %{"Authorization" => "Bearer #{token.token}"}
Google.Firestore.V1beta1.Firestore.Stub.create_document(channel, rec, metadata: metadata)
のように、Stubのオプションとしてメタデータを渡す
余談: Googleさん、これどこかで目に入ったら詳細な資料もらえませんか……?