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 scrivere il testo di markdown e un servizio di "backend" privato che esegue il rendering del testo Markdown in HTML.
Il servizio di backend è privato utilizzando la funzionalità integrata di autenticazione service-to-service basata su IAM di Cloud Run, che limita gli utenti che possono chiamare il servizio. Entrambi i servizi sono basati sul principio del privilegio minimo, senza accesso al resto di Google Cloud se non necessario.
Limitazioni o non obiettivi di questo tutorial
Questo tutorial non mostra l'autenticazione dell'utente finale, che utilizza Identity Platform o Firebase Authentication per generare token ID utente e verificare manualmente le identità degli utenti. Per scoprire di più sull'autenticazione dell'utente finale, consulta il tutorial su Cloud Run per l'autenticazione dell'utente finale.
Questo tutorial non mostra la combinazione dei metodi di autenticazione basata su IAM e token ID perché non è supportato.
Obiettivi
- Crea un account di servizio dedicato con autorizzazioni minime per l'autenticazione tra servizi e l'accesso al servizio per il resto di Google Cloud.
- Scrivi, crea ed esegui il deployment di due servizi in Cloud Run che interagiscono.
- Effettua richieste tra un servizio Cloud Run pubblico e privato.
Costi
In questo documento vengono utilizzati 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
- 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.
-
Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.
-
Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.
-
Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.
-
Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.
-
Attiva l'API Cloud Run.
- Installa e inizializza 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 sul tuo progetto:
-
Editor Cloud Build (
roles/cloudbuild.builds.editor
) -
Amministratore Cloud Run (
roles/run.admin
) -
Crea account di servizio (
roles/iam.serviceAccountCreator
) -
Amministratore IAM progetto (
roles/resourcemanager.projectIamAdmin
) -
Utente account di servizio (
roles/iam.serviceAccountUser
) -
Service Usage Consumer (
roles/serviceusage.serviceUsageConsumer
) -
Amministratore Storage (
roles/storage.admin
)
Per saperne di più sulla concessione dei ruoli, consulta Gestire l'accesso.
Potresti anche essere in grado di ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.
Configurazione delle impostazioni predefinite di gcloud
Per configurare gcloud con i valori predefiniti per il tuo 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 un'area geografica Cloud Run supportata a tua scelta.
Località di Cloud Run
Cloud Run è regionale, il che significa che l'infrastruttura che esegue i tuoi servizi Cloud Run si trova in una regione specifica ed è gestita da Google per essere disponibile in modo ridondante in tutte le zone all'interno di quella regione.
Soddisfare i requisiti di latenza, disponibilità o durabilità sono 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 ti consigliamo di considerare la località degli altri prodotti Google Cloud utilizzati dal tuo servizio Cloud Run.
L'utilizzo combinato di prodotti Google Cloud in più località può influire
sulla latenza e sui costi del tuo servizio.
Cloud Run è disponibile nelle seguenti regioni:
Soggetto ai prezzi di Livello 1
asia-east1
(Taiwan)asia-northeast1
(Tokyo)asia-northeast2
(Osaka)europe-north1
(Finlandia) A basse emissioni di CO2europe-southwest1
(Madrid)europe-west1
(Belgio) A basse emissioni di CO2europe-west4
(Paesi Bassi)europe-west8
(Milano)europe-west9
(Parigi) A basse emissioni di CO2me-west1
(Tel Aviv)us-central1
(Iowa) A basse emissioni di CO2us-east1
(Carolina del Sud)us-east4
(Virginia del Nord)us-east5
(Colombo)us-south1
(Dallas)us-west1
(Oregon) A basse emissioni 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-south1
(Mumbai, India)asia-south2
(Delhi, India)australia-southeast1
(Sydney)australia-southeast2
(Melbourne)europe-central2
(Varsavia, Polonia)europe-west10
(Berlino)europe-west12
(Torino)europe-west2
(Londra, Regno Unito) A basse emissioni di CO2europe-west3
(Francoforte, Germania) A basse emissioni di CO2europe-west6
(Zurigo, Svizzera) A basse emissioni di CO2me-central1
(Doha)me-central2
(Dammam)northamerica-northeast1
(Montreal) A basse emissioni di CO2northamerica-northeast2
(Toronto) A basse emissioni di CO2southamerica-east1
(San Paolo, Brasile) A basse emissioni di CO2southamerica-west1
(Santiago, Cile) A basse emissioni 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 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.
Go
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/
Go
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 Markdown privato
Dal punto di vista del frontend, esiste una semplice specifica API per il servizio Markdown:
- Un endpoint in
/
- Sono previste richieste POST
- Il corpo della richiesta POST è testo Markdown
Ti consigliamo di esaminare tutto il codice per verificare la presenza di eventuali problemi di sicurezza o semplicemente di
saperne di più esplorando la directory ./renderer/
. Tieni presente che il tutorial non spiega il codice di trasformazione Markdown.
Spedizione del servizio di rendering Markdown privato
Per inviare il codice, crea con Cloud Build, caricalo in Container Registry ed esegui il deployment in Cloud Run:
Passa alla directory
renderer
:Node.js
cd renderer/
Python
cd renderer/
Go
cd renderer/
Java
cd renderer/
C#
cd Samples.Run.MarkdownPreview.Renderer/
Esegui questo comando per creare il container e pubblicarlo su Container Registry.
Node.js
gcloud builds submit --tag gcr.io/PROJECT_ID/renderer
Dove PROJECT_ID è l'ID progetto Google Cloud e
renderer
è il nome che vuoi assegnare al servizio.Se l'operazione ha esito positivo, verrà visualizzato un messaggio di operazione riuscita 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 gcr.io/PROJECT_ID/renderer
Dove PROJECT_ID è l'ID progetto Google Cloud e
renderer
è il nome che vuoi assegnare al servizio.Se l'operazione ha esito positivo, verrà visualizzato un messaggio di operazione riuscita 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.
Go
gcloud builds submit --tag gcr.io/PROJECT_ID/renderer
Dove PROJECT_ID è l'ID progetto Google Cloud e
renderer
è il nome che vuoi assegnare al servizio.Se l'operazione ha esito positivo, verrà visualizzato un messaggio di operazione riuscita 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.
Java
Questo esempio utilizza Jib per creare immagini Docker con gli strumenti Java comuni. Jib ottimizza le build di container senza bisogno di un Dockerfile o di dover installare Docker. Scopri di più sulla creazione di container Java con Jib.
Utilizza l'helper delle credenziali gcloud per autorizzare Docker a eseguire il push al tuo Container Registry.
gcloud auth configure-docker
Utilizza il plug-in Jib Maven per creare il container ed eseguirne il push su Container Registry.
mvn compile jib:build -Dimage=gcr.io/PROJECT_ID/renderer
Dove PROJECT_ID è l'ID progetto Google Cloud e
renderer
è il nome che vuoi assegnare al servizio.Se l'operazione va a buon fine, verrà visualizzato il messaggio COSTRUIRE RIUSCITA. L'immagine è archiviata in Container Registry e, se lo desideri, può essere riutilizzata.
C#
gcloud builds submit --tag gcr.io/PROJECT_ID/renderer
Dove PROJECT_ID è l'ID progetto Google Cloud e
renderer
è il nome che vuoi assegnare al servizio.Se l'operazione ha esito positivo, verrà visualizzato un messaggio di operazione riuscita 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.
Esegui il deployment come servizio privato con accesso limitato.
Cloud Run fornisce funzionalità di controllo dell'accesso e identità del servizio pronte all'uso. Il controllo dell'accesso fornisce un livello di autenticazione che impedisce agli utenti e ad altri servizi di richiamare 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 da usare come "identità di computing" del servizio di rendering. Per impostazione predefinita, non sono previsti privilegi oltre all'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 strumento in Google Cloud. Non ha bisogno di ulteriori autorizzazioni.
Esegui il deployment con l'account di servizio
renderer-identity
e nega l'accesso non autenticato.Riga di comando
gcloud run deploy renderer \ --image gcr.io/PROJECT_ID/renderer \ --service-account renderer-identity \ --no-allow-unauthenticated
Cloud Run può utilizzare il nome breve dell'account di servizio 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.
Prova del servizio di rendering Markdown privato
I servizi privati non possono essere caricati direttamente da un browser web. Utilizza invece curl
o uno strumento di interfaccia a riga di comando delle richieste HTTP simile che consenta di inserire un'intestazione Authorization
.
Per inviare al servizio del testo in grassetto e visualizzare il testo in grassetto, gli asterischi di markdown verranno convertiti in tag HTML <strong>
:
Recupera l'URL dall'output del deployment.
Usa
gcloud
per ricavare uno speciale token di identità solo per lo sviluppo per l'autenticazione:TOKEN=$(gcloud auth print-identity-token)
Crea una richiesta curl che trasmette il testo non elaborato Markdown 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
La risposta deve essere uno snippet HTML:
<strong>Hello Bold Text</strong>
Revisione dell'integrazione tra i servizi di editor e di rendering
Il servizio di editor fornisce una semplice interfaccia utente per l'inserimento del testo e uno spazio per visualizzare l'anteprima HTML. Prima di continuare, esamina il codice recuperato in precedenza aprendo la directory ./editor/
.
Ora esplora le seguenti sezioni di codice che integrano i due servizi in modo sicuro.
Node.js
Il modulo render.js
crea richieste autenticate al servizio del renderer privato. Utilizza il server 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, render.js
utilizza le Credenziali predefinite dell'applicazione per richiedere un token dai server di Google.
Analizza il markup da JSON e invialo al servizio del renderer per essere trasformato in HTML.
Python
Il metodo new_request
crea richieste autenticate ai servizi privati.
Utilizza il server 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 mediante l'autenticazione con le Credenziali predefinite dell'applicazione.
Analizza il markup da JSON e invialo al servizio del renderer per essere trasformato in HTML.
Go
RenderService
crea richieste autenticate ai servizi privati. Utilizza il server 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, RenderService
richiede un token di identità ai server di Google mediante l'autenticazione con le Credenziali predefinite dell'applicazione.
La richiesta viene inviata al servizio Renderer dopo l'aggiunta del testo di 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 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, makeAuthenticatedRequest
richiede un token di identità ai server di Google autenticandosi con le Credenziali predefinite dell'applicazione.
Analizza il markup da JSON e invialo al servizio del renderer per essere trasformato in HTML.
C#
GetAuthenticatedPostResponse
crea richieste autenticate ai servizi privati. Utilizza il server 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, GetAuthenticatedPostResponse
richiede un token di identità ai server di Google autenticandosi con le Credenziali predefinite dell'applicazione.
Analizza il markup da JSON e invialo al servizio del renderer per essere trasformato in HTML.
Spedire il servizio di redazione pubblico
Per creare ed eseguire il deployment del codice:
Passa alla directory
editor
:Node.js
cd ../editor
Python
cd ../editor
Go
cd ../editor
Java
cd ../editor
C#
cd ../Samples.Run.MarkdownPreview.Editor/
Esegui questo comando per creare il container e pubblicarlo su Container Registry.
Node.js
gcloud builds submit --tag gcr.io/PROJECT_ID/editor
Dove PROJECT_ID è l'ID progetto Google Cloud e
editor
è il nome che vuoi assegnare al servizio.Se l'operazione ha esito positivo, verrà visualizzato un messaggio di operazione riuscita 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 gcr.io/PROJECT_ID/editor
Dove PROJECT_ID è l'ID progetto Google Cloud e
editor
è il nome che vuoi assegnare al servizio.Se l'operazione ha esito positivo, verrà visualizzato un messaggio di operazione riuscita 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.
Go
gcloud builds submit --tag gcr.io/PROJECT_ID/editor
Dove PROJECT_ID è l'ID progetto Google Cloud e
editor
è il nome che vuoi assegnare al servizio.Se l'operazione ha esito positivo, verrà visualizzato un messaggio di operazione riuscita 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.
Java
Questo esempio utilizza Jib per creare immagini Docker con gli strumenti Java comuni. Jib ottimizza le build di container senza bisogno di un Dockerfile o di dover installare Docker. Scopri di più sulla creazione di container Java con Jib.mvn compile jib:build -Dimage=gcr.io/PROJECT_ID/editor
Dove PROJECT_ID è l'ID progetto Google Cloud e
editor
è il nome che vuoi assegnare al servizio.Se l'operazione va a buon fine, verrà visualizzato il messaggio COSTRUIRE RIUSCITA. L'immagine è archiviata in Container Registry e, se lo desideri, può essere riutilizzata.
C#
gcloud builds submit --tag gcr.io/PROJECT_ID/editor
Dove PROJECT_ID è l'ID progetto Google Cloud e
editor
è il nome che vuoi assegnare al servizio.Se l'operazione ha esito positivo, verrà visualizzato un messaggio di operazione riuscita 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.
Distribuzione come servizio privato con accesso speciale al servizio di rendering.
Crea un account di servizio da usare come "identità di computing" del servizio privato. Per impostazione predefinita, non sono previsti privilegi oltre all'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 altri elementi in Google Cloud diversi dal servizio di rendering Markdown.
Concedi l'accesso all'identità di computing
editor-identity
per richiamare il servizio di rendering Markdown. Qualsiasi servizio che la utilizza come identità di computing 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 viene assegnato il ruolo richiamo nel contesto del servizio di rendering, quest'ultimo è l'unico servizio Cloud Run privato che l'editor può richiamare.
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 gcr.io/PROJECT_ID/editor \ --service-account editor-identity \ --set-env-vars EDITOR_UPSTREAM_RENDER_URL=RENDERER_SERVICE_URL \ --allow-unauthenticated
Sostituisci,
- PROJECT_ID con il tuo ID progetto
- RENDERER_SERVICE_URL con l'URL fornito dopo il deployment del servizio di rendering Markdown.
Terraform
Per scoprire come applicare o rimuovere una configurazione Terraform, consulta Comandi Terraform di base.
Esegui il deployment del servizio editor:
Concedi a
allUsers
l'autorizzazione per richiamare il servizio:
Informazioni sul traffico HTTPS
Per il rendering del markup utilizzando questi servizi sono coinvolte tre richieste HTTP.
Provalo
Per provare l'applicazione completa per due servizi:
Vai nel browser all'URL fornito nel passaggio di deployment riportato sopra.
Prova a modificare il testo di Markdown a sinistra e fai clic sul pulsante per vederne l'anteprima a destra.
Dovrebbe avere il seguente aspetto:
Se scegli di continuare a sviluppare questi servizi, ricorda che questi hanno un accesso limitato di Identity and Access Management (IAM) al resto di Google Cloud e che dovranno disporre di ruoli IAM aggiuntivi per accedere a molti altri servizi.
Esegui la pulizia
Se hai creato un nuovo progetto per questo tutorial, elimina il progetto. 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:
- 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.
Eliminazione delle risorse del tutorial
Elimina i servizi Cloud Run di cui hai eseguito il deployment in questo tutorial:
Riga di comando
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 da Container Registry l'immagine container dell'editor denominata
gcr.io/PROJECT_ID/editor
- Elimina da Container Registry l'immagine container di rendering denominata
gcr.io/PROJECT_ID/renderer
- Elimina 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 da Container Registry l'immagine container dell'editor denominata
Passaggi successivi
- Proteggi ulteriormente il tuo progetto seguendo l'elenco di controllo Utilizzare IAM in modo sicuro
- Estendi questa applicazione di esempio per tenere traccia dell'utilizzo di Markdown con le metriche personalizzate di Cloud Monitoring
- Esamina il tutorial di Pub/Sub per un approccio ai microservizi asincroni sicuri