Questo tutorial descrive come eseguire la migrazione delle app web Node.js in esecuzione Da Heroku a Cloud Run su Google Cloud. Questo tutorial è destinato agli architetti e ai proprietari di prodotti che vogliono eseguire la migrazione delle loro app da Heroku ai servizi gestiti su Google Cloud.
Cloud Run è una piattaforma di computing gestita che ti consente di eseguire di container stateless richiamabili tramite richieste HTTP. Si basa su open source Knative che consente la portabilità su più piattaforme e supporta i flussi di lavoro dei container. standard per la distribuzione continua. La piattaforma Cloud Run integrati con la suite di prodotti Google Cloud, permettendoti di per progettare e sviluppare app portabili, scalabili e resilienti.
In questo tutorial imparerai a eseguire la migrazione di un'app in Google Cloud scritte in Node.js e usa Heroku Postgres come servizio di supporto su Heroku. L'app web è containerizzata e ospitata Cloud Run e utilizza Cloud SQL per PostgreSQL come persistenza livello di sicurezza.
Nel tutorial utilizzi un'app semplice chiamata Tasks che ti consente di visualizzare e creare attività di machine learning. Queste attività sono archiviate in Heroku Postgres nel deployment attuale sull'app su Heroku.
Questo tutorial presuppone che tu abbia familiarità con le funzionalità di base di Heroku e di avere un account Heroku (o avere accesso a uno di questi). Inoltre, presuppone che tu familiarità con Cloud Run Cloud SQL Docker e Node.js.
Obiettivi
- Crea un'immagine Docker per eseguire il deployment dell'app in Cloud Run.
- Crea un'istanza Cloud SQL per PostgreSQL da utilizzare come dopo la migrazione in Google Cloud.
- Esamina il codice Node.js per comprendere come Cloud Run si connette a Cloud SQL per vedere le eventuali modifiche al codice per eseguire la migrazione da Heroku a Cloud Run.
- Esegui la migrazione dei dati da Heroku Postgres a Cloud SQL per PostgreSQL.
- Eseguire il deployment dell'app in Cloud Run.
- Testa l'app di cui hai eseguito il deployment.
Costi
In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi basata sull'utilizzo previsto,
utilizza il Calcolatore prezzi.
Potresti anche ricevere un addebito per le risorse che usi su Heroku.
Prima di iniziare
- Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.
-
Abilita le API Cloud SQL, Cloud Build, Cloud Run, Container Registry, Service Networking, Serverless VPC Access.
-
Make sure that you have the following role or roles on the project: Cloud Run > Cloud Run Admin, Cloud Storage > Storage Admin, Cloud SQL > Cloud SQL Admin, Compute Engine > Compute Network Admin, Resource Manager > Project IAM Admin, Cloud Build > Cloud Build Editor, Serverless VPC Access > Serverless VPC Access Admin, Logging > Logs Viewer, Service Accounts > Service Account Admin, Service Accounts > Service Account User, and Service Usage > Service Usage Consumer
Check for the roles
-
In the Google Cloud console, go to the IAM page.
Go to IAM - Select the project.
-
In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.
- For all rows that specify or include you, check the Role colunn to see whether the list of roles includes the required roles.
Grant the roles
-
In the Google Cloud console, go to the IAM page.
Vai a IAM - Seleziona il progetto.
- Fai clic su Concedi l'accesso.
-
Nel campo Nuove entità, inserisci l'identificatore utente. In genere si tratta dell'indirizzo email di un Account Google.
- Nell'elenco Seleziona un ruolo, seleziona un ruolo.
- Per concedere altri ruoli, fai clic su Aggiungi un altro ruolo e aggiungi ogni altro ruolo.
- Fai clic su Salva.
-
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.
-
Abilita le API Cloud SQL, Cloud Build, Cloud Run, Container Registry, Service Networking, Serverless VPC Access.
-
Make sure that you have the following role or roles on the project: Cloud Run > Cloud Run Admin, Cloud Storage > Storage Admin, Cloud SQL > Cloud SQL Admin, Compute Engine > Compute Network Admin, Resource Manager > Project IAM Admin, Cloud Build > Cloud Build Editor, Serverless VPC Access > Serverless VPC Access Admin, Logging > Logs Viewer, Service Accounts > Service Account Admin, Service Accounts > Service Account User, and Service Usage > Service Usage Consumer
Check for the roles
-
In the Google Cloud console, go to the IAM page.
Go to IAM - Select the project.
-
In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.
- For all rows that specify or include you, check the Role colunn to see whether the list of roles includes the required roles.
Grant the roles
-
In the Google Cloud console, go to the IAM page.
Vai a IAM - Seleziona il progetto.
- Fai clic su Concedi l'accesso.
-
Nel campo Nuove entità, inserisci l'identificatore utente. In genere si tratta dell'indirizzo email di un Account Google.
- Nell'elenco Seleziona un ruolo, seleziona un ruolo.
- Per concedere altri ruoli, fai clic su Aggiungi un altro ruolo e aggiungi ogni altro ruolo.
- Fai clic su Salva.
-
Configurazione dell'ambiente
Apri Cloud Shell.
In Cloud Shell, imposta le variabili di ambiente e i valori predefiniti per Google Cloud CLI usata in questo tutorial.
gcloud config set project PROJECT_ID gcloud config set run/region us-central1
Sostituisci
PROJECT_ID
con l'ID progetto.
Architettura
Le seguenti figure descrivono l'architettura dell'app web su Heroku (così com'è) e il suo layout architetturale su Google Cloud (che creerai).
L'app Tasks di cui è stato eseguito il deployment in Heroku è composta da uno o più dynos. I dinosatici web sono in grado di ricevere e rispondere al traffico HTTP, a differenza di quelli dynos, più adatti per job in background e attività a tempo. L'app viene pubblicata una pagina di indice che mostra le attività archiviate in un database Postgres, la libreria dei modelli Mustache per Node.js.
Puoi accedere all'app da un URL HTTPS. Un percorso /tasks
in corrispondenza di quell'URL ti consente
creare nuove attività.
Su Google Cloud, Cloud Run viene utilizzato come ambiente per il deployment dell'app Tasks. Cloud Run è progettato per eseguire e container stateless basati su richieste. È adatta quando hai bisogno di per supportare app containerizzate che scalano automaticamente e inoltre scalano zero quando non gestiscono traffico.
Mappatura dei componenti utilizzati in Heroku in Google Cloud
La tabella seguente mappa i componenti della piattaforma Heroku a Google Cloud. Questo mapping ti aiuta a tradurre l'architettura descritta in questo tutorial da Da Heroku a Google Cloud.
Componente | Piattaforma Heroku | Google Cloud |
---|---|---|
Container | Dynos: Heroku usa il modello container per creare e scalare le app Heroku. Questi sistemi Linux I container sono chiamati dynos e possono scalare fino a un numero da te specificato per supportare le richieste di risorse per la tua app Heroku. Puoi scegliere tra un intervallo di tipi dinamo in base alla memoria e ai requisiti di CPU dell'app. | Container Cloud Run: Google Cloud supporta l'esecuzione di carichi di lavoro containerizzati in container stateless che possono essere eseguiti in un ambiente completamente gestito o in Google Kubernetes Engine (GKE) cluster. |
App web | App Heroku: le Dyno sono gli elementi costitutivi delle app Heroku. Le app di solito sono costituite da uno o più tipi di test dyno, di solito una combinazione di e dynos sul web e worker. | Servizio Cloud Run: è possibile modellare un'app web come servizio Cloud Run. Ogni servizio riceve il proprio protocollo HTTPS ed è in grado di fare automaticamente lo scale up o lo scale down da 0 a N in base il traffico verso l'endpoint di servizio. |
Database | Heroku Postgres è il database as a Service (DaaS) di Heroku basato su PostgreSQL. | Cloud SQL è un database gestito per i database relazionali su Google Cloud. |
Deployment dell'app web Tasks di esempio in Heroku
Le sezioni successive mostrano come configurare l'interfaccia a riga di comando (CLI) per Heroku, clona il repository di codice sorgente GitHub ed esegui il deployment dell'app su Heroku.
Configura l'interfaccia a riga di comando per Heroku
Questo tutorial esegue l'interfaccia a riga di comando Heroku in Cloud Shell e deve eseguire l'autenticazione utilizzando una chiave API Heroku. Durante l'esecuzione in Cloud Shell, l'interfaccia a riga di comando Heroku non può eseguire l'autenticazione utilizzando una password o un'autenticazione basata sul web.
In alternativa, se esegui l'esempio su un terminale locale, puoi utilizzare qualsiasi metodo di autenticazione dell'interfaccia a riga di comando Heroku. Quando esegui il tutorial su un terminale locale, devi anche installare Google Cloud CLI, git e Docker.
Accedi alla console web per Heroku. e poi copia il valore della chiave API dalla pagina delle impostazioni dell'account.
In Cloud Shell, installa l'interfaccia a riga di comando Heroku
In Cloud Shell, autentica l'interfaccia a riga di comando Heroku. Quando viene richiesto il password, inserisci il valore della chiave API che hai copiato da Heroku della console Google Cloud, non la password che utilizzi per accedervi.
heroku login --interactive
clona il repository del codice sorgente
In Cloud Shell, clona il repository GitHub dell'app Tasks di esempio:
git clone https://github.com/GoogleCloudPlatform/migrate-webapp-heroku-to-cloudrun-node.git
Passa alla directory creata clonando il repository:
cd migrate-webapp-heroku-to-cloudrun-node
La directory contiene i seguenti file:
- Uno script Node.js chiamato
index.js
con il codice per route gestite dall'app web. package.json
epackage-lock.json
file che e delineare le dipendenze dell'app web. Devi installare queste dipendenze per eseguire l'app.- Un file
Procfile
che specifica il comando eseguito dall'app all'avvio. Puoi creare un fileProcfile
su cui eseguire il deployment dell'app Heroku. - Una directory
views
, con i contenuti HTML pubblicati dal web app sulla barra "/" percorso. - Un file
.gitignore
.
- Uno script Node.js chiamato
Esegui il deployment di un'app su Heroku
In Cloud Shell, crea un'app Heroku:
heroku create
Prendi nota del nome creato per l'app. Questo valore è necessario in al passaggio successivo.
Crea una variabile di ambiente per il nome dell'app Heroku:
export APP_NAME=APP_NAME
Sostituisci
APP_NAME
con il nome dell'app restituito dal comandoheroku create
.Aggiungi il componente aggiuntivo Heroku Postgres per eseguire il provisioning di un database PostgreSQL:
heroku addons:create heroku-postgresql:mini
Assicurati che il componente aggiuntivo sia stato aggiunto:
heroku addons
Se il componente aggiuntivo Postgres è stato aggiunto correttamente, verrà visualizzato un messaggio simile al seguente:
Add-on Plan Price State ----------------- ----- -------- ----- heroku-postgresql mini 5$/month created
Esegui il deployment dell'app su Heroku:
git push heroku master
Esegui questo comando per confermare il valore di DATABASE_URL.
heroku config
Prendi nota del valore recuperato per DATABASE_URL. Questo valore è necessario in al passaggio successivo.
Eseguire un container Docker.
docker run -it --rm postgres psql "DATABASE_URL"
Sostituisci
DATABASE_URL
con l'URL di Heroku Postgres che hai notato nel passaggio precedente.Nel container Docker, crea la tabella
TASKS
utilizzando il metodo seguente comando:CREATE TABLE TASKS (DESCRIPTION TEXT NOT NULL);
Esci dal contenitore:
exit
In Cloud Shell, esegui il comando seguente per ottenere l'URL web della tua app Heroku:
heroku info
Apri l'URL web in una finestra del browser. L'app ha il seguente aspetto screenshot (anche se nella tua versione non saranno elencate le attività):
Crea attività di esempio nella tua app dal browser. Assicurati che le attività recuperate dal database e visibili nell'interfaccia utente.
Preparazione del codice dell'app web per la migrazione a Cloud Run
Questa sezione descrive i passaggi da completare per preparare la tua app web per il deployment in Cloud Run.
Crea e pubblica il tuo container Docker in Container Registry
Hai bisogno di un'immagine Docker per creare il container dell'app in modo che possa essere eseguito in Cloud Run. Puoi creare il container manualmente o utilizzando Buildpack.
Crea il container manualmente
In Cloud Shell, crea un Dockerfile nella directory creata clonando il repository per questo tutorial:
cat <<"EOF" > Dockerfile # Use the official Node image. # https://hub.docker.com/_/node FROM node:10-alpine # Create and change to the app directory. WORKDIR /app # Copying this separately prevents re-running npm install on every code change. COPY package*.json ./ RUN npm install # Copy local code to the container image. COPY . /app # Configure and document the service HTTP port. ENV PORT 8080 EXPOSE $PORT # Run the web service on container startup. CMD ["npm", "start"] EOF
Crea il tuo container con Cloud Build e pubblica l'immagine Container Registry:
gcloud builds submit --tag gcr.io/PROJECT_ID/APP_NAME:1 \ --gcs-log-dir=gs://PROJECT_ID_cloudbuild
Crea una variabile di ambiente per contenere il nome del Docker immagine creata da te:
export IMAGE_NAME="gcr.io/PROJECT_ID/APP_NAME:1"
Creazione di container con Buildpacks
In Cloud Shell, installa il interfaccia a riga di comando gcloud.
Imposta l'interfaccia a riga di comando del pacchetto in modo che utilizzi il builder Heroku per impostazione predefinita:
pack config default-builder heroku/buildpacks:22
Crea una variabile di ambiente in cui inserire il nome dell'immagine Docker:
export IMAGE_NAME=gcr.io/PROJECT_ID/APP_NAME:1
Crea l'immagine utilizzando il comando
pack
ed esegui il push o pubblica l'immagine in Container Registry:pack build --publish $IMAGE_NAME
Crea un'istanza Cloud SQL per PostgreSQL
Creerai un'istanza Cloud SQL per PostgreSQL che fungerà da backend per l'app web. In questo tutorial, PostgreSQL è più adatto come app di esempio di cui è stato eseguito il deployment su Heroku, che usa un database Postgres come backend. Ai fini di questa app, eseguendo la migrazione a Cloud SQL per PostgreSQL da una Il servizio Postgres non richiede modifiche allo schema.
Prepara la rete per Cloud SQL con un indirizzo IP privato.
gcloud compute addresses create google-managed-services-default \ --global \ --purpose=VPC_PEERING \ --prefix-length=16 \ --description="peering range for CloudSQL Private Service Access" \ --network=default gcloud services vpc-peerings connect \ --service=servicenetworking.googleapis.com \ --ranges=google-managed-services-default \ --network=default \ --project=PROJECT_ID
Crea una variabile di ambiente denominata
CLOUDSQL_DB_NAME
per contenere il nome dell'istanza di database che creerai nel passaggio successivo:export CLOUDSQL_DB_NAME=tasks-db
Crea il database:
gcloud sql instances create $CLOUDSQL_DB_NAME \ --cpu=1 \ --memory=4352Mib \ --database-version=POSTGRES_15 \ --region=us-central1 \ --network default \ --no-assign-ip
L'inizializzazione dell'istanza potrebbe richiedere alcuni minuti.
Imposta una password per l'utente Postgres:
gcloud sql users set-password postgres \ --instance=$CLOUDSQL_DB_NAME \ --password=POSTGRES_PASSWORD
Sostituisci
POSTGRES_PASSWORD
con la password per il database Postgres.
Importa i dati in Cloud SQL da Heroku Postgres
Esistono più pattern di migrazione che puoi utilizzare per eseguire la migrazione dei dati in in Cloud SQL. In genere, l'approccio migliore che richiede poca o nessun tempo di inattività è configurare Cloud SQL come replica sul database della migrazione, rendendo Cloud SQL l'istanza principale migrazione. Heroku Postgres non supporta le repliche esterne (follower), quindi In questo tutorial usi strumenti open source per eseguire la migrazione dello schema dell'app.
Per l'app Tasks in questo tutorial, utilizzi il pg_dump per esportare i dati da Heroku Postgres in un bucket Cloud Storage per poi importarlo in Cloud SQL. Questa utilità può trasferire dati tra versioni omogenee o quando la versione del database di destinazione è più recente rispetto al database di origine.
In Cloud Shell, recupera le credenziali del database per il tuo Heroku Database Postgres collegato all'app di esempio. Ti servono questi le credenziali nel passaggio successivo.
heroku pg:credentials:url
Questo comando restituisce la stringa di informazioni di connessione e URL della tua applicazione. La stringa delle informazioni di connessione contiene seguente formato:
"dbname=DATABASE_NAME host=FQDN port=5432 user=USER_NAME password=PASSWORD_STRING sslmode=require"
Ti serviranno i valori mostrati nella stringa di connessione nel passaggio successivo.
Ad esempio, FQDN (nome di dominio completo) in una stringa di informazioni di connessione, consulta Documentazione Heroku.
Imposta le variabili di ambiente per contenere i valori Heroku che utilizzi passaggi successivi:
export HEROKU_PG_DBNAME=DATABASE_NAME export HEROKU_PG_HOST=FQDN export HEROKU_PG_USER=USER_NAME export HEROKU_PG_PASSWORD=PASSWORD_STRING
Sostituisci quanto segue:
DATABASE_NAME
: il nome del database visualizzato in stringa di informazioni.FQDN
: il nome di dominio completo mostrato in stringa di informazioni.USER_NAME
: il nome utente visualizzato in stringa di informazioni.PASSWORD_STRING
: la stringa della password visualizzata in stringa di informazioni.
Crea un backup in formato SQL del tuo database Heroku Postgres:
docker run \ -it --rm \ -e PGPASSWORD=$HEROKU_PG_PASSWORD \ -v $(pwd):/tmp \ --entrypoint "pg_dump" \ postgres \ -Fp \ --no-acl \ --no-owner \ -h $HEROKU_PG_HOST \ -U $HEROKU_PG_USER \ $HEROKU_PG_DBNAME > herokudump.sql
Crea una variabile di ambiente che contenga il nome del tuo Bucket Cloud Storage:
export PG_BACKUP_BUCKET=gs://PROJECT_ID-pg-backup-bucket
Crea un bucket Cloud Storage:
gcloud storage buckets create $PG_BACKUP_BUCKET \ --location=us-central1 \ --public-access-prevention \ --uniform-bucket-level-access
Carica il file SQL in questo bucket:
gcloud storage cp herokudump.sql $PG_BACKUP_BUCKET/herokudump.sql
Autorizza la tua istanza Cloud SQL con ruoli necessari per importare il file SQL dal bucket Cloud Storage:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud sql instances describe $CLOUDSQL_DB_NAME --format='get("serviceAccountEmailAddress")') \ --role=roles/storage.objectAdmin gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud sql instances describe $CLOUDSQL_DB_NAME --format='get("serviceAccountEmailAddress")') \ --role=roles/cloudsql.editor
Importa il file SQL nell'istanza Cloud SQL:
gcloud sql import sql $CLOUDSQL_DB_NAME $PG_BACKUP_BUCKET/herokudump.sql \ --database=postgres \ --user=postgres
Quando richiesto
do you want to continue (y/n)
, inserisci "y".
In che modo Cloud Run accede al database Cloud SQL
Così come l'app web di cui è stato eseguito il deployment in Heroku deve connettersi all'istanza gestita di Heroku Postgres, Cloud Run richiede l'accesso a a Cloud SQL per poter leggere e scrivere dati.
Cloud Run comunica con Cloud SQL utilizzando il proxy Cloud SQL che viene attivato e configurato automaticamente quando il deployment del container in Cloud Run. Non è necessario che il database indirizzi IP esterni approvati perché tutte le comunicazioni riceve dal proxy tramite TCP sicuro.
Il codice deve richiamare le operazioni di database (ad esempio, il recupero dei dati dal o scrivendovi) richiamando il proxy su un socket UNIX.
Poiché questa app web è scritta in Node.js, utilizzerai pg-connection-string
libreria per analizzare l'URL di un database e creare un oggetto config
. Il vantaggio di
questo approccio è che semplifica la connessione al database di backend
attraverso Heroku e Cloud Run.
Nel passaggio successivo, passerai l'URL del database come variabile di ambiente quando il deployment dell'app web.
Esegui il deployment dell'app di esempio in Cloud Run
In Cloud Shell, configura l'accesso serverless VPC. per consentire il traffico privato da Cloud Run a Cloud SQL:
gcloud compute networks subnets create serverless-connector-subnet \ --network=default \ --range=10.0.0.0/28 \ --region=us-central1 gcloud compute networks vpc-access connectors create serverless-connector \ --region=us-central1 \ --subnet=serverless-connector-subnet
In Cloud Shell, crea una variabile di ambiente che contenga nome della connessione dell'istanza Cloud SQL che hai creato:
export DB_CONN_NAME=$(gcloud sql instances describe $CLOUDSQL_DB_NAME --format='value(connectionName)')
Crea una variabile di ambiente denominata
DATABASE_URL
per mantenere la connessione per la connessione al proxy Cloud SQL tramite una porta UNIX.export DATABASE_URL="socket:/cloudsql/${DB_CONN_NAME}?db=postgres&user=postgres&password=POSTGRES_PASSWORD"
Crea un account di servizio per Cloud Run con un ruolo IAM per la connessione al database:
gcloud iam service-accounts create sa-run-db-client gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:sa-run-db-client@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/cloudsql.client
Esegui il deployment dell'app web in Cloud Run:
gcloud run deploy tasksapp-PROJECT_ID \ --image=$IMAGE_NAME \ --service-account=sa-run-db-client@PROJECT_ID.iam.gserviceaccount.com \ --set-env-vars=DATABASE_URL=$DATABASE_URL \ --add-cloudsql-instances $DB_CONN_NAME \ --vpc-connector serverless-connector \ --allow-unauthenticated
Il comando precedente collega anche il container Cloud Run a all'istanza del database Cloud SQL che hai creato. I comandi impostano una variabile di ambiente per Cloud Run in modo che punti
DATABASE_URL
stringa creata nel passaggio precedente.
Test dell'applicazione
In Cloud Shell, ottieni l'URL in cui Cloud Run gestisce il traffico:
gcloud run services list
Puoi anche esaminare il servizio Cloud Run nella nella console Google Cloud.
Assicurati che la tua app web accetti le richieste HTTP visitando il tuo URL del servizio Cloud Run.
Cloud Run crea, o avvia, un nuovo container quando viene eseguito un viene inviata all'endpoint di pubblicazione e, se non è già stato creato un container, in esecuzione. Ciò significa che la richiesta che determina l'avvio di un nuovo container potrebbe richiedere più tempo. Dato il tempo extra, prendi in considerazione Il numero di richieste in parallelo che la tua app può supportare e le eventuali richieste i requisiti di memoria che potrebbe avere.
Per questa app vengono utilizzate le impostazioni di contemporaneità predefinite, che consentono un servizio Cloud Run per gestire 80 richieste contemporaneamente da un singolo containerizzato.
Esegui la pulizia
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse usato in questo tutorial. Potresti anche voler eliminare le risorse create Heroku per questo tutorial.
Elimina il progetto Google Cloud
- Nella console Google Cloud, vai alla pagina Gestisci risorse.
- Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
- Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.
Elimina l'app Heroku
Elimina l'app di esempio di cui hai eseguito il deployment in Heroku e nel database PostgreSQL associato esegui questo comando:
heroku apps:destroy -a APP_NAME
Passaggi successivi
- Informazioni su dell'importazione dei dati in Cloud SQL.
- Esplora il Documentazione di Cloud Run.