Creating CNAME for Google Cloud Functions
In this blog, we will create a CNAME for our cloud functions with path matches. The problem with cloud functions is that they use long URLs. We will be using the load balancer method to create a CNAME. We will create three path matches for three separate cloud functions.
- Firstly we have to create a domain name in any domain registrar of your choice like Cloudflare. For example
mysamplefunctions.com
- To use this method we need a
project owner
orproject editor
role or the following permissions
Network Admin: Create load balancer and networking components
Compute Instance Admin: Create and modify NEGs
Security Admin: Create and modify SSL certificates
- We need to set up a global IP address to reach the load balancer
Run the following command
gcloud compute addresses create function-ip
--network-tier=PREMIUM
--ip-version=IPV4
--global
gcloud compute addresses describe function-ip
--format="get(address)"
--global
Console
- Create a serverless NEG (network endpoint group) for your first function let’s say. Image processor. The
--cloud-function-name
should be the name that you see for the function in the cloud console.
gcloud compute network-endpoint-groups create imageprocessorneg
--region=us-central1
--network-endpoint-type=serverless
--cloud-function-name=imageprocessor
Console
Add the FQDN and keep the other fields as is
- Create a backend service for the same.
gcloud compute backend-services create imageprocessorservice
--load-balancing-scheme=EXTERNAL
--global
You cannot create a global backend service from the console. To create a regional backend service
Specify the network endpoint group name created in the previous step in the below drop-down menu.
- Add the serverless NEG as a backend-to-backend service
gcloud compute backend-services add-backend imageprocessorservice
--global
--network-endpoint-group=imageprocessorneg
--network-endpoint-group-region=us-central1
- Create a NEG for your second Cloudrun service let’s say video processor. The
--cloud-function-name
should be the name that you see for the function in the cloud console
gcloud compute network-endpoint-groups create videoprocessorneg
--region=us-central1
--network-endpoint-type=serverless
--cloud-function-name=videoprocessor
- Create backend service for same.
gcloud compute backend-services create videoprocessorservice
--load-balancing-scheme=EXTERNAL
--global
- Add serverless NEG as backend to backend service.
gcloud compute backend-services add-backend videoprocessorservice
--global
--network-endpoint-group=videoprocessorneg
--network-endpoint-group-region=us-central1
- Create a NEG for your third Cloudrun service let’s say audio processor. The
--cloud-function-name
should be the name that you see for the function in the cloud console
gcloud compute network-endpoint-groups create audioprocessorneg
--region=us-central1
--network-endpoint-type=serverless
--cloud-function-name=audioprocessor
- Create backend service for same.
gcloud compute backend-services create audioprocessorservice
--load-balancing-scheme=EXTERNAL
--global
- Add serverless NEG as a backend to backend service.
gcloud compute backend-services add-backend audioprocessorservice
--global
--network-endpoint-group=audioprocessorneg
--network-endpoint-group-region=us-central1
- Create a URL map to route incoming requests to the backend service.
gcloud compute url-maps create myurlmap
--default-service imageprocessorservice
--default-service imageprocessorservice
The --default-service
will be used if no path is specified in the url.
- Create path matchers for all the services.
gcloud compute url-maps add-path-matcher myurlmap
--path-matcher-name=service-matcher
--new-hosts=mysamplefunctions.com
--default-service=imageprocessorservice
--backend-service-path-rules='/image=imageprocessorservice,/video=videoprocessorservice,/audio=audioprocessorservice'
- Create a target HTTP(S) proxy to route requests to your URL map.
gcloud compute target-http-proxies create myhttpproxy \
--url-map=myurlmap
Console steps 13, 14, and 15:
a. Create a http load balancer
b. Select the backend services created in the previous step
c. Add the host and path rules. Add the respective backend services in the last column.
d. Click Create
- Create a global forwarding rule to route incoming requests to the proxy.
gcloud compute forwarding-rules create myhttpforwadingrule \
--load-balancing-scheme=EXTERNAL \
--network-tier=PREMIUM \
--address=function-ip \
--target-http-proxy=myhttpproxy \
--global \
--ports=80
- After the load balancer is created, note the IP address that is associated with the load balancer: for example, 30.90.80.100. To point your domain to your load balancer, create an A record using your domain registration service.
- Make sure that proxy is disabled in the domain registrar like Cloudflare so the traffic is routed to the load balancer.
- So you can now access the functions in the following manner.
– For image processormysamplefucntions.com/image
– For video processor.mysamplefucntions.com/video
– For Audio processor.myaudioprocessor.com/audio
- The document for reference are
- https://cloud.google.com/load-balancing/docs/https/setting-up-https-serverless#gcloud:-cloud-functions
- https://cloud.google.com/load-balancing/docs/url-map-concepts
- https://cloud.google.com/load-balancing/docs/negs/serverless-neg-concepts