Questo tutorial illustra come creare un'applicazione sicura a due servizi in esecuzione su Cloud Run. Questa applicazione è un editor di Markdown che include un servizio "frontend" pubblico che chiunque può utilizzare per comporre testo Markdown e un servizio "backend" privato che esegue il rendering del testo Markdown in HTML.
Il servizio di backend è privato e utilizza la funzionalità di autenticazione di servizio a servizio basata su IAM integrata di Cloud Run, che limita chi può chiamare il servizio. Entrambi i servizi sono basati sul principio del privilegio minimo, senza accesso al resto di Google Cloud, tranne dove necessario.
Limitazioni o scopi non previsti di questo tutorial
Questo tutorial non mostra l'autenticazione degli utenti finali, che utilizza Identity Platform o Firebase Authentication per generare token ID utente e verificare manualmente le identità degli utenti. Per saperne di più sull'autenticazione degli utenti finali, consulta il tutorial di Cloud Run sull'autenticazione degli utenti finali.
Questo tutorial non mostra la combinazione di metodi di autenticazione e token identificativo basati su IAM perché non è supportata.
Obiettivi
- Crea un account di servizio dedicato con autorizzazioni minime per l'autenticazione servizio-a-servizio e l'accesso ai servizi per il resto di Google Cloud.
- Scrivi, crea ed esegui il deployment di due servizi che interagiscono in Cloud Run.
- Invia richieste tra un servizio Cloud Run pubblico e privato.
Costi
In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi in base all'utilizzo previsto,
utilizza il Calcolatore prezzi.
Prima di iniziare
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Run API.
- Installa e inizializza la gcloud CLI.
- Installa curl per provare il servizio
Ruoli obbligatori
Per ottenere le autorizzazioni necessarie per completare il tutorial, chiedi all'amministratore di concederti i seguenti ruoli IAM nel progetto:
-
Editor Cloud Build (
roles/cloudbuild.builds.editor
) -
Amministratore Cloud Run (
roles/run.admin
) -
Crea account di servizio (
roles/iam.serviceAccountCreator
) -
Amministratore IAM del progetto (
roles/resourcemanager.projectIamAdmin
) -
Utente account di servizio (
roles/iam.serviceAccountUser
) -
Consumatore di utilizzo del servizio (
roles/serviceusage.serviceUsageConsumer
) -
Amministratore archiviazione (
roles/storage.admin
) -
Amministratore del repository Artifact Registry (
roles/artifactregistry.repoAdmin
)
Per saperne di più sulla concessione dei ruoli, consulta Gestire l'accesso a progetti, cartelle e organizzazioni.
Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.
Configurare i valori predefiniti di gcloud
Per configurare gcloud con i valori predefiniti per il servizio Cloud Run:
Imposta il progetto predefinito:
gcloud config set project PROJECT_ID
Sostituisci PROJECT_ID con il nome del progetto che hai creato per questo tutorial.
Configura gcloud per la regione scelta:
gcloud config set run/region REGION
Sostituisci REGION con la regione di Cloud Run supportata che preferisci.
Località Cloud Run
Cloud Run è un servizio a livello di regione, il che significa che l'infrastruttura che gestisce i tuoi servizi Cloud Run si trova in una regione specifica ed è gestita da Google in modo da essere disponibile in modo ridondante in tutte le zone all'interno della regione.
Soddisfare i requisiti di latenza, disponibilità o durabilità è uno dei fattori principali per selezionare la regione in cui vengono eseguiti i servizi Cloud Run.
In genere puoi selezionare la regione più vicina ai tuoi utenti, ma devi prendere in considerazione la posizione degli altri prodotti Google Cloud utilizzati dal servizio Cloud Run.
L'utilizzo combinato dei prodotti Google Cloud in più località può influire sulla latenza e sul costo del servizio.
Cloud Run è disponibile nelle seguenti regioni:
Soggetto ai prezzi di Livello 1
asia-east1
(Taiwan)asia-northeast1
(Tokyo)asia-northeast2
(Osaka)asia-south1
(Mumbai, India)europe-north1
(Finlandia) Bassi livelli di CO2europe-southwest1
(Madrid) Basso livello di CO2europe-west1
(Belgio) Bassi livelli di CO2europe-west4
(Paesi Bassi) Bassi livelli di CO2europe-west8
(Milano)europe-west9
(Parigi) Bassi livelli di CO2me-west1
(Tel Aviv)us-central1
(Iowa) Bassi livelli di CO2us-east1
(Carolina del Sud)us-east4
(Virginia del Nord)us-east5
(Columbus)us-south1
(Dallas) Bassi livelli di CO2us-west1
(Oregon) Basso livello di CO2
Soggetto ai prezzi di Livello 2
africa-south1
(Johannesburg)asia-east2
(Hong Kong)asia-northeast3
(Seul, Corea del Sud)asia-southeast1
(Singapore)asia-southeast2
(Giacarta)asia-south2
(Delhi, India)australia-southeast1
(Sydney)australia-southeast2
(Melbourne)europe-central2
(Varsavia, Polonia)europe-west10
(Berlino) Bassi livelli di CO2europe-west12
(Torino)europe-west2
(Londra, Regno Unito) Bassi livelli di CO2europe-west3
(Francoforte, Germania) Bassi livelli di CO2europe-west6
(Zurigo, Svizzera) Bassi livelli di CO2me-central1
(Doha)me-central2
(Dammam)northamerica-northeast1
(Montreal) Bassi livelli di CO2northamerica-northeast2
(Toronto) Bassi livelli di CO2southamerica-east1
(San Paolo, Brasile) Bassi livelli di CO2southamerica-west1
(Santiago, Cile) Bassi livelli di CO2us-west2
(Los Angeles)us-west3
(Salt Lake City)us-west4
(Las Vegas)
Se hai già creato un servizio Cloud Run, puoi visualizzare la regione nella dashboard di Cloud Run nella console Google Cloud.
Recupero dell'esempio di codice
Per recuperare l'esempio di codice da utilizzare:
Clona il repository dell'app di esempio in Cloud Shell o nella tua macchina locale:
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
In alternativa, puoi scaricare l'esempio come file ZIP ed estrarlo.
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
In alternativa, puoi scaricare l'esempio come file ZIP ed estrarlo.
Vai
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
In alternativa, puoi scaricare l'esempio come file ZIP ed estrarlo.
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
In alternativa, puoi scaricare l'esempio come file ZIP ed estrarlo.
C#
git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git
In alternativa, puoi scaricare l'esempio come file ZIP ed estrarlo.
Passa alla directory che contiene il codice di esempio di Cloud Run:
Node.js
cd nodejs-docs-samples/run/markdown-preview/
Python
cd python-docs-samples/run/markdown-preview/
Vai
cd golang-samples/run/markdown-preview/
Java
cd java-docs-samples/run/markdown-preview/
C#
cd dotnet-docs-samples/run/markdown-preview/
Revisione del servizio di rendering di Markdown privato
Dal punto di vista del frontend esiste una semplice specifica dell'API per il servizio Markdown:
- Un endpoint a
/
- Aspetta richieste POST
- Il corpo della richiesta POST è un testo Markdown
Ti consigliamo di esaminare tutto il codice per verificare la presenza di eventuali problemi di sicurezza o semplicemente per approfondire l'argomento esplorando la directory ./renderer/
. Tieni presente che il tutorial non spiega il codice di trasformazione Markdown.
Pubblicazione del servizio di rendering Markdown privato
Per spedire il codice, crealo con Cloud Build, caricalo su Artifact Registry ed esegui il deployment in Cloud Run:
Passa alla directory
renderer
:Node.js
cd renderer/
Python
cd renderer/
Vai
cd renderer/
Java
cd renderer/
C#
cd Samples.Run.MarkdownPreview.Renderer/
Crea un Artifact Registry:
gcloud artifacts repositories create REPOSITORY \ --repository-format docker \ --location REGION
Sostituisci:
- REPOSITORY con un nome univoco per il repository. Per ogni posizione del repository in un progetto, i nomi dei repository devono essere univoci.
- REGION con la regione Google Cloud da utilizzare per il repository Artifact Registry.
Esegui il comando seguente per creare il container e pubblicarlo su Artifact Registry.
Node.js
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/renderer
dove PROJECT_ID è l'ID progetto Google Cloud e
renderer
è il nome che vuoi assegnare al servizio.In caso di esito positivo, viene visualizzato un messaggio di successo contenente l'ID, l'ora di creazione e il nome dell'immagine. L'immagine è archiviata in Artifact Registry e, se lo desideri, può essere riutilizzata.
Python
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/renderer
dove PROJECT_ID è l'ID progetto Google Cloud e
renderer
è il nome che vuoi assegnare al servizio.In caso di esito positivo, viene visualizzato un messaggio di successo contenente l'ID, l'ora di creazione e il nome dell'immagine. L'immagine è archiviata in Artifact Registry e, se lo desideri, può essere riutilizzata.
Vai
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/renderer
dove PROJECT_ID è l'ID progetto Google Cloud e
renderer
è il nome che vuoi assegnare al servizio.In caso di esito positivo, viene visualizzato un messaggio di successo contenente l'ID, l'ora di creazione e il nome dell'immagine. L'immagine è archiviata in Artifact Registry e, se lo desideri, può essere riutilizzata.
Java
Questo esempio utilizza Jib per creare immagini Docker utilizzando strumenti Java comuni. Jib ottimizza le build dei container senza dover disporre di un Dockerfile o di Docker. Scopri di più sulla creazione di container Java con Jib.
Utilizza l'assistente per le credenziali gcloud per autorizzare Docker a eseguire il push nel tuo Artifact Registry.
gcloud auth configure-docker
Utilizza il plug-in Maven Jib per compilare e eseguire il push del contenitore in Artifact Registry.
mvn compile jib:build -Dimage=REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/renderer
dove PROJECT_ID è l'ID progetto Google Cloud e
renderer
è il nome che vuoi assegnare al servizio.In caso di esito positivo, viene visualizzato il messaggio BUILD SUCCESS. L'immagine è archiviata in Artifact Registry e, se lo desideri, può essere riutilizzata.
C#
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/renderer
dove PROJECT_ID è l'ID progetto Google Cloud e
renderer
è il nome che vuoi assegnare al servizio.In caso di esito positivo, viene visualizzato un messaggio di successo contenente l'ID, l'ora di creazione e il nome dell'immagine. L'immagine è archiviata in Artifact Registry e, se lo desideri, può essere riutilizzata.
Esegui il deployment come servizio privato con accesso limitato.
Cloud Run fornisce funzionalità di controllo degli accessi e di identità del servizio pronte all'uso. Il controllo dell'accesso fornisce un livello di autenticazione che impedisce agli utenti e ad altri servizi di invocare il servizio. L'identità di servizio consente di limitare l'accesso del servizio ad altre risorse Google Cloud creando un account di servizio dedicato con autorizzazioni limitate.
Crea un account di servizio che fungerà da "identità di calcolo" del servizio di rendering. Per impostazione predefinita, non ha privilegi diversi dall'appartenenza al progetto.
Riga di comando
gcloud iam service-accounts create renderer-identity
Terraform
Per scoprire come applicare o rimuovere una configurazione Terraform, consulta Comandi Terraform di base.
Il servizio di rendering Markdown non si integra direttamente con nessun altro elemento di Google Cloud. Non sono necessarie autorizzazioni aggiuntive.
Esegui il deployment con l'account di servizio
renderer-identity
e nega l'accesso non autenticato.Riga di comando
gcloud run deploy renderer \ --image REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/renderer \ --service-account renderer-identity \ --no-allow-unauthenticated
Cloud Run può utilizzare il nome dell'account di servizio nel formato breve anziché l'indirizzo email completo se l'account di servizio fa parte dello stesso progetto.
Terraform
Per scoprire come applicare o rimuovere una configurazione Terraform, consulta Comandi Terraform di base.
Provare il servizio di rendering di Markdown privato
I servizi privati non possono essere caricati direttamente da un browser web. Utilizza invece curl
o uno strumento CLI per le richieste HTTP simile che consenta di iniettare un'intestazione Authorization
.
Per inviare al servizio del testo in grassetto e vedere la conversione degli asterischi Markdown in tag HTML <strong>
:
Recupera l'URL dall'output del deployment.
Utilizza
gcloud
per ricavare un token di identità speciale solo per lo sviluppo per l'autenticazione:TOKEN=$(gcloud auth print-identity-token)
Crea una richiesta curl che trasmetta il testo Markdown non elaborato come parametro di stringa di query con escape URL:
curl -H "Authorization: Bearer $TOKEN" \ -H 'Content-Type: text/plain' \ -d '**Hello Bold Text**' \ SERVICE_URL
Sostituisci SERVICE_URL con l'URL fornito dopo aver eseguito il deployment del servizio di rendering Markdown.
La risposta deve essere uno snippet HTML:
<strong>Hello Bold Text</strong>
Controllare l'integrazione tra l'editor e i servizi di rendering
Il servizio di editor fornisce un'interfaccia utente di immissione di testo semplice e uno spazio per visualizzare l'anteprima HTML. Prima di continuare, controlla il codice recuperato in precedenza aprendo la directory./editor/
.
Successivamente, esamina le seguenti sezioni di codice che integrano in modo sicuro i due servizi.
Node.js
Il modulo render.js
crea richieste autenticate al servizio di visualizzatore privato. Utilizza il server di metadati di Google Cloud nell'ambiente Cloud Run per creare un token di identità e aggiungerlo alla richiesta HTTP come parte di un'intestazione Authorization
.
In altri ambienti, render.js
utilizza le credenziali predefinite dell'applicazione per richiedere un token
dai server di Google.
Analizza il markdown da JSON e invialo al servizio Renderer per la trasformazione in HTML.
Python
Il metodo new_request
crea richieste autenticate ai servizi privati.
Utilizza il server di metadati Google Cloud nell'ambiente Cloud Run per creare un token di identità e aggiungerlo alla richiesta HTTP come parte di un'intestazione Authorization
.
In altri ambienti, new_request
richiede un token di identità ai server di Google autenticandosi con le Credenziali predefinite dell'applicazione.
Analizza il markdown da JSON e invialo al servizio Renderer per la trasformazione in HTML.
Vai
RenderService
crea richieste autenticate ai servizi privati. Utilizza il server di metadati di Google Cloud nell'ambiente Cloud Run per creare un token di identità e aggiungerlo alla richiesta HTTP nell'ambito di un'intestazione Authorization
.
In altri ambienti, RenderService
richiede un token di identità ai server di Google autenticandosi con le Credenziali predefinite dell'applicazione.
La richiesta viene inviata al servizio Renderer dopo aver aggiunto il testo in Markdown da trasformare in HTML. Gli errori di risposta vengono gestiti per distinguere i problemi di comunicazione dalla funzionalità di rendering.
Java
makeAuthenticatedRequest
crea richieste autenticate ai servizi privati. Utilizza il server di metadati di Google Cloud nell'ambiente Cloud Run per creare un token di identità e aggiungerlo alla richiesta HTTP nell'ambito di un'intestazione Authorization
.
In altri ambienti, makeAuthenticatedRequest
richiede un token di identità
dai server di Google autenticandosi con le Credenziali predefinite dell'applicazione.
Analizza il markdown da JSON e invialo al servizio Renderer per la trasformazione in HTML.
C#
GetAuthenticatedPostResponse
crea richieste autenticate ai servizi privati. Utilizza il server di metadati di Google Cloud nell'ambiente Cloud Run per creare un token di identità e aggiungerlo alla richiesta HTTP nell'ambito di un'intestazione Authorization
.
In altri ambienti, GetAuthenticatedPostResponse
richiede un token di identità
dai server di Google autenticandosi con le Credenziali predefinite dell'applicazione.
Analizza il markdown da JSON e invialo al servizio Renderer per la trasformazione in HTML.
Invio del servizio di editor pubblico
Per compilare ed eseguire il deployment del codice:
Passa alla directory
editor
:Node.js
cd ../editor
Python
cd ../editor
Vai
cd ../editor
Java
cd ../editor
C#
cd ../Samples.Run.MarkdownPreview.Editor/
Esegui il comando seguente per creare il container e pubblicarlo su Artifact Registry.
Node.js
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/editor
dove PROJECT_ID è l'ID progetto Google Cloud e
editor
è il nome che vuoi assegnare al servizio.In caso di esito positivo, viene visualizzato un messaggio di successo contenente l'ID, l'ora di creazione e il nome dell'immagine. L'immagine è archiviata in Container Registry e, se lo desideri, può essere riutilizzata.
Python
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/editor
dove PROJECT_ID è l'ID progetto Google Cloud e
editor
è il nome che vuoi assegnare al servizio.In caso di esito positivo, viene visualizzato un messaggio di successo contenente l'ID, l'ora di creazione e il nome dell'immagine. L'immagine è archiviata in Artifact Registry e, se lo desideri, può essere riutilizzata.
Vai
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/editor
dove PROJECT_ID è l'ID progetto Google Cloud e
editor
è il nome che vuoi assegnare al servizio.In caso di esito positivo, viene visualizzato un messaggio di successo contenente l'ID, l'ora di creazione e il nome dell'immagine. L'immagine è archiviata in Artifact Registry e, se lo desideri, può essere riutilizzata.
Java
Questo esempio utilizza Jib per creare immagini Docker utilizzando strumenti Java comuni. Jib ottimizza le build dei container senza dover disporre di un Dockerfile o di Docker. Scopri di più sulla creazione di container Java con Jib.mvn compile jib:build -Dimage=REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/editor
dove PROJECT_ID è l'ID progetto Google Cloud e
editor
è il nome che vuoi assegnare al servizio.In caso di esito positivo, viene visualizzato il messaggio BUILD SUCCESS. L'immagine è archiviata in Artifact Registry e, se lo desideri, può essere riutilizzata.
C#
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/editor
dove PROJECT_ID è l'ID progetto Google Cloud e
editor
è il nome che vuoi assegnare al servizio.In caso di esito positivo, viene visualizzato un messaggio di successo contenente l'ID, l'ora di creazione e il nome dell'immagine. L'immagine è archiviata in Artifact Registry e, se lo desideri, può essere riutilizzata.
Esegui il deployment come servizio privato con accesso speciale al servizio di rendering.
Crea un account di servizio che fungerà da "identità di calcolo" del servizio privato. Per impostazione predefinita, non ha privilegi diversi dall'appartenenza al progetto.
Riga di comando
gcloud iam service-accounts create editor-identity
Terraform
Per scoprire come applicare o rimuovere una configurazione Terraform, consulta Comandi Terraform di base.
Il servizio Editor non deve interagire con nessun altro elemento in Google Cloud, ad eccezione del servizio di rendering Markdown.
Concedi l'accesso all'identità di calcolo
editor-identity
per richiamare il servizio di rendering di Markdown. Qualsiasi servizio che lo utilizza come identità di calcolo avrà questo privilegio.Riga di comando
gcloud run services add-iam-policy-binding renderer \ --member serviceAccount:editor-identity@PROJECT_ID.iam.gserviceaccount.com \ --role roles/run.invoker
Terraform
Per scoprire come applicare o rimuovere una configurazione Terraform, consulta Comandi Terraform di base.
Poiché a questo servizio viene assegnato il ruolo di invocatore nel contesto del servizio di rendering, il servizio di rendering è l'unico servizio Cloud Run privato che l'editor può invocare.
Esegui il deployment con l'account di servizio
editor-identity
e consenti l'accesso pubblico non autenticato.Riga di comando
gcloud run deploy editor --image REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/editor \ --service-account editor-identity \ --set-env-vars EDITOR_UPSTREAM_RENDER_URL=SERVICE_URL \ --allow-unauthenticated
Sostituisci:
- PROJECT_ID con l'ID del tuo progetto
- SERVICE_URL con l'URL fornito dopo il deployment del servizio di rendering di Markdown.
Terraform
Per scoprire come applicare o rimuovere una configurazione Terraform, consulta Comandi Terraform di base.
Esegui il deployment del servizio di editor:
Concedi a
allUsers
l'autorizzazione a richiamare il servizio:
Informazioni sul traffico HTTPS
Il rendering del markdown con questi servizi prevede tre richieste HTTP.
Prova
Per provare l'applicazione completa con due servizi:
Apri il browser e vai all'URL fornito nel passaggio di implementazione precedente.
Prova a modificare il testo Markdown a sinistra e fai clic sul pulsante per visualizzarne l'anteprima a destra.
Dovrebbe avere il seguente aspetto:
Se scegli di continuare a sviluppare questi servizi, tieni presente che hanno accesso IAM limitato al resto di Google Cloud e dovranno essere assegnati ruoli IAM aggiuntivi per accedere a molti altri servizi.
Esegui la pulizia
Se hai creato un nuovo progetto per questo tutorial, eliminalo. Se hai utilizzato un progetto esistente e vuoi conservarlo senza le modifiche aggiunte in questo tutorial, elimina le risorse create per il tutorial.
Elimina il progetto
Il modo più semplice per eliminare la fatturazione è eliminare il progetto che hai creato per il tutorial.
Per eliminare il progetto:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Eliminazione delle risorse dei tutorial
Elimina i servizi Cloud Run di cui hai eseguito il deployment in questo tutorial:
gcloud
gcloud run services delete editor gcloud run services delete renderer
Puoi anche eliminare i servizi Cloud Run dalla console Google Cloud.
Rimuovi le configurazioni predefinite di gcloud che hai aggiunto durante la configurazione del tutorial.
gcloud config unset run/region
Rimuovi la configurazione del progetto:
gcloud config unset project
Elimina le altre risorse Google Cloud create in questo tutorial:
- Elimina l'immagine del contenitore dell'editor denominata
REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/editor
da Artifact Registry - Elimina l'immagine del contenitore di rendering denominata
REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/renderer
da Artifact Registry - Eliminare l'account di servizio dell'editor
editor-identity@PROJECT_ID.iam.gserviceaccount.com
- Elimina l'account di servizio di rendering
renderer-identity@PROJECT_ID.iam.gserviceaccount.com
- Elimina l'immagine del contenitore dell'editor denominata
Passaggi successivi
- Per proteggere ulteriormente il tuo progetto, consulta la checklist sull'utilizzo sicuro di IAM
- Estendere questa applicazione di esempio per monitorare l'utilizzo di Markdown con le metriche personalizzate di Cloud Monitoring
- Consulta il tutorial su Pub/Sub per un approccio ai microservizi sicuri e asincroni