Questo tutorial mostra come creare un servizio Cloud Run personalizzato che trasforma un parametro di input della descrizione del grafico in un diagramma nel formato dell'immagine PNG. Utilizza Graphviz e viene installato come pacchetto di sistema nell'ambiente container del servizio.
Graphviz viene utilizzato tramite utilità a riga di comando per gestire le richieste.
Obiettivi
- Scrivi e crea un container personalizzato con un Dockerfile
- Scrivi, crea ed esegui il deployment di un servizio Cloud Run
- Utilizza l'utilità Graphviz dot per generare diagrammi
- Testa il servizio pubblicando un diagramma di sintassi DOT della raccolta o una tua creazione
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 senza costi per l'esecuzione, il test e il deployment dei workload.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify 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.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
- Abilita l'API Cloud Run Admin
- Installa e inizializza gcloud CLI.
- Aggiorna i componenti:
gcloud components update
Ruoli obbligatori
Per ottenere le autorizzazioni necessarie per completare il tutorial, chiedi all'amministratore di concederti i seguenti ruoli IAM nel progetto:
- Cloud Build Editor (
roles/cloudbuild.builds.editor) - Cloud Run Admin (
roles/run.admin) - Create Service Accounts (
roles/iam.serviceAccountCreator) - Utente Service Account (
roles/iam.serviceAccountUser) - Service Usage Consumer (
roles/serviceusage.serviceUsageConsumer) - Storage Admin (
roles/storage.admin)
Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.
Potresti anche riuscire a 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 la regione Cloud Run supportata che preferisci.
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.
La soddisfazione dei requisiti di latenza, disponibilità o durabilità è un fattore principale per la selezione della regione in cui vengono eseguiti i servizi Cloud Run.
In genere puoi selezionare la regione più vicina ai tuoi utenti, ma devi considerare la posizione degli altri prodotti Google Cloud utilizzati dal tuo servizio Cloud Run.
L'utilizzo di prodotti Google Cloud in sinergia in più località può influire
sulla latenza del servizio e sui costi.
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)asia-southeast3(Bangkok)europe-north1(Finlandia)Bassi livelli di CO2
europe-north2(Stoccolma)Bassi livelli di CO2
europe-southwest1(Madrid)Bassi livelli di CO2
europe-west1(Belgio)Bassi livelli di CO2
europe-west4(Paesi Bassi)Bassi livelli di CO2
europe-west8(Milano)Bassi livelli di CO2
europe-west9(Parigi)Bassi livelli di CO2
me-west1(Tel Aviv)northamerica-south1(Messico)us-central1(Iowa)Bassi livelli di CO2
us-east1(Carolina del Sud)us-east4(Virginia del Nord)us-east5(Columbus)us-south1(Dallas)Bassi livelli di CO2
us-west1(Oregon)Bassi livelli 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)Bassi livelli di CO2
europe-west10(Berlino)europe-west12(Torino)Bassi livelli di CO2
europe-west2(Londra, Regno Unito)Bassi livelli di CO2
europe-west3(Francoforte, Germania)europe-west6(Zurigo, Svizzera)A basse emissioni di CO2
me-central1(Doha)me-central2(Dammam)northamerica-northeast1(Montreal)Bassi livelli di CO2
northamerica-northeast2(Toronto)Bassi livelli di CO2
southamerica-east1(San Paolo, Brasile)Bassi livelli di CO2
southamerica-west1(Santiago, Cile)Bassi livelli di CO2
us-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 consoleGoogle Cloud .
Recupero dell'esempio di codice
Per recuperare l'esempio di codice da utilizzare:
Clona il repository dell'app di esempio sulla 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.
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.
Passa alla directory che contiene il codice campione di Cloud Run:
Node.js
cd nodejs-docs-samples/run/system-package/
Python
cd python-docs-samples/run/system-package/
Go
cd golang-samples/run/system_package/
Java
cd java-docs-samples/run/system-package/
Visualizzazione dell'architettura
L'architettura di base è la seguente:
L'utente invia una richiesta HTTP al servizio Cloud Run, che esegue un'utilità Graphviz per trasformare la richiesta in un'immagine. L'immagine viene inviata all'utente come risposta HTTP.
Nozioni di base sul codice
Definizione della configurazione dell'ambiente con Dockerfile
Il Dockerfile è specifico per la lingua e l'ambiente operativo di base, ad esempio Ubuntu, che verrà utilizzato dal servizio.
Questo servizio richiede uno o più pacchetti di sistema aggiuntivi non disponibili per impostazione predefinita.
Apri
Dockerfilein un editor.Cerca un estratto conto
DockerfileRUN. Questa istruzione consente di eseguire comandi shell arbitrari per modificare l'ambiente. Se l'immagineDockerfileha più fasi, identificate dalla presenza di più istruzioniFROM, verrà trovata nell'ultima fase.I pacchetti specifici richiesti e il meccanismo per installarli variano in base al sistema operativo dichiarato all'interno del container.
Per istruzioni sul tuo sistema operativo o sulla tua immagine di base, fai clic sulla scheda appropriata.
Debian/Ubuntu Alpine Alpine richiede un secondo pacchetto per il supporto dei caratteri.Per determinare il sistema operativo della tua immagine container, controlla il nome nell'istruzione
FROMo in un file README associato alla tua immagine di base. Ad esempio, se estendi danode, puoi trovare la documentazione e l'immagine principaleDockerfilesu Docker Hub.Testa la personalizzazione creando l'immagine, utilizzando
docker buildlocalmente o Cloud Build.
Gestione delle richieste in entrata
Il servizio di esempio utilizza i parametri della richiesta HTTP in entrata per richiamare una chiamata di sistema che esegue il comando dell'utilità dot appropriato.
Nel gestore HTTP riportato di seguito, un parametro di input della descrizione del grafico viene estratto dalla variabile della stringa di query dot.
Le descrizioni dei grafici possono includere caratteri che devono essere codificati nell'URL per essere utilizzati in una stringa di query.
Node.js
Python
Go
Java
Dovrai distinguere tra errori interni del server e input utente non valido. Questo servizio di esempio restituisce un errore interno del server per tutti gli errori della riga di comando dot, a meno che il messaggio di errore non contenga la stringa syntax, che indica un problema di input utente'utente.
Generazione di un diagramma
La logica di base della generazione dei diagrammi utilizza lo strumento a riga di comando dot per elaborare il parametro di input della descrizione del grafico in un diagramma nel formato dell'immagine PNG.
Node.js
Python
Go
Java
Progettazione di un servizio sicuro
Eventuali vulnerabilità nello strumento dot sono potenziali vulnerabilità del servizio web. Puoi mitigare questo problema utilizzando versioni aggiornate del pacchetto graphviz tramite la ricostruzione regolare dell'immagine container.
Se estendi l'esempio attuale per accettare l'input utente come parametri della riga di comando, devi proteggerti dagli attacchi di command injection. Ecco alcuni modi per prevenire gli attacchi di injection:
- Mappatura degli input a un dizionario di parametri supportati
- Convalidare gli input in modo che corrispondano a un intervallo di valori noti come sicuri, magari utilizzando espressioni regolari
- Escape degli input per garantire che la sintassi della shell non venga valutata
Puoi mitigare ulteriormente le potenziali vulnerabilità eseguendo il deployment del servizio con un account di servizio a cui non sono state concesse autorizzazioni per l'utilizzo dei servizi Google Cloud, anziché utilizzare l'account predefinito, che dispone di autorizzazioni di uso comune. Per questo motivo, i passaggi di questo tutorial creano e utilizzano un nuovo account di servizio.
Spedizione del codice
Per distribuire il codice, crealo con Cloud Build, caricalo su Artifact Registry ed eseguine il deployment in Cloud Run:
Crea un Artifact Registry:
gcloud artifacts repositories create REPOSITORY \ --repository-format docker \ --location REGION
Sostituisci:
- REPOSITORY: un nome univoco per il repository. Per ogni località del repository in un progetto, i nomi dei repository devono essere univoci.
- REGION: la regione Google Cloud da utilizzare per il 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/graphviz
Dove PROJECT_ID è l'ID del tuo progetto Google Cloud e
graphvizè il nome che vuoi assegnare al tuo servizio.In caso di esito positivo, vedrai un messaggio SUCCESS 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/graphviz
Dove PROJECT_ID è l'ID del tuo progetto Google Cloud e
graphvizè il nome che vuoi assegnare al tuo servizio.In caso di esito positivo, vedrai un messaggio SUCCESS 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/graphviz
Dove PROJECT_ID è l'ID del tuo progetto Google Cloud e
graphvizè il nome che vuoi assegnare al tuo servizio.In caso di esito positivo, vedrai un messaggio SUCCESS 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 la necessità di un Dockerfile o di avere Docker installato. Scopri di più sulla creazione di container Java con Jib.Utilizzando il Dockerfile, configura e crea un'immagine di base con i pacchetti di sistema installati per eseguire l'override dell'immagine di base predefinita di Jib:
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz-base
Dove PROJECT_ID è l'ID progetto Google Cloud .
Utilizza l'helper per le credenziali gcloud per autorizzare Docker a eseguire il push su Artifact Registry.
gcloud auth configure-docker
Crea il container finale con Jib e pubblicalo su Artifact Registry:
mvn compile jib:build \ -Dimage=REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz \ -Djib.from.image=REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz-base
Dove PROJECT_ID è l'ID progetto Google Cloud .
Esegui il deployment utilizzando quanto segue:
gcloud
- Crea un nuovo account di servizio. Il tuo codice, inclusi i pacchetti di sistema che utilizza, può utilizzare solo i serviziGoogle Cloud concessi a questo account di servizio.
Dove SA_NAME è un nome che assegni a questo account di servizio. Se nel codice è presente un errore o una vulnerabilità, il codice non potrà accedere ad altre risorse del progetto Google Cloud .gcloud iam service-accounts create SA_NAME
- Esegui il deployment del codice, specificando il account di servizio.
Dove PROJECT_ID è l'ID progetto Google Cloud , SA_NAME è il nome del account di servizio che hai creato,gcloud run deploy graphviz-web --service-account SA_NAME@PROJECT_ID.iam.gserviceaccount.com --image REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz
graphvizè il nome del container riportato sopra egraphviz-webè il nome del servizio. RispondiYalla richiesta "allow unauthenticated". Per ulteriori dettagli sull'autenticazione basata su IAM, consulta Gestione dell'accesso. - Attendi il completamento del deployment. L'operazione può richiedere circa 30 secondi. Se l'operazione riesce, la riga di comando visualizza l'URL del servizio.
Terraform
Per scoprire come applicare o rimuovere una configurazione Terraform, consulta Comandi Terraform di base.
Il seguente codice Terraform crea un servizio Cloud Run.
Sostituisci
IMAGE_URLcon un riferimento all'immagine container, ad esempious-docker.pkg.dev/cloudrun/container/hello:latest. Se utilizzi Artifact Registry, il repository REPO_NAME deve essere già stato creato. L'URL segue il formatoLOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG.Il seguente codice Terraform rende pubblico il tuo servizio Cloud Run.
- Crea un nuovo account di servizio. Il tuo codice, inclusi i pacchetti di sistema che utilizza, può utilizzare solo i serviziGoogle Cloud concessi a questo account di servizio.
Se vuoi eseguire il deployment di un aggiornamento del codice nel servizio, ripeti i passaggi precedenti. Ogni deployment in un servizio crea una nuova revisione e inizia automaticamente a gestire il traffico quando è pronto.
Fai una prova
Prova il servizio inviando richieste HTTP POST con descrizioni della sintassi DOT nel payload della richiesta.
Invia una richiesta HTTP al tuo servizio.
Copia l'URL nella barra degli URL del browser e aggiorna
[SERVICE_DOMAIN]:https://SERVICE_DOMAIN/diagram.png?dot=digraph Run { rankdir=LR Code -> Build -> Deploy -> Run }
Puoi incorporare il diagramma in una pagina web:
<img src="https://SERVICE_DOMAIN/diagram.png?dot=digraph Run { rankdir=LR Code -> Build -> Deploy -> Run }" />
Apri il file
diagram.pngrisultante in qualsiasi applicazione che supporti i filePNG, ad esempio Chrome.Dovrebbe avere il seguente aspetto:
Origine: Descrizione DOT
Puoi esplorare una piccola raccolta di descrizioni di diagrammi già pronte.
- Copia i contenuti del file
.dotselezionato Invia una richiesta HTTP al tuo servizio.
Copia l'URL nella barra degli URL del browser.
https://SERVICE_DOMAIN/diagram.png?dot=SELECTED DOTFILE CONTENTS
Esegui la pulizia
Per evitare che al tuo account Google Cloud vengano addebitati costi aggiuntivi, elimina tutte le risorse di cui hai eseguito il deployment con questo tutorial.
Elimina il progetto
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.
Il modo più semplice per eliminare la fatturazione è eliminare il progetto 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 progetto, quindi fai clic su Chiudi per eliminare il progetto.
Elimina le risorse del tutorial
Elimina il servizio Cloud Run di cui hai eseguito il deployment in questo tutorial. I servizi Cloud Run non comportano costi finché non ricevono richieste.
Per eliminare il servizio Cloud Run, esegui questo comando:
gcloud run services delete SERVICE-NAME
Sostituisci SERVICE-NAME con il nome del servizio.
Puoi eliminare i servizi Cloud Run anche dalla consoleGoogle Cloud .
Rimuovi la configurazione della regione predefinita
gcloudche hai aggiunto durante la configurazione del tutorial:gcloud config unset run/regionRimuovi la configurazione del progetto:
gcloud config unset projectElimina le altre risorse Google Cloud create in questo tutorial:
Elimina l'immagine container denominata
REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphvizda Artifact Registry.Elimina il account di servizio SA_NAME.
gcloud iam service-accounts delete SA_NAME@PROJECT_ID.iam.gserviceaccount.com
Passaggi successivi
- Sperimenta con la tua app graphviz:
- Aggiungi il supporto per altre utilità graphviz che applicano algoritmi diversi alla generazione di diagrammi.
- Salva i diagrammi in Cloud Storage. Vuoi salvare l'immagine o la sintassi DOT?
- Implementa la protezione dai contenuti illeciti con l'API Cloud Natural Language.
- Guarda un altro esempio di pacchetto di sistema nel tutorial sull'elaborazione delle immagini con Cloud Run.
- Esplora architetture, diagrammi e best practice di riferimento su Google Cloud. Consulta il nostro Cloud Architecture Center.