Another option is Google Cloud AppEngine. It’s a little more limited in terms of languages that are supported, but the free tier is generous enough that I have never paid anything to run backends for side projects.
GAE and Cloud functions are gradually going to be replaced by Cloud Run. In fact Run and 2nd generation GAE run on exactly the same infra backed by gVisor and you can deploy custom containers to either in almost exactly the same manner.
For personal projects I think App Engine is superior due to the included services like Mail API and Memcache API.
There are also features like Firewall API that's lacking in Cloud Run right now.
One downside of App Engine (due to its 10+years of history) is that one GCP project can only have one App Engine app in a single region, and you can't change the region after it's created. You can have arbitrary number of Cloud Run service in one GCP project, each can be in different region.
It's also harder to take a Infrastructure-as-code approach on App Engine as there's no easy way to diff between the deployed version and the intent (in Cloud Run, you can use the container image hash for that purpose).
Disclaimer: SRE working on App Engine and Cloud Run.
Right now you may be able to do more with AppEngine but the trade-off is you're locked in to platform-specific APIs. With Cloud Run there's no platform lock in since all it is, is a Docker container with whatever you want running that listens on $PORT.