Step 1 - Create a new VM - While Creating the VM

Allow HTTP and HTTPs firewall rule (if you plan to host a web app on there)

Pick the ephemeral IP - you can assign a public IP later - after the VM is created.

Step 2 - Create a Public, Static IP

Pick the standard networking tier (premium networking is defaulted - and costs more)

Note - Static IP addresses not attached to an instance or load balancer are billed at a higher hourly rate. Learn more 

Step 3 - Attach the IP to the VM created in step 1

Summary

That's it - you should now have a VM that you can both SSH into - as well as host a public facing website on.  The IP Address will be available on the console . If you want to access it via a custom DNS, that's fairly straightforward as well.

Why not use App Engine instead?

App engine should always be your first choice - but there are use cases where you need your own VM. The most common example is if you have two different runtimes (e.g. I needed a web app with a PHP front end and python backend). With app engine, only one runtime is supported at a time. In addition, you can only have ONE app engine instance within a project.