Hello Cloud Run with Python (FastAPI)

1. Introducción

96d07289bb51daa7.png

Cloud Run es una plataforma de procesamiento administrada que te permite ejecutar contenedores sin estado que se pueden invocar a través de solicitudes HTTP. Se compila en el proyecto de código abierto Knative, lo que permite trasladar cargas de trabajo entre plataformas. Cloud Run es una plataforma sin servidores que simplifica la administración de la infraestructura para que puedas enfocarte en lo que más importa: crear aplicaciones extraordinarias.

El objetivo de este instructivo es crear una aplicación web sencilla de FastAPI y, luego, implementarla en Cloud Run.

Qué aprenderás

  • Cómo crear una aplicación de FastAPI "Hello World".
  • Cómo probar la aplicación ejecutando el servidor de FastAPI en modo dev.
  • Los Cloud Buildpacks y cómo la presencia de fastapi y uvicorn en un requirements.txt permiten que no se necesite un Dockerfile.
  • Cómo implementar la aplicación de FastAPI en Cloud Run.

2. Configuración y requisitos

Configuración del entorno a su propio ritmo

  1. Accede a la Google Cloud Console y crea un proyecto nuevo o reutiliza uno existente. Si aún no tienes una cuenta de Gmail o de Google Workspace, debes crear una.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • El Nombre del proyecto es el nombre visible de los participantes de este proyecto. Es una cadena de caracteres que no se utiliza en las APIs de Google. Puedes actualizarla cuando quieras.
  • El ID del proyecto es único en todos los proyectos de Google Cloud y es inmutable (no se puede cambiar después de configurarlo). La consola de Cloud genera automáticamente una cadena única. Por lo general, no importa cuál sea. En la mayoría de los codelabs, deberás hacer referencia al ID de tu proyecto (suele identificarse como PROJECT_ID). Si no te gusta el ID que se generó, podrías generar otro aleatorio. También puedes probar uno propio y ver si está disponible. No se puede cambiar después de este paso y se usa el mismo durante todo el proyecto.
  • Recuerda que hay un tercer valor, un número de proyecto, que usan algunas APIs. Obtén más información sobre estos tres valores en la documentación.
  1. A continuación, deberás habilitar la facturación en la consola de Cloud para usar las APIs o los recursos de Cloud. Ejecutar este codelab no costará mucho, tal vez nada. Para cerrar recursos y evitar que se generen cobros más allá de este instructivo, puedes borrar los recursos que creaste o borrar el proyecto. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de$300.

Iniciar Cloud Shell

Si bien Google Cloud se puede operar de manera remota desde tu laptop, en este instructivo usarás Cloud Shell, un entorno de línea de comandos que se ejecuta en la nube.

Activar Cloud Shell

  1. En la consola de Cloud, haz clic en Activar Cloud Shell

3c1dabeca90e44e5.png

Si es la primera vez que inicias Cloud Shell, aparecerá una pantalla intermedia en la que se describirá qué es. Si se te mostró una pantalla intermedia, haz clic en Continuar.

9c92662c6a846a5c.png

El aprovisionamiento y la conexión a Cloud Shell solo tomará unos minutos.

9f0e51b578fecce5.png

Esta máquina virtual está cargada con todas las herramientas de desarrollo necesarias. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud, lo que permite mejorar considerablemente el rendimiento de la red y la autenticación. Gran parte de tu trabajo en este codelab, si no todo, se puede hacer con un navegador.

Una vez que te conectes a Cloud Shell, deberías ver que ya te autenticaste y que el proyecto ya se configuró con el ID de tu proyecto.

  1. En Cloud Shell, ejecuta el siguiente comando para confirmar que tienes la autenticación:
gcloud auth list

Resultado del comando

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. En Cloud Shell, ejecuta el siguiente comando para confirmar que el comando gcloud conoce tu proyecto.
gcloud config list project

Resultado del comando

[core]
project = <PROJECT_ID>

De lo contrario, puede configurarlo con este comando:

gcloud config set project <PROJECT_ID>

Resultado del comando

Updated property [core/project].

3. Habilita las APIs

En Cloud Shell, habilita las APIs de Artifact Registry, Cloud Build y Cloud Run:

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  run.googleapis.com

