1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

GolangでFirebaseのFirestore Databaseを使う

Posted at

はじめに

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にデプロイするときに少し手を加える必要が出てくるが、今回の方法ならば環境変数に設定すれば終わり

参考

1
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?