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 pubblica 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 di dominio,
la funzionalità di hosting di siti web statici di Cloud Storage integrata non è disponibile.
Mantieni invece privato il bucket, 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, devi disporre di:
- Un Google Cloud progetto con fatturazione abilitata. Vai alla Google Cloud console
- Un bucket Cloud Storage privato che contiene i file statici (ad esempio
index.html, CSS e immagini). Assicurati che il bucket non sia pubblico. - Il Google Cloud CLI installato.
Concedere l'accesso al bucket Cloud Storage
Cloud Run ha bisogno dell'autorizzazione per leggere i file dal tuo bucket Cloud Storage privato. Devi concedere al 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 Visualizzatore oggetti Storage (
roles/storage.objectViewer) sul bucket:gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \ --member="serviceAccount:RUN_SERVICE_ACCOUNT@PROJECT_ID." \ --role="roles/storage.objectViewer"
Eseguire 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. \
--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 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, ovvero la directory predefinita in cui NGINX cerca gli asset statici. Ciò significa che i file nel bucket vengono mappati direttamente al percorso principale del servizio. Ad esempio, un file
archiviato 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 il comando seguente per inviare una richiesta autenticata utilizzando le credenziali dello sviluppatore:
curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" SERVICE_URL
Sostituisci SERVICE_URL con l'URL del 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, consulta Configurare IAP per Cloud Run.
In alternativa, se utilizzi un bilanciatore del carico HTTPS esterno davanti al servizio Cloud Run, puoi abilitare IAP sul servizio di backend. Per istruzioni, consulta Abilitare IAP da un servizio di backend o da un bilanciatore del carico.
Memorizzazione nella cache e prestazioni
Quando utilizzi i montaggi dei volumi Cloud Storage, ogni file letto da Cloud Run si traduce in una chiamata API Storage. Per ridurre al minimo la latenza e i costi delle 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 potresti dover strutturare l'architettura di conseguenza se hai bisogno di entrambi.
Limitazioni
La lettura dei file da un 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 utilizzare i montaggi dei volumi Cloud Storage anche per altri scenari:
- Funzioni basate su eventi: una funzione legge i file caricati direttamente da l file system.
- Applicazioni di AI generativa: un'applicazione carica un database vettoriale (ad esempio Chroma) da un bucket Cloud Storage utilizzando le letture standard del file system.
Alternativa: montaggio dei volumi NFS
Se i file sono archiviati su Filestore o su un server NFS self-hosted, puoi montare i volumi NFS sul servizio Cloud Run anziché sui bucket Cloud Storage. Per ulteriori informazioni, consulta Montaggio dei volumi NFS.