2020年08月28日
gcloud firestore emulatorに接続できない問題について
GAE/go + Cloud Firestoreで開発をしようと思いローカルでエミュレータを使ってみた。
エミュレータを使う流れは以下の通り。
- gcloud コマンドでエミュレータを起動
- 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
を設定する