ゼスト Tech Blog

ゼストは「護りたい。その想いを護る。」をミッションに、在宅医療・介護業界向けのSaaSを開発しています。

Windows11のWSL環境でGoogle Cloudのエミュレーターが動作しない問題の対処法

概要

Mac環境で動いているデバッグ環境を、Windows環境で実行した際に、Google Cloud関連のエミュレーター(Cloud Pub/Sub、Cloud Tasks)でいくつかの問題に直面しました。

本記事では、Windows11とWSL環境でGoogle Cloud 関連のエミュレーターを動作させるまでを紹介します。

環境構成

  • Windows11
  • WSL(Ubuntu
  • Docker(Ubuntuのパッケージ管理でインストール)
  • アプリケーション(Fastify)
  • エミュレーター(Docker上の、Cloud Pub/Sub、Cloud Tasks)

課題

  • Cloud Pub/Subなどから呼び出されるべきエンドポイントが、正しく呼び出されない
  • エミュレーターのログにはエンドポイントのURLが見当たらない旨のメッセージが出ている(エミュレーターまではメッセージが届いている)

対策

① docker-compose.override.yaml の追加

host.docker.internal の設定をするために、docker-compose.override.yaml ファイルを作成し、以下のように extra_hosts の設定をします。

services:
  your-service:
    extra_hosts:
      - "host.docker.internal:172.18.92.229"
  • 上記の IP は、Ubuntu上の eth0 インターフェースのものを指定します。再起動などのタイミングでIPが変わることがあるので、その際は書き換えています。

  • 注意点:Linux 用の設定で調べていると、以下の設定もありますが、これだと別のIPが設定されてしまいます。

      - "host.docker.internal:host-gateway"
  • ファイルの管理:このファイルは環境に依存していて、ほとんどの開発者には不要な設定なので、.git/info/exclude ファイルに定義して、リポジトリに入らないようにします。

② Fastify のホスト設定

Fastifyアプリケーションのホスト設定を変更することで、Docker内のコンテナから正しくアクセスできるようにします。

  • 設定内容:デフォルトのホストはlocalhostですが、これではDockerコンテナ内からアクセスできないため、以下のように0.0.0.0に変更します。
fastify.listen({ host: '0.0.0.0', port: 3000 })
  • 注意点:Windows上のブラウザからは、WSL上のアプリケーションに localhost でアクセスできていたため、ここが設定の誤りに気づきにくかったです。 (おそらくWSLが規定でローカルホストフォワーディングを有効にしているためかと思います)

まとめ

今回のように、Windows 11でWSL(Ubuntu)とDockerを使用してGoogle Cloud Pub/SubやFirebaseエミュレーターをセットアップしデバッグ環境を構築するケースは、比較的特殊なものかもしれません。

MacLinux環境ではより簡単に設定できる部分が、Windows環境特有の問題で原因が分かりにくくなったと思います。

また、WindowsネイティブのDockerではなく、WSL上でDockerを使用したことも問題を複雑にしたかもしれません。

WindowsネイティブのDockerではどういう設定になるのか、(そもそも考慮する点が無いのか)今後試してみたいと思います。