Se mostrará un mensaje de éxito similar a este:

Operation "operations/..." finished successfully.

Ahora, ya puedes comenzar a trabajar y escribir tu aplicación.

4. Escribe la aplicación

En este paso, compilarás una aplicación de FastAPI Python "Hello World" que responde a solicitudes HTTP.

Directorio de trabajo

Usa Cloud Shell para crear un directorio de trabajo llamado helloworld-fastapi y cambiar a él:

mkdir ~/helloworld-fastapi && cd ~/helloworld-fastapi

main.py

Crea un archivo llamado main.py:

touch main.py

Edita el archivo con tu editor de línea de comandos preferido (nano, vim o emacs) o haciendo clic en el botón Editor de Cloud Shell:

10af7b1a6240e9f4.gif

Para editar el archivo directamente con el Editor de Cloud Shell, usa este comando:

cloudshell edit main.py

main.py

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def hello(name: str = "World"):
    """Return a friendly HTTP greeting."""
    return {
        "message": f"Hello {name}!"
    }

Con este código, se crea un servicio web básico que responde a solicitudes HTTP GET con un mensaje amigable.

requirements.txt

Vuelve a abrir la terminal y agrega un archivo llamado requirements.txt para definir las dependencias:

touch requirements.txt

Para editar el archivo directamente con el Editor de Cloud Shell, usa este comando:

cloudshell edit requirements.txt

requirements.txt

# https://pypi.org/project/fastapi
fastapi[standard]==0.116.1

# https://pypi.org/project/uvicorn
uvicorn==0.35.0

La aplicación de FastAPI está lista para implementarse, pero primero es hora de probarla.

5. Prueba la aplicación

Para probar la aplicación, usa uv (el administrador de proyectos y paquetes extremadamente rápido de Python), que viene preinstalado en Cloud Shell.

Para probar la aplicación, crea un entorno virtual:

uv venv

Instala las dependencias:

uv pip install -r requirements.txt

Inicia la aplicación en modo dev:

uv run fastapi dev main.py --port=8080

Los registros muestran que estás en modo de desarrollo:

FastAPI   Starting development server 🚀

          Searching for package file structure from directories with __init__.py files
          Importing from /home/user/code/helloworld-fastapi

  module  🐍 main.py

    code  Importing the FastAPI app object from the module with the following code:

          from main import app

     app  Using import string: main:app

  server   Server started at http://127.0.0.1:8080
  server   Documentation at http://127.0.0.1:8080/docs

     tip   Running in development mode, for production use: fastapi run

           Logs:

    INFO   Will watch for changes in these directories: ['/home/user/code/helloworld-fastapi']
    INFO   Uvicorn running on http://127.0.0.1:8080 (Press CTRL+C to quit)
    INFO   Started reloader process [19627] using WatchFiles
    INFO   Started server process [19629]
    INFO   Waiting for application startup.
    INFO   Application startup complete.

En la ventana de Cloud Shell, haz clic en el ícono Web Preview y selecciona Preview on port 8080:

6c9ff9e5c692c58e.gif

Debería abrirse una ventana del navegador con el mensaje Hello World!.

También puedes abrir otra sesión de Cloud Shell (una pestaña nueva de la terminal) haciendo clic en el ícono + y enviando una solicitud web a la aplicación que se ejecuta de forma local:

curl localhost:8080

Deberías recibir la siguiente respuesta:

{"message": "Hello World!"}

Cuando termines, vuelve a la sesión principal de Cloud Shell y detén el servidor de desarrollo de FastAPI con CTRL+C.

La aplicación funciona como se esperaba: es hora de implementarla.

6. Implementa en Cloud Run

Cloud Run es regional, lo que significa que la infraestructura que ejecuta tus servicios se ubica en una región específica y Google la administra para que esté disponible de manera redundante en todas las zonas de esa región. Define la región que usarás para tu implementación, por ejemplo:

REGION=europe-west4

Asegúrate de que aún estés en el directorio de trabajo:

ls

Deberían aparecer los siguientes archivos:

main.py  requirements.txt

Antes de la implementación, crea un archivo .gcloudignore con .venv/ en él. Esto impide que la implementación de Cloud Run incluya el entorno virtual que se creó a partir de uv durante las pruebas locales.

