Configurare gRPC Cloud Endpoints per Cloud Run con ESPv2
Questa pagina mostra come configurare Cloud Endpoints per Cloud Run con un backend gRPC. Gli endpoint utilizzano Extensible Service Proxy V2 (ESPv2) come gateway API. Per fornire la gestione delle API per Cloud Run, esegui il deployment del container ESPv2 predefinito in Cloud Run. Quindi, puoi proteggere i tuoi servizi utilizzando Cloud Run IAM in modo che ESPv2 possa richiamarli.
Con questa configurazione, ESPv2 intercetta tutte le richieste ai tuoi servizi ed esegue i controlli necessari (ad esempio l'autenticazione) prima di richiamare il servizio. Quando il servizio risponde, ESPv2 raccoglie e segnala la telemetria, come mostrato nella figura seguente. Puoi visualizzare le metriche relative al tuo servizio nella pagina Endpoint > Servizi in Google Cloud Console.
Per una panoramica di Cloud Endpoints, consulta Informazioni sugli endpoint e l'architettura degli endpoint.
Migrazione a ESPv2
Le versioni precedenti di Cloud Endpoints non supportavano gRPC su Cloud Run con ESP. Per utilizzare questa funzionalità, esegui la migrazione a Extensible Service Proxy V2.
Elenco attività
Durante il tutorial, utilizza il seguente elenco di attività. Per completare questo tutorial, sono necessarie tutte le attività.
- Crea un progetto Google Cloud e, se non hai eseguito il deployment di Cloud Run, esegui il deployment di un servizio gRPC di backend di esempio. Vedi Prima di iniziare.
- Prenota un nome host Cloud Run per il servizio ESPv2. Vedi Prenotare un nome host Cloud Run.
- Crea un documento di configurazione dell'API gRPC che descriva l'API e configura le route per Cloud Run. Vedi Configurazione degli endpoint.
- Esegui il deployment del documento di configurazione dell'API gRPC per creare un servizio gestito. Vedi Deployment della configurazione degli endpoint.
- Crea una nuova immagine Docker ESPv2 con la configurazione del servizio Endpoints. Consulta la sezione Creazione di una nuova immagine ESPv2.
- Eseguire il deployment del container ESPv2 su Cloud Run. Concedi quindi a ESPv2 l'autorizzazione IAM (Identity and Access Management) per richiamare il servizio. Vedi Eseguire il deployment del container ESPv2.
- Richiamare un servizio. Consulta la sezione Inviare una richiesta all'API.
- Monitorare l'attività nei tuoi servizi. Consulta Attività dell'API Monitoring.
- Evita che al tuo account Google Cloud vengano addebitati costi aggiuntivi. Vedi Pulizia.
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.
Al termine di questo tutorial, puoi evitare una fatturazione continua eliminando le risorse che hai creato. Per scoprire di più, vedi Pulizia.
Prima di iniziare
Per eseguire la configurazione:
In Google Cloud Console, vai alla pagina Gestisci risorse e crea un progetto.
Verifica che la fatturazione sia attivata per il tuo progetto.
Prendi nota dell'ID progetto, perché sarà necessario in seguito. Nel resto di questa pagina, questo ID progetto è denominato ESP_PROJECT_ID.
Prendi nota del numero di progetto, perché sarà necessario in seguito. Nel resto della pagina, questo numero di progetto è denominato ESP_PROJECT_NUMBER.
Scarica e installa Google Cloud CLI.
Segui i passaggi nella guida rapida di gRPC Python per installare gRPC e gli strumenti gRPC.
Esegui il deployment del servizio di backend Cloud gRPC python-grpc-bookstore-server di esempio per utilizzarlo con questo tutorial. Il servizio gRPC utilizza la seguente immagine container:
gcr.io/endpointsv2/python-grpc-bookstore-server:2
Segui i passaggi in Guida rapida: deployment di un container predefinito di esempio per eseguire il deployment del servizio. Assicurati di sostituire con
gcr.io/endpointsv2/python-grpc-bookstore-server:2
l'immagine container specificata nella guida rapidaNota dell'area geografica e dell'ID progetto in cui viene eseguito il deployment del servizio. Nel resto della pagina, questo ID progetto è denominato BACKEND_PROJECT_ID. Il nome del servizio Cloud Run di cui è stato eseguito il deployment è denominato BACKEND_SERVICE_NAME. Il nome host di Cloud Run viene denominato BACKEND_HOST_NAME.
Prenotazione di un nome host Cloud Run
Devi prenotare un nome host Cloud Run per il servizio ESPv2 per configurare il documento OpenAPI o la configurazione del servizio gRPC. Per prenotare un nome host, eseguirai il deployment di un container di esempio in Cloud Run. Successivamente, eseguirai il deployment del container ESPv2 sullo stesso servizio Cloud Run.
-
Assicurati che l'interfaccia a riga di comando gcloud sia autorizzata ad accedere ai dati e ai servizi.
- Accedi.
gcloud auth login
- Nella nuova scheda del browser che si apre, scegli un account con il ruolo Editor o Proprietario nel progetto Google Cloud che hai creato per il deployment di ESPv2 in Cloud Run.
- Accedi.
-
Imposta la regione.
gcloud config set run/region us-central1
-
Esegui il deployment dell'immagine di esempio
gcr.io/cloudrun/hello
in Cloud Run. Sostituisci CLOUD_RUN_SERVICE_NAME con il nome che vuoi utilizzare per il servizio.gcloud run deploy CLOUD_RUN_SERVICE_NAME \ --image="gcr.io/cloudrun/hello" \ --allow-unauthenticated \ --platform managed \ --project=ESP_PROJECT_ID
Una volta completata l'operazione, il comando visualizza un messaggio simile al seguente:
Service [CLOUD_RUN_SERVICE_NAME] revision [CLOUD_RUN_SERVICE_NAME-REVISION_NUM] has been deployed and is serving traffic at CLOUD_RUN_SERVICE_URL
Ad esempio, se imposti CLOUD_RUN_SERVICE_NAME su
gateway
:Service [gateway] revision [gateway-00001] has been deployed and is serving traffic at https://gateway-12345-uc.a.run.app
In questo esempio,
https://gateway-12345-uc.a.run.app
è CLOUD_RUN_SERVICE_URL egateway-12345-uc.a.run.app
è CLOUD_RUN_HOSTNAME. - Prendi nota di CLOUD_RUN_SERVICE_NAME e CLOUD_RUN_HOSTNAME.
Successivamente, eseguirai il deployment di ESPv2 sul servizio Cloud Run CLOUD_RUN_SERVICE_NAME.
Specifica CLOUD_RUN_HOSTNAME nel campo
host
del documento OpenAPI.
Configurazione di Endpoints
L'esempio di bookstore-grpc
contiene i file che devi copiare localmente e configurare.
- Crea un file descrittore autonomo di un file protobuf dal file
.proto
del servizio:- Salva una copia di
bookstore.proto
dal repository di esempio nella tua directory di lavoro attuale. Questo file definisce l'API del servizio Bookstore. - Crea la seguente directory nella directory di lavoro:
mkdir generated_pb2
- Crea il file descrittore,
api_descriptor.pb
, utilizzando il compilatore del buffer di protocolloprotoc
. Esegui il comando seguente nella directory in cui hai salvatobookstore.proto
:python3 -m grpc_tools.protoc \ --include_imports \ --include_source_info \ --proto_path=. \ --descriptor_set_out=api_descriptor.pb \ --python_out=generated_pb2 \ --grpc_python_out=generated_pb2 \ bookstore.proto
Nel comando precedente,
--proto_path
è impostato sulla directory di lavoro corrente. Nel tuo ambiente di build gRPC, se utilizzi una directory diversa per i file di input.proto
, modifica--proto_path
in modo che il compilatore cerchi nella directory in cui hai salvatobookstore.proto
.
- Salva una copia di
-
Crea un file di testo denominato
api_config.yaml
nella directory di lavoro attuale (la stessa directory che contienebookstore.proto
). Per comodità, questa pagina fa riferimento al documento di configurazione dell'API gRPC con il nome del file, ma puoi scegliere un altro nome, se preferisci. Aggiungi i seguenti contenuti al file:# The configuration schema is defined by the service.proto file. # https://github.com/googleapis/googleapis/blob/master/google/api/service.proto type: google.api.Service config_version: 3 name: CLOUD_RUN_HOSTNAME title: Cloud Endpoints + Cloud Run gRPC apis: - name: endpoints.examples.bookstore.Bookstore usage: rules: # ListShelves methods can be called without an API Key. - selector: endpoints.examples.bookstore.Bookstore.ListShelves allow_unregistered_calls: true backend: rules: - selector: "*" address: grpcs://BACKEND_HOST_NAME
Il rientro è importante per il formato yaml. Ad esempio, il camponame
deve essere allo stesso livello ditype
. Nel campo
name
, specifica CLOUD_RUN_HOSTNAME, la parte del nome host dell'URL prenotato in precedenza in Prenotazione di un nome host Cloud Run. Non includere l'identificatore di protocollo, comehttps://
ogrpcs://
.Nel campo
address
della sezionebackend.rules
, sostituisci BACKEND_HOST_NAME con l'effettivo servizio Libreria gRPC Cloud Run creato in Prima di iniziare.Prendi nota del valore della proprietà
title
nel fileapi_config.yaml
:title: Cloud Endpoints + Cloud Run gRPC
Il valore della proprietà
title
diventa il nome del servizio Endpoints dopo che hai eseguito il deployment della configurazione.- Salva il documento di configurazione dell'API gRPC.
Per ulteriori informazioni, consulta la sezione Configurazione degli endpoint.
Eseguire il deployment della configurazione di Endpoints
Per eseguire il deployment della configurazione Endpoint, utilizza il comando gcloud endpoints services deploy
. Questo comando utilizza Gestione servizi per creare un servizio gestito.
- Assicurati di essere nella directory in cui si trovano i file
api_descriptor.pb
eapi_config.yaml
. - Verifica che il progetto predefinito attualmente utilizzato dallo strumento a riga di comando
gcloud
sia il progetto Google Cloud in cui vuoi eseguire il deployment della configurazione degli endpoint. Convalida l'ID progetto restituito dal seguente comando per assicurarti che il servizio non venga creato nel progetto sbagliato.gcloud config list project
Se devi modificare il progetto predefinito, esegui il comando seguente:
gcloud config set project YOUR_PROJECT_ID
- Esegui il deployment del file
proto descriptor
e del file di configurazione utilizzando l'interfaccia a riga di comando di Google Cloud:gcloud endpoints services deploy api_descriptor.pb api_config.yaml
Durante la creazione e la configurazione del servizio, Service Management trasmette informazioni al terminale. Al termine del deployment, viene visualizzato un messaggio simile al seguente:
Service Configuration [CONFIG_ID] uploaded for service [bookstore.endpoints.example-project.cloud.goog]
CONFIG_ID è l'ID univoco della configurazione del servizio Endpoints creato dal deployment. Ad esempio:
Service Configuration [2017-02-13r0] uploaded for service [bookstore.endpoints.example-project.cloud.goog]
Nell'esempio precedente,
2017-02-13r0
è l'ID configurazione del servizio ebookstore.endpoints.example-project.cloud.goog
è il nome del servizio. L'ID configurazione servizio è costituito da un timestamp, seguito da un numero di revisione. Se esegui nuovamente il deployment della configurazione endpoint lo stesso giorno, il numero di revisione viene incrementato nell'ID configurazione del servizio.
Verifica dei servizi richiesti
Come minimo, endpoint ed ESP richiedono l'abilitazione dei seguenti servizi Google:Nome | Titolo |
---|---|
servicemanagement.googleapis.com |
API Service Management |
servicecontrol.googleapis.com |
API Service Control |
endpoints.googleapis.com |
Google Cloud Endpoints |
Nella maggior parte dei casi, il comando gcloud endpoints services deploy
abilita questi servizi obbligatori. Tuttavia, il comando gcloud
viene completato correttamente, ma non abilita i servizi richiesti nelle seguenti circostanze:
Se hai utilizzato un'applicazione di terze parti come Terraform e non includi questi servizi,
Hai eseguito il deployment della configurazione Endpoint in un progetto Google Cloud esistente in cui questi servizi sono stati esplicitamente disattivati.
Utilizza il comando seguente per verificare che i servizi richiesti siano abilitati:
gcloud services list
Se i servizi richiesti non sono elencati, attivali:
gcloud services enable servicemanagement.googleapis.comgcloud services enable servicecontrol.googleapis.com
gcloud services enable endpoints.googleapis.com
Attiva anche il servizio Endpoints:
gcloud services enable ENDPOINTS_SERVICE_NAME
Per determinare l'ENDPOINTS_SERVICE_NAME, puoi:
Dopo aver eseguito il deployment della configurazione Endpoint, vai alla pagina Endpoint in Cloud Console. L'elenco dei possibili ENDPOINTS_SERVICE_NAME è riportato nella colonna Nome servizio.
Per OpenAPI, il valore ENDPOINTS_SERVICE_NAME è quello specificato nel campo
host
delle specifiche OpenAPI. Per gRPC, il valore ENDPOINTS_SERVICE_NAME è quello specificato nel camponame
della configurazione degli endpoint gRPC.
Per ulteriori informazioni sui comandi gcloud
, consulta la pagina relativa ai servizi gcloud
.
Se viene visualizzato un messaggio di errore, vedi Risoluzione dei problemi di deployment della configurazione degli endpoint.
Per ulteriori informazioni, consulta la sezione Deployment della configurazione degli endpoint.
Creare una nuova immagine ESPv2
Creare la configurazione del servizio Endpoints in una nuova immagine Docker ESPv2. Successivamente, eseguirai il deployment di questa immagine nel servizio Cloud Run riservato.
Per creare la configurazione del servizio in una nuova immagine docker ESPv2:
Scarica questo script sulla tua macchina locale su cui è installata l'interfaccia a riga di comando gcloud.
Esegui lo script con il comando seguente:
chmod +x gcloud_build_image
./gcloud_build_image -s CLOUD_RUN_HOSTNAME \ -c CONFIG_ID -p ESP_PROJECT_ID
Per CLOUD_RUN_HOSTNAME, specifica il nome host dell'URL che hai prenotato in precedenza in Prenotare un nome host Cloud Run. Non includere l'identificatore di protocollo
https://
.Ad esempio:
chmod +x gcloud_build_image
./gcloud_build_image -s gateway-12345-uc.a.run.app \ -c 2019-02-01r0 -p your-project-id
-
Lo script utilizza il comando
gcloud
per scaricare la configurazione del servizio, creare la configurazione del servizio in una nuova immagine ESPv2 e caricare la nuova immagine nel Container Registry del progetto. Lo script utilizza automaticamente l'ultima release di ESPv2, indicata da ESP_VERSION nel nome dell'immagine di output. L'immagine di output viene caricata in:gcr.io/ESP_PROJECT_ID/endpoints-runtime-serverless:ESP_VERSION-CLOUD_RUN_HOSTNAME-CONFIG_ID
Ad esempio:
gcr.io/your-project-id/endpoints-runtime-serverless:2.14.0-gateway-12345-uc.a.run.app-2019-02-01r0"
Deployment del container ESPv2
Esegui il deployment del servizio ESPv2 Cloud Run con la nuova immagine che hai creato sopra. Sostituisci CLOUD_RUN_SERVICE_NAME con lo stesso nome di servizio Cloud Run che hai utilizzato quando hai prenotato in origine il nome host sopra nella sezione Prenotare un nome host Cloud Run:
gcloud run deploy CLOUD_RUN_SERVICE_NAME \ --image="gcr.io/ESP_PROJECT_ID/endpoints-runtime-serverless:ESP_VERSION-CLOUD_RUN_HOSTNAME-CONFIG_ID" \ --allow-unauthenticated \ --platform managed \ --project=ESP_PROJECT_ID
Se vuoi configurare Endpoint per utilizzare opzioni di avvio ESPv2 aggiuntive, come l'abilitazione di CORS, puoi trasmettere gli argomenti nella variabile di ambiente
ESPv2_ARGS
:gcloud run deploy CLOUD_RUN_SERVICE_NAME \ --image="gcr.io/ESP_PROJECT_ID/endpoints-runtime-serverless:ESP_VERSION-CLOUD_RUN_HOSTNAME-CONFIG_ID" \ --set-env-vars=ESPv2_ARGS=--cors_preset=basic \ --allow-unauthenticated \ --platform managed \ --project ESP_PROJECT_ID
Per ulteriori informazioni ed esempi sulla configurazione della variabile di ambiente
ESPv2_ARGS
, incluso l'elenco delle opzioni disponibili e informazioni su come specificare più opzioni, consulta i flag Extensible Service Proxy V2.- Concedi l'autorizzazione ESPv2 per richiamare i servizi Cloud Run.
Esegui questo comando per ogni servizio. Nel seguente comando:
- Sostituisci BACKEND_SERVICE_NAME con il nome del servizio Cloud Run richiamato. Se utilizzi il servizio creato eseguendo il deployment di "gcr.io/endpointsv2/python-grpc-bookstore-server:2", utilizza
python-grpc-bookstore-server
come valore. - Sostituisci ESP_PROJECT_NUMBER con il numero del progetto che hai creato per ESPv2. Un modo per trovare questo elemento è andare alla pagina IAM in Google Cloud Console e trovare l'account di servizio Compute predefinito, che è l'account di servizio utilizzato nel flag "Membro".
gcloud run services add-iam-policy-binding BACKEND_SERVICE_NAME \ --member "serviceAccount:ESP_PROJECT_NUMBER-compute@developer.gserviceaccount.com" \ --role "roles/run.invoker" \ --platform managed \ --project BACKEND_PROJECT_ID
- Sostituisci BACKEND_SERVICE_NAME con il nome del servizio Cloud Run richiamato. Se utilizzi il servizio creato eseguendo il deployment di "gcr.io/endpointsv2/python-grpc-bookstore-server:2", utilizza
Per ulteriori informazioni, consulta la pagina sulla gestione dell'accesso tramite IAM.
Invia richieste all'API
Per inviare richieste all'API di esempio, puoi utilizzare un client gRPC di esempio scritto in Python.
Clona il repository Git in cui è ospitato il codice client gRPC:
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
Cambia la directory di lavoro:
cd python-docs-samples/endpoints/bookstore-grpc/
Installa le dipendenze:
pip3 install virtualenv
virtualenv env
source env/bin/activate
pip3 install -r requirements.txt
Invia una richiesta all'API di esempio:
python3 bookstore_client.py --host CLOUD_RUN_HOSTNAME --port 443 --use_tls true
Specifica il nome host del servizio Cloud Run ESPv2 in CLOUD_RUN_HOSTNAME, senza l'identificatore di protocollo. Ad esempio:
python3 bookstore_client.py --host espv2-grpc-HASH-uc.a.run.app --port 443 --use_tls true
Guarda i grafici delle attività per la tua API nella pagina Endpoint > Servizi.
Vai alla pagina Servizi di endpoint
Potrebbero essere necessari alcuni minuti prima che la richiesta venga riportata nei grafici.
Esamina i log delle richieste relativi alla tua API nella pagina Esplora log.
Se non ricevi una risposta corretta, consulta la sezione Risolvere gli errori di risposta.
Hai eseguito il deployment di un'API e l'hai testata in Endpoints.
Monitora l'attività dell'API
Visualizza i grafici di attività per la tua API nella pagina Endpoint > Servizio in Google Cloud Console.
Visualizzare i grafici delle attività di Endpoints
Potrebbero essere necessari alcuni istanti prima che la richiesta venga visualizzata nei grafici.
Esamina i log delle richieste per la tua API nella pagina Esplora log.
Creazione di un portale per sviluppatori per l'API
Puoi utilizzare il portale Cloud Endpoints per creare un portale per sviluppatori, un sito web che puoi utilizzare per interagire con l'API di esempio. Per scoprire di più, consulta la panoramica del portale Cloud Endpoints.
Esegui la pulizia
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questa pagina, segui questi passaggi:
Consulta la pagina relativa all'eliminazione di API e istanze API per informazioni sull'arresto dei servizi utilizzati in questo tutorial.