前にGCPのFirestoreを使ってみました。
フロントで扱う時には認証で困るのでAPIで取得できるようにしてみます。
FunctionsかGAE(Google App Engine)を使えば良さそうですが、どっちを使えばいいか判断がつかなかったので両方使ってみます。
処理に使う言語はgolangにしました。
Google Functions
AWS Lambdaを使ったことがあればほぼ同じ要領で使えます。
AllwaysFree枠で200万回の呼び出し、メモリ400,000GB秒、CPU200,000GHz秒、5GB下りネットワークがあります。
通常CPUが先に尽きるので最低スペックで278時間ほど動かせるはず(200,000/0.2/60/60)。
API作成に関していえばHTTPトリガーで作成するとURLまで自動作成してくれる点が非常にありがたいです(LambdaではAPI Gateway経由になる)。
ただその分リクエスト/レスポンスハンドラは自分で書く必要がある。
Go1.11でFirestoreから一覧を取得するコードを書いてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
package main import ( "context" "encoding/json" "fmt" "log" "net/http" firebase "firebase.google.com/go" ) const ( projectID = "project id" cName = "collection name" ) func HelloWorld(w http.ResponseWriter, r *http.Request) { ctx := context.Background() conf := &firebase.Config{ProjectID: projectID} app, err := firebase.NewApp(ctx, conf) if err != nil { log.Fatalln(err) } client, err := app.Firestore(ctx) if err != nil { log.Fatalln(err) } defer client.Close() docs, err := client.Collection(cName).Documents(ctx).GetAll() if err != nil { log.Fatalln(err) } arr := make([]interface{}, 0) for _, doc := range docs { arr = append(arr, doc.Data()) } bytes, _ := json.Marshal(arr) w.Header().Set("Content-Type", "application/json") fmt.Fprint(w, string(bytes)) } |
すごいお手軽にAPIが作れる。
ただデプロイに結構時間がかかるのでトライエラーしにくい。
またFirestore接続時にprojectIDを指定しているので、他プロジェクトのアクセスもできるのかと思ったら意外とできない。IAMで出来そうな気もするけど結局できず。
GAE – Google App Engine
無料枠を見てもいまいちどれくらい使えるかわかりにくい。かなり自動で構成が変わるようなので構成ファイルの書き方をちゃんと理解しないといけない。
まずCloud SDKが必要なのでインストーラをとってきてインストール。
自動でコンソールが出てくるので初期化としてブラウザ経由で認証しておきます。
サンプルを見つつFunctionsと同等のgoファイルと構造ファイル(.yaml)を置きます。
gcloud app deploy
でデプロイしてみるとエラーになりました。
1 2 3 |
Staging Standard app: failed analyzing C:\...\gae: cannot find package "google.golang.org/appengine" in any of: ($GOROOT not set) C:\...\go\src\google.golang.org\appengine (from $GOPATH) |
モジュールONなのでグローバル実行できないよってことらしいです。
プロジェクトと関係ない(.modのない)とこでグローバルインストールします。
1 |
> go get google.golang.org/appengine |
地味に面倒な事させるなー。とりあえず解決。
gcloudをはじめやることは増えましたが、ローカルで動かしてそのままデプロイできるので慣れればこっちの方が開発しやすそうです。
go moduleを使わないことはないと思うのでグローバル云々は何とかしてほしい。