How to specify the host:port of the functions emulator without starting the functions emulator

Viewed 1335

I'm writing cloud functions in Go and triggering them from the firestore emulator. This works if I manually start the firestore emulator:

 java -jar ~/.cache/firebase/emulators/cloud-firestore-emulator-v1.11.9.jar \
  --functions_emulator localhost:5001

Then I start my own server on localhost:5001 to handle the functions that are triggered and everything seems to work.

However, I'd like to start the firestore emulator in the normal way so that I get the nice web UI, etc. My firebase.json file is as follows:

{
  "emulators": {
    "firestore": {
      "port": 8080
    },
    "functions": {
      "port": 5001
    },
    "pubsub": {
      "port": 8085
    },
    "ui": {
      "enabled": true
    },
    "hosting": {
      "port": 5000
    },
    "auth": {
      "port": 9099
    }
  },
  "ui": {
    "enabled": true,
    "host": "localhost",
    "port": 4000
  },
  "functions": {
    "port": "5001",
    "predeploy": [
      "npm --prefix \"$RESOURCE_DIR\" run lint",
      "npm --prefix \"$RESOURCE_DIR\" run build"
    ],
    "source": "functions"
  },
  "pubsub": {
    "port": "8085"
  },
  "firestore": {
    "rules": "firestore.rules",
    "indexes": "firestore.indexes.json"
  },
  "hosting": {
    "public": "build",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  }
}

I start the emulators using

firebase emulators:start --only firestore

Then I set up a trigger on firestore using the following command:

#!/bin/zsh

TRIGGER='http://localhost:8080/emulator/v1/projects/fugalist/triggers/Requests'

curl --location --request PUT ${TRIGGER} \
    --header 'Content-Type: application/json' \
    --data-raw '{
        "eventTrigger": {
          "resource": "projects/fugalist/databases/(default)/documents/Requests/{doc}",
          "eventType": "providers/cloud.firestore/eventTypes/document.create",
          "service": "firestore.googleapis.com"
      }
    }'

Finally, I manually create a document under /Requests. The firestore-debug.log now contains:

