2019年1月27日日曜日

[Go][CloudFunctions][FireStore] Could FunctionsからCloud FirestoreをGoで呼び出す

Go言語でCloud FunctionsからFirestoreを呼び出すにはどうすればいい?

結論を書くと、チュートリアルに書かれている通りです。

ただ、Initialize Cloud Firestoreにあるサンプルコードのclient, err := firestore.NewClient(ctx, projectID)にあるContextに何を入れれば良いかが書かれていない


Cloud Firestoreを有効にする

GCPのコントロールパネル項目からCloud Firestoreを選択し、有効かします。

※Cloud Datastoreを一度でも有効にしてしまうと、Cloud Firestoreは有効に出来ません


Cloud Functionsを記述する

ライブラリを取得する

手元の環境でいつも通りgo getを行います

go get "cloud.google.com/go"


go modを使用する

手元の開発フォルダでgo mod initと行いgo.modを生成する事により、functions環境で上記ライブラリを使えるようにする


Cloud Functionsのコードを書く

package hello

import (
 "net/http"
 "cloud.google.com/go/firestore"
 "log"
)

func Hello(w http.ResponseWriter, r *http.Request) {
   projectID := "GCP-PROJECT-ID"
   
   // Get a Firestore client.
   client, err := firestore.NewClient(r.Context(), projectID)
   if err != nil {
           log.Fatalf("Failed to create client: %v", err)
   }
   
   // Close client when done.
   defer client.Close()

   _, _, err = client.Collection("users").Add(r.Context(), map[string]interface{}{
           "first": "Ada",
           "last":  "Lovelace",
           "born":  1915,
   })
   if err != nil {
           log.Fatalf("Failed adding alovelace: %v", err)
   }

    msg := "Hello World"
    w.Write([]byte((msg)))
}

go.modの更新としてgo buildを行います

サーバーの方にアップロードします

gcloud functions deploy helloWorld --entry-point Hello --runtime go111 --trigger-http


実行してみる

deployしたURLにアクセスし、その結果をFirestoreのコントロールパネルで確認し、ユーザーが追加されていれば成功です


Firebaseとの連携

おまけですが、GCPとFirebaseを連携するには、Firebaseのコントロールパネルを開き、プロジェクトを追加する際に上記GCPのプロジェクトIDを選択してあげます

出来上がったFirebase ProjectのDatabaseをみると、上記でいれたUserデータが見えると思います