LoginSignup
3
0

More than 5 years have passed since last update.

ElixirからFirestoreに接続するのに失敗した話

Posted at

まず結論から

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の資料

REST API
RPC 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さん、これどこかで目に入ったら詳細な資料もらえませんか……?

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0