Crea el archivo .gcloudignore con el siguiente comando:

echo ".venv/" > .gcloudignore

Implementa la aplicación en Cloud Run:

gcloud run deploy helloworld-fastapi \
  --source . \
  --region $REGION \
  --allow-unauthenticated
  • La opción --allow-unauthenticated hace que el servicio esté disponible de forma pública. Para evitar solicitudes no autenticadas, usa --no-allow-unauthenticated en su lugar.

La primera vez, se te solicitará que crees un repositorio de Artifact Registry. Presiona Enter para validar:

Deploying from source requires an Artifact Registry Docker repository to store
built containers. A repository named [cloud-run-source-deploy] in region [REGION]
will be created.

Do you want to continue (Y/n)?

Se iniciará la carga de tu código fuente al repositorio de Artifact Registry y la compilación de tu imagen de contenedor:

Building using Buildpacks and deploying container ...
* Building and deploying new service... Building Container.           
  OK Creating Container Repository...
  OK Uploading sources...
  * Building Container... Logs are available at ...

Luego, espera un momento a que finalice la implementación. Si la operación es exitosa, la línea de comandos mostrará la URL de servicio:

...
OK Building and deploying new service... Done.
  OK Creating Container Repository...
  OK Uploading sources...
  OK Building Container... Logs are available at ...
  OK Creating Revision... Creating Service.
  OK Routing traffic...
  OK Setting IAM Policy...
Done.
Service [SERVICE]... has been deployed and is serving 100 percent of traffic.
Service URL: https://SERVICE-PROJECTHASH-REGIONID.a.run.app

Puedes obtener la URL de servicio con este comando:

SERVICE_URL=$( \
  gcloud run services describe helloworld-fastapi \
  --region $REGION \
  --format "value(status.address.url)" \
)
echo $SERVICE_URL

Debería aparecer algo como lo siguiente:

https://helloworld-fastapi-PROJECTHASH-REGIONID.a.run.app

Ahora puedes usar tu aplicación abriendo la URL de servicio en un navegador web:

helloworld-fastapi.gif

También puedes llamar a la aplicación desde Cloud Shell:

curl $SERVICE_URL?name=me

Deberías recibir el saludo esperado:

{"message": "Hello me!"}

¡Felicitaciones! Acabas de implementar una aplicación en Cloud Run. Cloud Run escala la imagen del contenedor automáticamente y de forma horizontal para controlar las solicitudes que se reciben y, luego, reduce la escala verticalmente cuando disminuye la demanda. Solo debes pagar por la CPU, la memoria y las herramientas de redes que se utilicen durante la administración de la solicitud para este servicio de Cloud Run.

7. Limpia

Si bien Cloud Run no cobra cuando el servicio no se usa, es posible que se te cobre por el almacenamiento de la imagen de contenedor en Artifact Registry. Puedes borrar el repositorio o el proyecto de Cloud para evitar que se apliquen cargos. Si borras tu proyecto de Cloud, se dejan de facturar todos los recursos que usaste en ese proyecto.

Para borrar el repositorio de imágenes del contenedor, haz lo siguiente:

gcloud artifacts repositories delete cloud-run-source-deploy \
  --location $REGION

Para borrar el servicio de Cloud Run, haz lo siguiente:

gcloud run services delete helloworld-fastapi \
  --region $REGION

Para borrar tu proyecto de Google Cloud,

  1. Recupera tu ID del proyecto actual:
PROJECT_ID=$(gcloud config get-value core/project)
  1. Asegúrate de que este sea el proyecto que deseas borrar:
echo $PROJECT_ID
  1. Borra el proyecto:
gcloud projects delete $PROJECT_ID

8. ¡Felicitaciones!

96d07289bb51daa7.png

Creaste una aplicación web de FastAPI "Hello World" y la implementaste en Cloud Run.

Temas abordados

  • Cómo crear una aplicación de FastAPI "Hello World".
  • Cómo probar la aplicación ejecutando el servidor de FastAPI en modo dev.
  • Los Cloud Buildpacks y cómo la presencia de fastapi y uvicorn en un requirements.txt permiten que no se necesite un Dockerfile.
  • Cómo implementar la aplicación de FastAPI en Cloud Run.

Más información