gcloud firestore emulatorに接続できない問題について

August 28, 2020,
tags: gcp firestore golang


このエントリーをはてなブックマークに追加

GAE/go + Cloud Firestoreで開発をしようと思いローカルでエミュレータを使ってみた。
エミュレータを使う流れは以下の通り。

  1. gcloud コマンドでエミュレータを起動
  2. FIRESTORE_EMULATOR_HOSTの値を設定

gcloud コマンドでエミュレータを起動

$ gcloud beta emulators firestore start

FIRESTORE_EMULATOR_HOSTの値を設定

エミュレータ起動じに表示されるFIRESTORE_EMULATOR_HOST の値を設定

export FIRESTORE_EMULATOR_HOST=::1:8020

ちゃんと接続できるか試してみた

そして試しにデータが登録・取得できるかを試してみた。

package main

import (
    "context"
    "fmt"
    "log"

    "cloud.google.com/go/firestore"
    "google.golang.org/api/iterator"
)


func main() {
	  ctx := context.Background()
    client, err := firestore.NewClient(ctx, "")
    if err != nil {
        log.Fatal(err)
        return
    }
    defer client.Close()
    iter := client.Collection("spots").Documents(ctx)
	  defer iter.Stop()

    for {
        doc, err := iter.Next()
        if err == iterator.Done {
            break
        }

        if err != nil {
            log.Fatalf("Failed to iterate: %v<br>", err)
        }

        fmt.Printf("%v\n", doc.Data())
    }
}

しかし、レスポンスが返ってこなかった。
どうやら iter.Next() の処理で止まっているみたいだった。

IPv4で接続してみる

--host-port オプションでIPv4を使った起動ができる

$ gcloud beta emulators firestore start --host-port localhost:8020  

この場合はFIRESTORE_EMULATOR_HOST は以下のように設定する

$ export FIRESTORE_EMULATOR_HOST=localhost:8020

これだと無事つながる

なぜIPv6だとつながらないのか?

調べたところローカルホストの指定の仕方が悪いみたい。
例えばブラウザでアクセスするときはhttp://[::1]:8000 のように[] を指定しなけければならない。
しかしFirestoreのエミュレータ起動した場合に表示されるのはexport FIRESTORE_EMULATOR_HOST=::1:8088 と出ている。
[]をつけて環境変数を設定してみた。

$ export FIRESTORE_EMULATOR_HOST=[::1]:8088

これで解決できた。

まとめ

  • gcloudコマンドでFirestoreのエミュレータ使うときは環境変数FIRESTORE_EMULATOR_HOST 設定時に[]をつけてホストをしている
  • もしくは--host-port でIPv4で起動して、環境変数FIRESTORE_EMULATOR_HOST を設定する
comments powered by Disqus