Questo tutorial illustra come creare un'applicazione a due servizi sicura in esecuzione su Cloud Run. Questa applicazione è un Editor Markdown che include un "frontend" pubblico servizio che chiunque può utilizzare per scrivere Markdown e un "backend" privato che esegue il rendering del testo Markdown in HTML.
Il servizio di backend è privato usando Cloud Run spazio di archiviazione Autenticazione service-to-service basata su IAM che limita chi può chiamare il servizio. Entrambi i servizi sono basati principio del privilegio minimo, senza accesso al resto di Google Cloud, eccetto dove necessario.
Limitazioni o non obiettivi di questo tutorial
Questo tutorial non mostra l'autenticazione degli utenti finali, che utilizza Identity Platform Autenticazione Firebase per generare token ID utente verificare manualmente le identità degli utenti. Per scoprire di più sull'utente finale per l'autenticazione, consulta il tutorial di Cloud Run l'autenticazione degli utenti finali.
Questo tutorial non mostra la combinazione di autenticazione basata su IAM e token ID poiché non è supportato.
Obiettivi
- Crea un account di servizio dedicato con autorizzazioni minime per service-to-service autenticazione e accesso ai servizi al resto di Google Cloud.
- Scrivi, crea ed esegui il deployment in Cloud Run di due servizi che interagiscono tra loro.
- Effettuare 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 basata sull'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 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
) -
Consumer Service Usage (
roles/serviceusage.serviceUsageConsumer
) -
Storage Admin (
roles/storage.admin
) -
Amministratore 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 la ruoli o altri ruoli predefiniti ruoli.
Configurazione dei valori predefiniti 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 per cui hai creato questo tutorial.
Configura gcloud per la regione scelta:
gcloud config set run/region REGION
Sostituisci REGION con il Cloud Run supportato regione a tua scelta.
Località Cloud Run
Cloud Run è regionale, il che significa che l'infrastruttura
dei tuoi servizi Cloud Run si trova in una regione specifica
gestiti da Google in modo che siano disponibili in modo ridondante
tutte le zone all'interno di quella regione.
Soddisfare i requisiti di latenza, disponibilità o durabilità è fondamentale
i fattori necessari per selezionare la regione in cui vengono eseguiti i servizi Cloud Run.
Generalmente puoi selezionare la regione più vicina ai tuoi utenti, ma devi considerare
la località dell'altro account Google Cloud
prodotti utilizzati dal tuo servizio Cloud Run.
L'utilizzo combinato dei prodotti Google Cloud in più località può influire
nonché la latenza del tuo servizio.
Cloud Run è disponibile nelle regioni seguenti:
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) A basse emissioni di CO2europe-west1
(Belgio) A basse emissioni di CO2europe-west4
(Paesi Bassi) A basse emissioni di CO2europe-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) A basse emissioni di CO2us-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) A basse emissioni di CO2europe-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 nella dashboard di Cloud Run all'interno Console Google Cloud.
Recupero dell'esempio di codice in corso
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 scarica l'esempio . come file ZIP ed estrarlo.
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
In alternativa, puoi scarica l'esempio . come file ZIP ed estrarlo.
Vai
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
In alternativa, puoi scarica l'esempio . come file ZIP ed estrarlo.
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
In alternativa, puoi scarica l'esempio . come file ZIP ed estrarlo.
C#
git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git
In alternativa, puoi scarica l'esempio . come file ZIP ed estrarlo.
Passa alla directory che contiene l'esempio di Cloud Run codice:
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 Markdown privato
Dal punto di vista del frontend c'è una semplice specifica API per il servizio Markdown:
- Un endpoint in
/
- Prevede richieste POST
- Il corpo della richiesta POST è testo Markdown
Ti consigliamo di rivedere tutto il codice per qualsiasi problema di sicurezza o anche solo per
scopri di più esplorando la directory ./renderer/
. Tieni presente che
non spiega il codice di trasformazione Markdown.
Spedizione del servizio di rendering Markdown privato
Per distribuire il codice, crea con Cloud Build, carica su Artifact Registry ed eseguire il deployment su 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 nel repository Artifact Registry.
Esegui questo comando 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
è l'ID che vuoi assegnare al servizio.Se l'operazione riesce, verrà visualizzato il messaggio SUCCESS contenente l'ID, la creazione ora e nome dell'immagine. L'immagine è archiviata in Artifact Registry e può essere riutilizzate, se necessario.
Python
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/renderer
Dove PROJECT_ID è l'ID progetto Google Cloud e
renderer
è l'ID che vuoi assegnare al servizio.Se l'operazione riesce, verrà visualizzato il messaggio SUCCESS contenente l'ID, la creazione ora e nome dell'immagine. L'immagine è archiviata in Artifact Registry e può essere riutilizzate, se necessario.
Vai
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/renderer
Dove PROJECT_ID è l'ID progetto Google Cloud e
renderer
è l'ID che vuoi assegnare al servizio.Se l'operazione riesce, verrà visualizzato il messaggio SUCCESS contenente l'ID, la creazione ora e nome dell'immagine. L'immagine è archiviata in Artifact Registry e può essere se lo desideri,
Java
Questo esempio utilizza Jib per creare utilizzando strumenti Java comuni. Jib ottimizza le build di container senza la necessità di un Dockerfile o di avere Docker installato. Scopri di più sulla creazione di container Java con Jib.
Utilizza gcloud credentials helper per autorizzare Docker a eseguire il push in Artifact Registry.
gcloud auth configure-docker
Usa il plug-in Jib Maven per creare il container ed eseguirne il push ad 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
è l'ID che vuoi assegnare al servizio.Se l'operazione riesce, verrà visualizzato un messaggio BUILD SUCCESS. L'immagine è archiviata in Artifact Registry e può essere riutilizzato, se lo si desidera.
C#
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/renderer
Dove PROJECT_ID è l'ID progetto Google Cloud e
renderer
è l'ID che vuoi assegnare al servizio.Se l'operazione riesce, verrà visualizzato il messaggio SUCCESS contenente l'ID, la creazione ora e nome dell'immagine. L'immagine è archiviata in Artifact Registry e può essere se lo desideri,
Esegui il deployment come servizio privato con accesso limitato.
Cloud Run offre un controllo dell'accesso pronto all'uso e le funzionalità di identità dei servizi. Il controllo dell'accesso fornisce che impedisce agli utenti e ad altri servizi di richiamare il metodo completamente gestito di Google Cloud. L'identità del servizio consente di limitare l'accesso del servizio ad altre alle risorse Google Cloud creando un account di servizio dedicato con autorizzazioni aggiuntive.
Creare un account di servizio da utilizzare come "identità computing" del rendering completamente gestito di Google Cloud. 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 in Google Cloud. Non sono necessarie ulteriori autorizzazioni.
Esegui il deployment con l'account di servizio
renderer-identity
e rifiuta le richieste non autenticate l'accesso.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 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 privato di Markdown
I servizi privati non possono essere caricati direttamente da un browser web. Usa invece curl
o uno strumento di interfaccia a riga di comando per richieste HTTP simile che consente di inserire un'intestazione Authorization
.
Per inviare del testo in grassetto al servizio e vedere che converte gli asterischi markdown 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 passa il testo Markdown non elaborato come parametro della 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 il deployment dell'elemento Servizio di rendering Markdown.
La risposta deve essere uno snippet HTML:
<strong>Hello Bold Text</strong>
Revisione dell'integrazione tra i servizi di editor e rendering
Il servizio di modifica fornisce una semplice interfaccia utente per l'inserimento di testo e uno spazio per visualizzare il codice HTML
l'anteprima. Prima di continuare, controlla il codice recuperato in precedenza aprendo il
Directory ./editor/
.
Quindi, esplora le seguenti sezioni di codice che integra i due servizi.
Node.js
Il modulo render.js
crea richieste autenticate al renderer privato
completamente gestito di Google Cloud. Utilizza il server di metadati di Google Cloud
nell'ambiente Cloud Run per creare un token di identità e aggiungere
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 in modo che in HTML.
Python
Il metodo new_request
crea richieste autenticate ai servizi privati.
Utilizza il server di metadati di Google Cloud in 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à all'account
server mediante l'autenticazione con le Credenziali predefinite dell'applicazione.
Analizza il markdown da JSON e invialo al servizio Renderer in modo che 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 come parte di un
Intestazione Authorization
.
In altri ambienti, RenderService
richiede un token di identità all'account
server mediante l'autenticazione con le Credenziali predefinite dell'applicazione.
La richiesta viene inviata al servizio di rendering dopo aver aggiunto il markup del testo da trasformare in HTML. Gli errori di risposta vengono gestiti per differenziare problemi di comunicazione dovuti alla funzionalità di rendering.
Java
makeAuthenticatedRequest
crea richieste autenticate come private
i servizi di machine learning. Utilizza il server di metadati di Google Cloud
dell'ambiente Cloud Run per creare un token di identità e aggiungerlo
Richiesta HTTP come parte di un'intestazione Authorization
.
In altri ambienti, makeAuthenticatedRequest
richiede un token di identità
dai server di Google mediante l'autenticazione con le Credenziali predefinite dell'applicazione.
Analizza il markdown da JSON e invialo al servizio Renderer in modo che in HTML.
C#
GetAuthenticatedPostResponse
crea richieste autenticate come private
i servizi di machine learning. Utilizza il server di metadati di Google Cloud
dell'ambiente Cloud Run per creare un token di identità e aggiungerlo
Richiesta HTTP come parte di un'intestazione Authorization
.
In altri ambienti, GetAuthenticatedPostResponse
richiede un token di identità
dai server di Google mediante l'autenticazione con le Credenziali predefinite dell'applicazione.
Analizza il markdown da JSON e invialo al servizio Renderer in modo che in HTML.
Invio del servizio editor pubblico
Per creare 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 questo comando 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
è l'ID che vuoi assegnare al servizio.Se l'operazione riesce, verrà visualizzato il messaggio SUCCESS contenente l'ID, la creazione ora e nome dell'immagine. L'immagine è archiviata in Container Registry e può essere se lo desideri,
Python
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/editor
Dove PROJECT_ID è l'ID progetto Google Cloud e
editor
è l'ID che vuoi assegnare al servizio.Se l'operazione riesce, verrà visualizzato il messaggio SUCCESS contenente l'ID, la creazione ora e nome dell'immagine. L'immagine è archiviata in Artifact Registry e può essere se lo desideri,
Vai
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/editor
Dove PROJECT_ID è l'ID progetto Google Cloud e
editor
è l'ID che vuoi assegnare al servizio.Se l'operazione riesce, verrà visualizzato il messaggio SUCCESS contenente l'ID, la creazione ora e nome dell'immagine. L'immagine è archiviata in Artifact Registry e può essere se lo desideri,
Java
Questo esempio utilizza Jib per creare utilizzando strumenti Java comuni. Jib ottimizza le build di container senza la necessità di un Dockerfile o di avere Docker installato. 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
è l'ID che vuoi assegnare al servizio.Se l'operazione riesce, verrà visualizzato un messaggio BUILD SUCCESS. L'immagine è archiviata in Artifact Registry e può essere riutilizzato, se necessario.
C#
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/editor
Dove PROJECT_ID è l'ID progetto Google Cloud e
editor
è l'ID che vuoi assegnare al servizio.Se l'operazione riesce, verrà visualizzato il messaggio SUCCESS contenente l'ID, la creazione ora e nome dell'immagine. L'immagine è archiviata in Artifact Registry e può essere se lo desideri,
Esegui il deployment come servizio privato con accesso speciale al servizio di rendering.
Creare un account di servizio da utilizzare come "identità computing" dei privati completamente gestito di Google Cloud. 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 altri elementi in Google Cloud diversi dal servizio di rendering Markdown.
Concedi l'accesso all'identità Compute
editor-identity
per richiamare Markdown di Google Cloud. Qualsiasi servizio che lo utilizza come identità di computing dispongono di 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 richiamar nel contesto del servizio di rendering, Il servizio di rendering è l'unico servizio Cloud Run privato dell'editor richiamare.
Esegui il deployment con l'account di servizio
editor-identity
e autorizza il deployment di accesso 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 il tuo ID progetto
- 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 di modifica:
Concedi a
allUsers
l'autorizzazione per richiamare il servizio:
Informazioni sul traffico HTTPS
Sono tre le richieste HTTP coinvolte nel rendering markdown utilizzando questi servizi.
Prova
Per provare l'applicazione completa per due servizi:
Passa nel browser all'URL fornito nel passaggio di deployment riportato sopra.
Prova a modificare il testo Markdown a sinistra e fai clic sul pulsante per vederlo l'anteprima sulla destra.
Dovrebbe avere il seguente aspetto:
Se scegli di continuare a sviluppare questi servizi, ricorda che sono limitato l'accesso IAM (Identity and Access Management) al resto di Google Cloud e dovranno disporre di ruoli IAM aggiuntivi per accedere a molti altri i servizi di machine learning.
Esegui la pulizia
Se hai creato un nuovo progetto per questo tutorial, elimina il progetto. Se hai utilizzato un progetto esistente e vuoi mantenerlo senza l'aggiunta delle modifiche In questo tutorial, elimina le risorse create per il tutorial.
Elimina il progetto
Il modo più semplice per eliminare la fatturazione 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 del tutorial in corso...
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
I servizi Cloud Run possono essere eliminati anche 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 altre risorse Google Cloud create in questo tutorial:
- Elimina l'immagine container dell'editor denominata
REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/editor
da Artifact Registry - Elimina l'immagine del container di rendering denominata
REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/renderer
da Artifact Registry - 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 l'immagine container dell'editor denominata
Passaggi successivi
- Proteggi ulteriormente il progetto esplorando elenco di controllo per utilizzare IAM in modo sicuro
- Estendi questa applicazione di esempio per monitorare l'utilizzo di Markdown con le metriche personalizzate di Cloud Monitoring
- Guarda il tutorial su Pub/Sub per un approccio a microservizi asincroni sicuri