En este documento, se explica cómo entregar contenido estático seguro desde Cloud Storage con Cloud Run y Identity-Aware Proxy.
Cloud Run te permite alojar un servidor web que entrega contenido estático desde un bucket privado de Cloud Storage. Agregar IAP te ayuda a proteger el servicio de Cloud Run, lo que evita el acceso no autorizado y, al mismo tiempo, evita la necesidad de volver a compilar la imagen de contenedor cuando cambia el contenido.
El hosting de sitios web estáticos de Cloud Storage solo entrega contenido público y requiere otorgar acceso de lectura a allUsers. Si tu organización restringe los buckets públicos con
políticas como la prevención de acceso público o
el uso compartido restringido por dominio,
la función integrada de hosting de sitios web estáticos de Cloud Storage no está disponible.
En su lugar, mantén tu bucket privado, implementa un servidor web NGINX en Cloud Run con el bucket activado como un volumen y usa IAP para controlar el acceso al servicio de Cloud Run.
Antes de comenzar
Para completar las instrucciones de este documento, necesitas lo siguiente:
- Un Google Cloud proyecto con la facturación habilitada. Ir a la Google Cloud consola
- Un bucket privado de Cloud Storage que contenga tus archivos estáticos (por ejemplo,
index.html, CSS y imágenes) Asegúrate de que el bucket no sea público. - La Google Cloud CLI instalada.
Otorga acceso al bucket de Cloud Storage
Cloud Run necesita permiso para leer archivos de tu bucket privado de Cloud Storage. Debes otorgar a la identidad del servicio de Cloud Run el rol de visualizador de objetos de Storage (roles/storage.objectViewer) en el bucket.
Te recomendamos que uses una cuenta de servicio administrada por el usuario para tu servicio de Cloud Run en lugar de la cuenta de servicio predeterminada de Compute Engine.
Crea una cuenta de servicio para usarla como la identidad del servicio:
gcloud iam service-accounts create RUN_SERVICE_ACCOUNT \ --description="Service account for Cloud Run serving Cloud Storage" \ --display-name="Cloud Run Cloud Storage Reader"Otorga a la cuenta de servicio el rol de visualizador de objetos de Storage (
roles/storage.objectViewer) en el bucket:gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \ --member="serviceAccount:RUN_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/storage.objectViewer"
Implementa el servicio de Cloud Run
Implementa el servidor web NGINX en Cloud Run y activa el bucket de Cloud Storage. Debes usar el entorno de ejecución de segunda generación para admitir activaciones de volúmenes.
Para activar el bucket, implementa el servicio con marcas de volumen:
gcloud run deploy SERVICE_NAME \
--image=nginx \
--port=80 \
--execution-environment=gen2 \
--service-account=RUN_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com \
--add-volume=name=static,type=cloud-storage,bucket=BUCKET_NAME,readonly=true \
--add-volume-mount=volume=static,mount-path=/usr/share/nginx/html \
--no-allow-unauthenticated
Reemplaza lo siguiente:
SERVICE_NAME: el nombre de tu servicio de Cloud RunRUN_SERVICE_ACCOUNT: la cuenta de servicio que creaste en el paso anteriorPROJECT_ID: tu Google Cloud ID del proyectoBUCKET_NAME: el nombre de tu bucket de Cloud Storage
El bucket se activa en /usr/share/nginx/html, que es el directorio predeterminado en el que NGINX busca recursos estáticos. Esto significa que los archivos de tu bucket se asignan directamente a la ruta raíz de tu servicio. Por ejemplo, se puede acceder a un archivo
almacenado en gs://BUCKET_NAME/index.html en https://SERVICE_URL/index.html.
Para verificar la implementación, comprueba que el servicio bloquee el acceso no autenticado y muestre un estado 403 Forbidden cuando se accede sin credenciales:
curl -I SERVICE_URL
Como alternativa, puedes probar si el contenedor renderiza correctamente los archivos de tu bucket privado de Cloud Storage antes de configurar el acceso a IAP. Para ello, ejecuta el siguiente comando para enviar una solicitud autenticada con tus credenciales de desarrollador:
curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" SERVICE_URL
Reemplaza SERVICE_URL por la URL de tu servicio de Cloud Run.
Habilitar IAP
Después de implementar tu servicio de Cloud Run, puedes habilitar IAP para protegerlo.
Te recomendamos que habilites IAP directamente en el servicio de Cloud Run. Para obtener instrucciones, consulta Configura IAP para Cloud Run.
Como alternativa, si usas un balanceador de cargas de HTTPS externo frente a tu servicio de Cloud Run, puedes habilitar IAP en el servicio de backend. Para obtener instrucciones, consulta Habilita IAP desde un servicio de backend o un balanceador de cargas.
Almacenamiento en caché y rendimiento
Cuando usas activaciones de volúmenes de Cloud Storage, cada archivo que lee Cloud Run se traduce en una llamada a la API de Cloud Storage. Para minimizar la latencia y los costos de la API, puedes configurar el almacenamiento en caché en tu servidor web (por ejemplo, con directivas de almacenamiento en caché de NGINX) o configurar las opciones de activación de Cloud Storage FUSE.
Si usas un balanceador de cargas de HTTPS externo, también puedes habilitar Cloud CDN en el servicio de backend. IAP no es compatible con Cloud CDN en el mismo servicio de backend, por lo que es posible que debas estructurar tu arquitectura en consecuencia si necesitas ambos.
Limitaciones
Leer archivos desde una activación de volumen de Cloud Storage puede ser más lento que acceder a un sistema de archivos local. Para mitigar la latencia de lectura, configura el almacenamiento en caché.
Otros casos prácticos
También puedes usar activaciones de volúmenes de Cloud Storage para otras situaciones:
- Funciones basadas en eventos: Una función lee los archivos subidos directamente desde el sistema de archivos.
- Aplicaciones de IA generativa: Una aplicación carga una base de datos de vectores (como Chroma) desde un bucket de Cloud Storage con lecturas estándar del sistema de archivos.
Alternativa: Activa volúmenes de NFS
Si tus archivos se almacenan en Filestore o en un servidor NFS autoalojado, puedes activar volúmenes de NFS en tu servicio de Cloud Run en lugar de buckets de Cloud Storage. Para obtener más información, consulta Activa volúmenes de NFS.