Resuelto. No entiendo completamente lo que sucede detrás de escena, pero la solución a esto requiere el uso de "etiquetas" que asocian las reglas de firewall en la red con la instancia de VM. Por lo que puedo ver en este punto, esto solo es pertinente para http y https. Otros puertos que están abiertos en la red y la VM parecen funcionar sin esta pieza adicional.
Si ve las reglas de su firewall, probablemente verá que las reglas de los puertos 80 y 443 tienen las etiquetas "http-server" y "https-server" respectivamente. Si no es así, deberá agregar esas (u otras etiquetas de su elección). Resulta que la instancia también necesita que se le agreguen esas etiquetas.
Para agregar las etiquetas a una instancia de VM existente, use este comando de gcloud:
gcloud compute instances add-tags [YOUR_INSTANCE_NAME] --tags http-server,https-server
Para agregar las etiquetas en el momento de la creación de la instancia, incluya esa bandera en su declaración:
gcloud compute instances create [YOUR_INSTANCE_NAME] --tags http-server,https-server
Si observa la interfaz gráfica de usuario de GCE, verá que las casillas de verificación "Permitir tráfico http" y "Permitir tráfico https" están marcadas después de hacer eso. Luego, las solicitudes y las respuestas fluyen a través de los puertos 80 y 443 como se esperaba.
Una de las cosas súper útiles que ofrece Google Cloud Console es un enlace en la parte inferior de la creación para la mayoría de los recursos para la API REST y la línea de comando para crear el mismo recurso. Me estoy desafiando a mí mismo para poder hacer todo lo que puedo hacer en la consola desde la línea de comandos del SDK, así que lo uso a menudo cuando tengo una pregunta como la suya.
Teniendo la misma pregunta que arriba, en la consola creé una VM y seleccioné "Permitir tráfico HTTP". Mirando la línea de comando para esto, verá dos comandos. El primero es el comando de creación con la etiqueta como se indicó anteriormente (servidor http):
gcloud beta compute --project=XXXX instances create cgapperi-vm1 \
--zone=XXXXX --machine-type=f1-micro --subnet=default \
--tags=http-server --image=debian-10-buster-v20200413 \
--image-project=debian-cloud --boot-disk-size=10GB \
--boot-disk-type=pd-standard --boot-disk-device-name=cgapperi-vm1 \
--no-shielded-secure-boot --shielded-vtpm --shielded-integrity-monitoring \
--reservation-affinity=any
El segundo en realidad crea la regla de firewall (default-allow-http ) y establece el destino de las solicitudes a la etiqueta del servidor http (--target-tags=http-server ) en el puerto TCP 80 (--rules=tcp:80 ) de solicitudes entrantes (--direction=INGRESS ) de todas las fuentes (--source-ranges=0.0.0.0/0 ):
gcloud compute --project=XXXX firewall-rules create default-allow-http \
--direction=INGRESS --priority=1000 --network=default --action=ALLOW \
--rules=tcp:80 --source-ranges=0.0.0.0/0 --target-tags=http-server
Espero que esto sea útil para cualquier otra persona.
gcloud compute instance create
a los bits relevantes para reducir el desorden.