[debug] [2020-11-10T21:09:20.187Z] ----------------------------------------------------------------------
[debug] [2020-11-10T21:09:20.189Z] Command:       /usr/local/Cellar/node/12.4.0/bin/node /Users/michaelcoffin/node_modules_global/bin/firebase emulators:start --only firestore
[debug] [2020-11-10T21:09:20.189Z] CLI Version:   8.15.0
[debug] [2020-11-10T21:09:20.189Z] Platform:      darwin
[debug] [2020-11-10T21:09:20.189Z] Node Version:  v12.4.0
[debug] [2020-11-10T21:09:20.190Z] Time:          Tue Nov 10 2020 13:09:20 GMT-0800 (Pacific Standard Time)
[debug] [2020-11-10T21:09:20.190Z] ----------------------------------------------------------------------
[debug] [2020-11-10T21:09:20.190Z] 
[debug] [2020-11-10T21:09:20.197Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
[debug] [2020-11-10T21:09:20.197Z] > authorizing via signed-in user
[info] i  emulators: Starting emulators: firestore {"metadata":{"emulator":{"name":"hub"},"message":"Starting emulators: firestore"}}
[debug] [2020-11-10T21:09:20.210Z] [hub] writing locator at /var/folders/xy/m2rx3tw14mnfvryxx2jvhyjh0000gn/T/hub-fugalist.json
[debug] [2020-11-10T21:09:20.229Z] Ignoring unsupported arg: projectId {"metadata":{"emulator":{"name":"firestore"},"message":"Ignoring unsupported arg: projectId"}}
[debug] [2020-11-10T21:09:20.229Z] Ignoring unsupported arg: auto_download {"metadata":{"emulator":{"name":"firestore"},"message":"Ignoring unsupported arg: auto_download"}}
[debug] [2020-11-10T21:09:20.229Z] Starting Firestore Emulator with command {"binary":"java","args":["-Duser.language=en","-jar","/Users/michaelcoffin/.cache/firebase/emulators/cloud-firestore-emulator-v1.11.9.jar","--host","localhost","--port",8080,"--rules","/Users/michaelcoffin/expmap/fe/firestore.rules"],"optionalArgs":["port","webchannel_port","host","rules","functions_emulator","seed_from_export"],"joinArgs":false} {"metadata":{"emulator":{"name":"firestore"},"message":"Starting Firestore Emulator with command {\"binary\":\"java\",\"args\":[\"-Duser.language=en\",\"-jar\",\"/Users/michaelcoffin/.cache/firebase/emulators/cloud-firestore-emulator-v1.11.9.jar\",\"--host\",\"localhost\",\"--port\",8080,\"--rules\",\"/Users/michaelcoffin/expmap/fe/firestore.rules\"],\"optionalArgs\":[\"port\",\"webchannel_port\",\"host\",\"rules\",\"functions_emulator\",\"seed_from_export\"],\"joinArgs\":false}"}}
[info] i  firestore: Firestore Emulator logging to firestore-debug.log {"metadata":{"emulator":{"name":"firestore"},"message":"Firestore Emulator logging to \u001b[1mfirestore-debug.log\u001b[22m"}}
[debug] [2020-11-10T21:09:21.040Z] API endpoint: http:// {"metadata":{"emulator":{"name":"firestore"},"message":"API endpoint: http://"}}
[debug] [2020-11-10T21:09:21.040Z] localhost:8080
If you are using a library that supports the FIRESTORE_EMULATOR_HOST environment variable, run:

   export FIRESTORE_EMULATOR_HOST=localhost:8080

Dev App Server is now running.

 {"metadata":{"emulator":{"name":"firestore"},"message":"localhost:8080\nIf you are using a library that supports the FIRESTORE_EMULATOR_HOST environment variable, run:\n\n   export FIRESTORE_EMULATOR_HOST=localhost:8080\n\nDev App Server is now running.\n\n"}}
[warn] ⚠  ui: Emulator UI unable to start on port 4000, starting on 4003 instead. {"metadata":{"emulator":{"name":"ui"},"message":"Emulator UI unable to start on port 4000, starting on 4003 instead."}}
[debug] [2020-11-10T21:09:21.275Z] Ignoring unsupported arg: auto_download {"metadata":{"emulator":{"name":"ui"},"message":"Ignoring unsupported arg: auto_download"}}
[debug] [2020-11-10T21:09:21.275Z] Ignoring unsupported arg: port {"metadata":{"emulator":{"name":"ui"},"message":"Ignoring unsupported arg: port"}}
[debug] [2020-11-10T21:09:21.275Z] Starting Emulator UI with command {"binary":"node","args":["/Users/michaelcoffin/.cache/firebase/emulators/ui-v1.2.2/server.bundle.js"],"optionalArgs":[],"joinArgs":false} {"metadata":{"emulator":{"name":"ui"},"message":"Starting Emulator UI with command {\"binary\":\"node\",\"args\":[\"/Users/michaelcoffin/.cache/firebase/emulators/ui-v1.2.2/server.bundle.js\"],\"optionalArgs\":[],\"joinArgs\":false}"}}
[info] i  ui: Emulator UI logging to ui-debug.log {"metadata":{"emulator":{"name":"ui"},"message":"Emulator UI logging to \u001b[1mui-debug.log\u001b[22m"}}
[debug] [2020-11-10T21:09:21.369Z] Web / API server started at http://localhost:4003
 {"metadata":{"emulator":{"name":"ui"},"message":"Web / API server started at http://localhost:4003\n"}}
[info] 
┌───────────────────────────────────────────────────────────────────────┐
│ ✔  All emulators ready! View status and logs at http://localhost:4003 │
└───────────────────────────────────────────────────────────────────────┘

┌───────────┬────────────────┬─────────────────────────────────┐
│ Emulator  │ Host:Port      │ View in Emulator UI             │
├───────────┼────────────────┼─────────────────────────────────┤
│ Firestore │ localhost:8080 │ http://localhost:4003/firestore │
└───────────┴────────────────┴─────────────────────────────────┘
  Other reserved ports: 4400, 4500

Issues? Report them at https://github.com/firebase/firebase-tools/issues and attach the *-debug.log files.
 
[debug] [2020-11-10T21:09:24.814Z] Nov 10, 2020 1:09:24 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
INFO: Detected non-HTTP/2 connection.
Nov 10, 2020 1:09:24 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
INFO: Detected non-HTTP/2 connection.
 {"metadata":{"emulator":{"name":"firestore"},"message":"Nov 10, 2020 1:09:24 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead\nINFO: Detected non-HTTP/2 connection.\nNov 10, 2020 1:09:24 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead\nINFO: Detected non-HTTP/2 connection.\n"}}
[debug] [2020-11-10T21:09:24.814Z] Nov 10, 2020 1:09:24 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
INFO: Detected non-HTTP/2 connection.
 {"metadata":{"emulator":{"name":"firestore"},"message":"Nov 10, 2020 1:09:24 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead\nINFO: Detected non-HTTP/2 connection.\n"}}
[debug] [2020-11-10T21:09:24.944Z] Nov 10, 2020 1:09:24 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
INFO: Detected HTTP/2 connection.
 {"metadata":{"emulator":{"name":"firestore"},"message":"Nov 10, 2020 1:09:24 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead\nINFO: Detected HTTP/2 connection.\n"}}
[debug] [2020-11-10T21:09:25.386Z] Nov 10, 2020 1:09:25 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
INFO: Detected non-HTTP/2 connection.
 {"metadata":{"emulator":{"name":"firestore"},"message":"Nov 10, 2020 1:09:25 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead\nINFO: Detected non-HTTP/2 connection.\n"}}
[debug] [2020-11-10T21:09:32.373Z] Nov 10, 2020 1:09:32 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
INFO: Detected non-HTTP/2 connection.
 {"metadata":{"emulator":{"name":"firestore"},"message":"Nov 10, 2020 1:09:32 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead\nINFO: Detected non-HTTP/2 connection.\n"}}
[debug] [2020-11-10T21:09:40.867Z] Nov 10, 2020 1:09:40 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
INFO: Detected non-HTTP/2 connection.
 {"metadata":{"emulator":{"name":"firestore"},"message":"Nov 10, 2020 1:09:40 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead\nINFO: Detected non-HTTP/2 connection.\n"}}
[debug] [2020-11-10T21:09:41.511Z] Nov 10, 2020 1:09:41 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
INFO: Detected non-HTTP/2 connection.
 {"metadata":{"emulator":{"name":"firestore"},"message":"Nov 10, 2020 1:09:41 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead\nINFO: Detected non-HTTP/2 connection.\n"}}
[debug] [2020-11-10T21:09:41.521Z] Nov 10, 2020 1:09:41 PM com.google.cloud.datastore.emulator.impl.context.EmulatorAuthorization warnAboutSecuredJwt
WARNING: expected an unsecured JWT, the emulator does not validate JWTs and IS NOT SECURE
 {"metadata":{"emulator":{"name":"firestore"},"message":"Nov 10, 2020 1:09:41 PM com.google.cloud.datastore.emulator.impl.context.EmulatorAuthorization warnAboutSecuredJwt\nWARNING: expected an unsecured JWT, the emulator does not validate JWTs and IS NOT SECURE\n"}}
[debug] [2020-11-10T21:09:41.629Z] Nov 10, 2020 1:09:41 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
INFO: Detected non-HTTP/2 connection.
 {"metadata":{"emulator":{"name":"firestore"},"message":"Nov 10, 2020 1:09:41 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead\nINFO: Detected non-HTTP/2 connection.\n"}}
[debug] [2020-11-10T21:10:21.137Z] Nov 10, 2020 1:10:21 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
INFO: Detected non-HTTP/2 connection.
 {"metadata":{"emulator":{"name":"firestore"},"message":"Nov 10, 2020 1:10:21 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead\nINFO: Detected non-HTTP/2 connection.\n"}}
[debug] [2020-11-10T21:10:21.165Z] Nov 10, 2020 1:10:21 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
INFO: Detected non-HTTP/2 connection.
 {"metadata":{"emulator":{"name":"firestore"},"message":"Nov 10, 2020 1:10:21 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead\nINFO: Detected non-HTTP/2 connection.\n"}}
[debug] [2020-11-10T21:10:21.179Z] Nov 10, 2020 1:10:21 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
INFO: Detected non-HTTP/2 connection.
 {"metadata":{"emulator":{"name":"firestore"},"message":"Nov 10, 2020 1:10:21 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead\nINFO: Detected non-HTTP/2 connection.\n"}}
[debug] [2020-11-10T21:10:21.225Z] Nov 10, 2020 1:10:21 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
INFO: Detected non-HTTP/2 connection.
 {"metadata":{"emulator":{"name":"firestore"},"message":"Nov 10, 2020 1:10:21 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead\nINFO: Detected non-HTTP/2 connection.\n"}}
[debug] [2020-11-10T21:10:21.239Z] Nov 10, 2020 1:10:21 PM com.google.cloud.datastore.emulator.impl.events.EventLogger publishEvent
WARNING: Failed to publish event for trigger projects/fugalist/triggers/Requests because Functions Emulator host/port is not configured.
 {"metadata":{"emulator":{"name":"firestore"},"message":"Nov 10, 2020 1:10:21 PM com.google.cloud.datastore.emulator.impl.events.EventLogger publishEvent\nWARNING: Failed to publish event for trigger projects/fugalist/triggers/Requests because Functions Emulator host/port is not configured.\n"}}

The relevant part of this, which appears immediately after I manually create a doc, is the last entry:

WARNING: Failed to publish event for trigger projects/fugalist/triggers/Requests because Functions Emulator host/port is not configured.
 {"metadata":{"emulator":{"name":"firestore"},"message":"Nov 10, 2020 1:10:21 PM com.google.cloud.datastore.emulator.impl.events.EventLogger publishEvent\nWARNING: Failed to publish event for trigger projects/fugalist/triggers/Requests because Functions Emulator host/port is not configured.\n"}}

Indeed, ps shows that the --functions_emulator flag is not being used in the invocation of the firestore emulator:

michaelcoffin    98802   0.0  1.6 16006468 536636   ??  Ss    1:09PM   0:06.19 /usr/bin/java -Duser.language=en -jar /Users/michaelcoffin/.cache/firebase/emulators/cloud-firestore-emulator-v1.11.9.jar --host localhost --port 8080 --rules /Users/michaelcoffin/expmap/fe/firestore.rules

And, in fact, it is used if you ask for the functions emulator:

firebase emulators:start --only firestore,functions

ps output:
99072   0.0  1.2 15892768 391240   ??  Ss    1:41PM   0:04.17 /usr/bin/java -Duser.language=en -jar /Users/michaelcoffin/.cache/firebase/emulators/cloud-firestore-emulator-v1.11.9.jar --host localhost --port 8080 --rules /Users/michaelcoffin/expmap/fe/firestore.rules --functions_emulator localhost:5001

I understand that this is not exactly a bug, since the emulator suite doesn't officially support Google Cloud Functions written in Go. However, the emulator suite does actually work fine with Go if I start the firestore emulator manually with the --functions_emulator flag. So I'm trying to find a workaround so that the --functions_emulator flag is used even when the functions emulator is not started.

1 Answers

The Firebase CLI doesn't offer a flag to set the host and port through the firebase emulators:start command. Nonetheless you can control the port settings of all the emulators inside the firebase.json file. Therein you should see the configuration below where you can replace the port value:

"emulators": {
    "firestore": {
      "port": 8500
    },
    "ui": {
      "enabled": true,
      "port": 4040
    }
}

Regarding the host, by default it's set to localhost so it shouldn't be a problem.

Related