はじめに
FirebaseのFirestore Databaseに、GolangのSDKを用いて接続したい。
公式Docを参考にFirestoreへの接続を試みたところ、以下のように「ファイルが見つからない」と怒られたので、その解決策を備忘録として残す。
Init Firestore failed. err=cannot read credentials file: open ./firebase-adminsdk-key.json: no such file or directory"
ちなみに、解決方法をググると、GOPATHまわりを良い感じに変更する方法がたくさん出てくるが、よくわからなかったので、本記事では別の方法を採用している。
(一応、記事後半に採用理由も記載済み)
失敗パターン
プログラム自体は概ねこれで問題ない
// このpackageはあくまで筆者の環境
package infrastructure
import (
"context"
"github.com/labstack/gommon/log"
firebase "firebase.google.com/go"
"google.golang.org/api/option"
)
func NewFirestoreHandler() error {
ctx := context.Background()
// 今回の問題点はここ
sa := option.WithCredentialsFile("./firebase-adminsdk-key.json")
// ProjectIDには自分のFirebaseプロジェクトIDを入れる
conf := &firebase.Config{
ProjectID: "hogehoge",
}
app, err := firebase.NewApp(ctx, conf, sa)
if err != nil {
log.Errorf("Firebase NewApp failed. err=%+v", err)
return err
}
client, err := app.Firestore(ctx)
if err != nil {
log.Errorf("Init Firestore failed. err=%+v", err)
return err
}
defer client.Close()
// ここから動作確認用のレコードINSERT処理なので、必須ではない
_, _, err = client.Collection("users").Add(ctx, map[string]interface{}{
"first": "Ada",
"last": "Lovelace",
"born": 1815,
})
if err != nil {
log.Errorf("Add failed. err=%+v", err)
return err
}
// ここまで
return nil
}
これで実行すると、下記の通り「ファイルが見つからない」と怒られる
Init Firestore failed. err=cannot read credentials file: open ./firebase-adminsdk-key.json: no such file or directory"
成功パターン
ファイルが読み込めないならば読み込まなければ良いのでは?
ということで、JSONをベタ書きする案でいけた
// JSONファイル読み込み案を不採用
// sa := option.WithCredentialsFile("./firebase-adminsdk-key.json")
// JSONをベタ書きする案を採用
tmpJson := []byte(`{"type": "hogehoge", "project_id": ...}`)
sa := option.WithCredentialsJSON(tmpJson)
念のため、JSONベタ書き案を採用する場合は、しっかりと中身を環境変数で管理するなどしてGit管理下に含めないようお気をつけを…
おわりに
JSONベタ書きする案ならば、SDKの秘密鍵を環境変数などで管理することができるので、JSONファイルを読み込む方法よりも何かと便利かと。
例:JSONファイル使う方法の場合だと、認証情報の入ったJSONファイルはGit管理できないのでHerokuにデプロイするときに少し手を加える必要が出てくるが、今回の方法ならば環境変数に設定すれば終わり
参考
-
Cloud Firestore を使ってみる | Firebase
- 公式Doc
-
go - Build golang including firebase credential file .json - Stack Overflow
- 解決方法を知るにあたり、この記事が大いに参考になった
-
【第3回】Go言語(Golang)入門~Firestoreデータ操作編~ – 株式会社ライトコード
- 画像も載っていて、Firestoreへの接続方法の基本的なやり方はここも参考になった(ファイル読み込む方法を採用している記事)