In questo articolo analizziamo la nuova funzionalità di Cloud Run che consente di montare un bucket Cloud Storage come volume del container.
Introduzione
Per chi vuole usare servizi serverless come Cloud Run per un sito web statico, è probabile che servano file archiviati in un bucket. Una nuova funzionalità di Google Cloud Platform rende oggi tutto questo più semplice che mai. Per chi non lo conoscesse, Cloud Run è un servizio gestito per eseguire workloads containerizzati sull'infrastruttura scalabile di Google. In questo articolo prendiamo in esame il caso del sito web statico, ma i casi d'uso di questa funzionalità sono praticamente infiniti.
Il problema
Fino a poco tempo fa, per accedere all'object storage da Cloud Run bisognava ricorrere a strumenti di terze parti o a cloud client library all'interno dell'applicazione. Soluzioni funzionanti, certo, ma che spesso introducevano problemi di scalabilità e oneri di gestione nel processo di delivery applicativo.
Con la recente introduzione dei mount di Cloud Storage in Cloud Run, è ora possibile montare i bucket Cloud Storage come volumi all'interno dei container Cloud Run senza ricorrere a librerie aggiuntive.
Visti i miglioramenti e i relativi vantaggi, passiamo ora al nostro caso d'uso: l'hosting di un sito web statico tramite Cloud Run e i volume mount di Cloud Storage.
La soluzione
Iniziamo creando un progetto per ospitare l'applicazione e il bucket di storage. Dalla sua applicazione da riga di comando preferita, imposti alcune variabili d'ambiente nel terminale e configuri gcloud.
export GCP_PROJECT=my-cloud-run-static-site
export REGION=us-east4
gcloud projects create $GCP_PROJECT
gcloud config set project $GCP_PROJECT
A questo punto, abiliti le API di Cloud Run, Cloud Build e Artifact Registry per poter utilizzare questi servizi.
gcloud services enable run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com
È il momento di scaricare il codice del nostro sito statico.
git clone https://github.com/waymanls/my-cloud-run-static-site.git
Guardando il contenuto del file index.html, si nota che le immagini vengono collocate nel path /images. Questo path ci servirà più avanti nel tutorial. Per ora, creiamo il bucket Cloud Storage che ospiterà gli asset statici e carichiamoci anche l'immagine JPEG.
gcloud storage buckets create gs://$GCP_PROJECT-bucket --location=$REGION
gcloud storage cp beach.jpeg gs://$GCP_PROJECT-bucket/beach.jpeg
Passiamo ora alla creazione del repository Artifact Registry.
gcloud artifacts repositories create $GCP_PROJECT-repo \
--repository-format=docker \
--location=$GCP_REGION
Ora che il repository Artifact Registry è pronto, possiamo costruire la container image e pubblicarla con Cloud Build.
gcloud builds submit --tag $REGION-docker.pkg.dev/$GCP_PROJECT/$GCP_PROJECT-repo/$GCP_PROJECT-svc
Una volta pubblicata la container image nel repository, la possiamo usare per creare un'applicazione Cloud Run di seconda generazione.
gcloud run deploy $GCP_PROJECT-svc --image $REGION-docker.pkg.dev/$GCP_PROJECT/$GCP_PROJECT-repo/$GCP_PROJECT-svc \
--execution-environment=gen2 --allow-unauthenticated
Ora possiamo realizzare l'ultimo tassello del nostro esempio: collegare il bucket Cloud Storage come volume del container. L'operazione si esegue "aggiornando" il servizio Cloud Run. Anche se i valori di configurazione si forniscono tramite switch del comando gcloud, possono essere passati anche con un file YAML di servizio. Come si può vedere nel comando qui sotto, usiamo il path "images" impostato in precedenza nel file index.html come path base e nome del volume del container.
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 termine dei passaggi descritti, avrà un'applicazione Cloud Run che monta correttamente un bucket Cloud Storage come volume all'interno del servizio Cloud Run e accede a un oggetto da quel volume.

Pulizia delle risorse
Al termine, consigliamo di eliminare il progetto con il seguente comando.
gcloud projects delete $GCP_PROJECT
I vantaggi di questo approccio includono la possibilità di collegare in modo nativo i workloads serverless di Cloud Run direttamente agli asset statici nei backend di object store, eliminando la necessità, fino ad oggi indispensabile, di cloud client library e servizi di terze parti.