Este artículo describe la reciente mejora de Cloud Run que permite montar un bucket de Cloud Storage como volumen de contenedor.
Introducción
Si quieres usar servicios serverless como Cloud Run para un sitio web estático, lo más probable es que necesites trabajar con archivos guardados en un bucket. Una nueva funcionalidad de Google Cloud Platform lo vuelve más sencillo que nunca. Por si no lo conoces, Cloud Run es un servicio administrado para ejecutar workloads en contenedores sobre la infraestructura escalable de Google. En este artículo tomamos como ejemplo un sitio web estático, aunque los casos de uso de esta funcionalidad son prácticamente infinitos.
El problema
Hasta hace poco, para acceder al almacenamiento de objetos desde Cloud Run había que recurrir a herramientas de terceros o a bibliotecas cliente de la nube dentro de la aplicación. Aunque funcionaba, este enfoque solía sumar carga de escalabilidad y administración al proceso de despliegue.
Con la reciente incorporación de los montajes de Cloud Storage en Cloud Run, ya puedes montar buckets de Cloud Storage como volúmenes dentro de los contenedores de Cloud Run sin recurrir a bibliotecas adicionales.
Ya que repasamos las mejoras y sus beneficios, vamos al caso de uso: alojar un sitio web estático con Cloud Run y montajes de volumen de Cloud Storage.
La solución
Empieza creando un proyecto que aloje la aplicación y el bucket de almacenamiento. Desde tu aplicación de línea de comandos preferida, define algunas variables de entorno útiles en la terminal y configura gcloud.
export GCP_PROJECT=my-cloud-run-static-site
export REGION=us-east4
gcloud projects create $GCP_PROJECT
gcloud config set project $GCP_PROJECT
Luego, habilita las APIs de Cloud Run, Cloud Build y Artifact Registry para poder usar estos servicios.
gcloud services enable run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com
Ahora descarguemos el código de nuestro sitio estático.
git clone https://github.com/waymanls/my-cloud-run-static-site.git
Si revisas el contenido del archivo index.html, notarás que las imágenes se ubican en la ruta /images. Vamos a necesitar esa ruta más adelante en el tutorial. Por ahora, creemos el bucket de Cloud Storage que alojará los recursos estáticos y subamos también la imagen JPEG.
gcloud storage buckets create gs://$GCP_PROJECT-bucket --location=$REGION
gcloud storage cp beach.jpeg gs://$GCP_PROJECT-bucket/beach.jpeg
A continuación, crea el repositorio de Artifact Registry.
gcloud artifacts repositories create $GCP_PROJECT-repo \
--repository-format=docker \
--location=$GCP_REGION
Con el repositorio de Artifact Registry ya creado, construiremos la imagen del contenedor y la subiremos con Cloud Build.
gcloud builds submit --tag $REGION-docker.pkg.dev/$GCP_PROJECT/$GCP_PROJECT-repo/$GCP_PROJECT-svc
Una vez que la imagen del contenedor esté en el repositorio, podemos usarla para crear una aplicación de Cloud Run de Segunda Generación.
gcloud run deploy $GCP_PROJECT-svc --image $REGION-docker.pkg.dev/$GCP_PROJECT/$GCP_PROJECT-repo/$GCP_PROJECT-svc \
--execution-environment=gen2 --allow-unauthenticated
Llegamos al componente final del ejemplo: vincular el bucket de Cloud Storage como volumen del contenedor. Esto se hace "actualizando" el servicio de Cloud Run. Si bien los valores de configuración se pasan mediante flags en el comando gcloud, también pueden definirse a través de un archivo YAML de Service. Como ves en el comando de abajo, usamos la ruta "images" que definimos antes en el archivo index.html como ruta base y nombre del volumen del contenedor.
gcloud run services update $GCP_PROJECT-svc \
--execution-environment=gen2 \
--add-volume=name=images,type=cloud-storage,bucket=$GCP_PROJECT-bucket \
--add-volume-mount=volume=images,mount-path=/usr/share/nginx/html/images
Al terminar estos pasos, tendrás una aplicación de Cloud Run que monta correctamente un bucket de Cloud Storage como volumen dentro del servicio y accede a un objeto desde ese volumen.

Limpieza
Al finalizar, se recomienda eliminar el proyecto con el siguiente comando.
gcloud projects delete $GCP_PROJECT
Entre las ventajas de este método destaca la posibilidad de conectar de forma nativa tus workloads serverless de Cloud Run directamente con los recursos estáticos del backend de almacenamiento de objetos, lo que elimina la necesidad de bibliotecas cliente de la nube y servicios de terceros.