Questo documento spiega come pubblicare contenuti statici sicuri da Cloud Storage utilizzando Cloud Run e Identity-Aware Proxy.
Cloud Run ti consente di ospitare un server web che fornisce contenuti statici da un bucket Cloud Storage privato. L'aggiunta di IAP ti aiuta a proteggere il servizio Cloud Run, impedendo l'accesso non autorizzato ed evitando la necessità di ricompilare l'immagine container quando i contenuti cambiano.
L'hosting di siti web statici di Cloud Storage pubblica solo contenuti pubblici e richiede
la concessione dell'accesso in lettura a allUsers. Se la tua organizzazione limita i bucket pubblici utilizzando policy come la prevenzione dell'accesso pubblico o la condivisione con limitazioni del dominio, la funzionalità di hosting di siti web statici di Cloud Storage integrata non è disponibile.
Mantieni invece il bucket privato, esegui il deployment di un server web NGINX su Cloud Run
con il bucket montato come volume e utilizza IAP per controllare l'accesso al
servizio Cloud Run.
Prima di iniziare
Per completare le istruzioni riportate in questo documento, hai bisogno di quanto segue:
- Un progetto Google Cloud con la fatturazione abilitata. Vai alla console Google Cloud
- Un bucket Cloud Storage privato che contiene i tuoi file statici (ad esempio,
index.html, CSS e immagini). Assicurati che il bucket non sia pubblico. - Google Cloud CLI installato.
Concedi l'accesso al bucket Cloud Storage
Cloud Run necessita dell'autorizzazione per leggere i file dal tuo bucket Cloud Storage privato. Devi concedere all'identità di servizio Cloud Run
il ruolo Visualizzatore oggetti Storage (roles/storage.objectViewer) sul bucket.
Ti consigliamo di utilizzare un account di servizio gestito dall'utente per il servizio Cloud Run anziché il account di servizio Compute Engine predefinito.
Crea un account di servizio da utilizzare come identità del servizio:
gcloud iam service-accounts create RUN_SERVICE_ACCOUNT \ --description="Service account for Cloud Run serving Cloud Storage" \ --display-name="Cloud Run Cloud Storage Reader"Concedi al account di servizio il ruolo Storage Object Viewer (
roles/storage.objectViewer) sul 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"
Esegui il deployment del servizio Cloud Run
Esegui il deployment del server web NGINX in Cloud Run e monta il bucket Cloud Storage. Per supportare i montaggi dei volumi, devi utilizzare l'ambiente di esecuzione di seconda generazione.
Per montare il bucket, esegui il deployment del servizio con i flag del volume:
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
Sostituisci quanto segue:
SERVICE_NAME: il nome del tuo servizio Cloud RunRUN_SERVICE_ACCOUNT: il account di servizio che hai creato nel passaggio precedentePROJECT_ID: il tuo Google Cloud ID progettoBUCKET_NAME: il nome del bucket Cloud Storage
Il bucket è montato su /usr/share/nginx/html, che è la directory predefinita
in cui NGINX cerca gli asset statici. Ciò significa che i file nel tuo
bucket sono mappati direttamente al percorso principale del tuo servizio. Ad esempio, un file
memorizzato in gs://BUCKET_NAME/index.html è accessibile all'indirizzo https://SERVICE_URL/index.html.
Per verificare il deployment, controlla che il servizio blocchi l'accesso non autenticato
e restituisca lo stato 403 Forbidden quando viene eseguito l'accesso senza credenziali:
curl -I SERVICE_URL
In alternativa, puoi verificare se il container esegue correttamente il rendering dei file dal tuo bucket Cloud Storage privato prima di configurare l'accesso IAP. Per farlo, esegui questo comando per inviare una richiesta autenticata utilizzando le tue credenziali sviluppatore:
curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" SERVICE_URL
Sostituisci SERVICE_URL con l'URL del tuo servizio Cloud Run.
Abilitare IAP
Dopo aver eseguito il deployment del servizio Cloud Run, puoi abilitare IAP per proteggerlo.
Ti consigliamo di abilitare IAP direttamente sul servizio Cloud Run. Per istruzioni, vedi Configurare IAP per Cloud Run.
In alternativa, se utilizzi un bilanciatore del carico HTTPS esterno davanti al tuo servizio Cloud Run, puoi attivare IAP sul servizio di backend. Per istruzioni, vedi Abilitare IAP da un servizio di backend o un bilanciatore del carico.
Memorizzazione nella cache e prestazioni
Quando utilizzi i volumi di Cloud Storage, ogni file letto da Cloud Run si traduce in una chiamata all'API Storage. Per ridurre al minimo la latenza e i costi dell'API, puoi configurare la memorizzazione nella cache nel server web (ad esempio, utilizzando le direttive di memorizzazione nella cache NGINX) o configurare le opzioni di montaggio FUSE di Cloud Storage.
Se utilizzi un bilanciatore del carico HTTPS esterno, puoi anche abilitare Cloud CDN sul servizio di backend. IAP non è compatibile con Cloud CDN sullo stesso servizio di backend, quindi potrebbe essere necessario strutturare l'architettura di conseguenza se hai bisogno di entrambi.
Limitazioni
La lettura dei file da un punto di montaggio del volume Cloud Storage potrebbe essere più lenta rispetto all'accesso a un file system locale. Per ridurre la latenza di lettura, configura la memorizzazione nella cache.
Altri casi d'uso
Puoi anche utilizzare i montaggi dei volumi Cloud Storage per altri scenari:
- Funzioni basate su eventi: una funzione legge i file caricati direttamente dal file system.
- Applicazioni di AI generativa: un'applicazione carica un database vettoriale (ad esempio Chroma) da un bucket Cloud Storage utilizzando letture standard del file system.
Alternativa: montaggio di volumi NFS
Se i tuoi file sono archiviati su Filestore o su un server NFS self-hosted, puoi montare i volumi NFS sul tuo servizio Cloud Run anziché sui bucket Cloud Storage. Per saperne di più, consulta Montaggio di volumi NFS.