I have a need at the moment to know where my users are in the world. This helps me to identify what compute resources to serve their request with in order to reduce the latency they experience. So how do you do that thing with Google Cloud?
The first step is to setup a series of test backends to send traffic to. I built three regions: Sydney; London; and Los Angeles. It turns out in hindsight that wasn’t actually nessesary though — this would work with a single backend just as well. For my backends I chose a minimal Ubuntu install, running this simple backend HTTP service.
I had some initial trouble finding a single page which walked through the setup of the Google Cloud load balancer to do what I wanted, which is the main reason for writing this post. The steps are:
Create your test instances and configure the backend on them. I ended up with a setup like this:
Next setup instance groups to contain these instances. I chose unmanaged instance groups (that is, I don’t want autoscaling). You need to create one per region.
But wait! There’s one more layer of abstraction. We need a backend service. The configuration for these is cunningly hidden on the load balancing page, on a separate tab. Create a service which contains our three instance groups:
I’ve also added a health check to my service, which just requests “/healthz” from each instance and expects a response of “OK” for healthy backends.
The backend service is also where we configure our extra headers. Click on the “advanced configurations” link, and more options appear:
Here I setup the extra HTTP headers the load balancer should insert: X-Region; X-City; and X-Lat-Lon.
And finally we can configure the load balancer. I selected a “HTTP(S) load balancer”, as I only care about incoming HTTP and HTTPS traffic. Obviously you set the load balancer to route traffic from the Internet to your VMs, and you wire the backend of the load balancer to your service. Select your backend service for the backend.
Now we can test! If I go to my load balancer in a web browser, I now get a result like this:
The top part of the page is just the HTTP headers from the request. You can see that we’re now getting helpful location headers. Mission accomplished!