Configurare Cloud Endpoints gRPC per Cloud Run con ESPv2
Questa pagina mostra come configurare Cloud Endpoints per Cloud Run con un backend gRPC. Endpoints utilizza Extensible Service Proxy V2 (ESPv2) come gateway API. Per fornire la gestione delle API per Cloud Run, esegui il deployment del container ESPv2 precompilato in Cloud Run. A questo punto, contribuisci a 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 tutti i controlli necessari (ad esempio l'autenticazione) prima di invocare il servizio. Quando il servizio risponde, ESPv2 raccoglie e registra la telemetria, come mostrato nella figura seguente. Puoi visualizzare le metriche del tuo servizio nella pagina Endpoints > Servizi nella console Google Cloud.
Per una panoramica di Cloud Endpoints, consulta Informazioni su Endpoints e Architettura di Endpoints.
Migrazione a ESPv2
Le release precedenti di Cloud Endpoints non supportavano gRPC su Cloud Run con ESP. Per utilizzare questa funzionalità, esegui la migrazione a Extensible Service Proxy 2.
Elenco attività
Utilizza il seguente elenco di attività man mano che svolgi il tutorial. Tutte le attività sono obbligatorie per completare questo tutorial.
- Crea un progetto Google Cloud e, se non hai eseguito il deployment del tuo servizio Cloud Run, esegui il deployment di un servizio gRPC di backend di esempio. Vedi Prima di iniziare.
- Riserva un nome host Cloud Run per il servizio ESPv2. Consulta 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. Consulta Configurare Endpoints.
- Esegui il deployment del documento di configurazione dell'API gRPC per creare un servizio gestito. Consulta Eseguire il deployment della configurazione di Endpoints.
- Crea una nuova immagine Docker ESPv2 con la configurazione del servizio Endpoints. Consulta la sezione Creare una nuova immagine ESPv2.
- Esegui il deployment del container ESPv2 su Cloud Run. Quindi, concedi a ESPv2 l'autorizzazione IAM (Identity and Access Management) per richiamare il servizio. Consulta Eseguire il deployment del contenitore ESPv2.
- Richiama un servizio. Consulta Invio di una richiesta all'API.
- Monitora l'attività nei tuoi servizi. Consulta Monitorare l'attività dell'API.
- Evita che al tuo account Google Cloud vengano addebitati costi. Consulta Pulizia.
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.
Una volta completate le attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la pagina Pulizia.
Prima di iniziare
Per la configurazione:
Nella console Google Cloud, 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é ti servirà in seguito. Nel resto di questa pagina, questo ID progetto è indicato come ESP_PROJECT_ID.
Prendi nota del numero del progetto perché ti servirà in seguito. Nel resto di questa pagina, questo numero di progetto è indicato come ESP_PROJECT_NUMBER.
Scarica e installa Google Cloud CLI.
Segui i passaggi descritti nella guida introduttiva di gRPC per Python per installare gRPC e gli strumenti gRPC.
Esegui il deployment del servizio gRPC Cloud Run di backend dell'esempio python-grpc-bookstore-server da utilizzare con questo tutorial. Il servizio gRPC utilizza la seguente immagine container:
gcr.io/endpointsv2/python-grpc-bookstore-server:2
Segui i passaggi descritti in Guida rapida: eseguire il deployment di un container di esempio preimpostato per eseguire il deployment del servizio. Assicurati di sostituire l'immagine container specificata nella guida rapida con
gcr.io/endpointsv2/python-grpc-bookstore-server:2
Prendi nota della regione e dell'ID progetto in cui è dipiegato il servizio. Nel resto di questa pagina, questo ID progetto è indicato come BACKEND_PROJECT_ID. Il nome del servizio Cloud Run di cui è stato eseguito il deployment è BACKEND_SERVICE_NAME. Il nome host Cloud Run è indicato come BACKEND_HOST_NAME.
Prenotazione di un nome host Cloud Run
Per configurare il documento OpenAPI o la configurazione del servizio gRPC, devi prenotare un nome host Cloud Run per il servizio ESPv2. Per prenotare un nome host, esegui il deployment di un container di esempio in Cloud Run. Successivamente, eseguirai il deployment del contenitore ESPv2 sullo stesso servizio Cloud Run.
-
Assicurati che gcloud CLI sia autorizzata ad accedere ai tuoi dati e ai tuoi 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
Al termine, 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
è il CLOUD_RUN_SERVICE_URL egateway-12345-uc.a.run.app
è il CLOUD_RUN_HOSTNAME. - Prendi nota di CLOUD_RUN_SERVICE_NAME e CLOUD_RUN_HOSTNAME.
Successivamente, esegui il deployment di ESPv2 nel servizio CLOUD_RUN_SERVICE_NAME Cloud Run.
Specifica CLOUD_RUN_HOSTNAME nel campo
host
del documento OpenAPI.
Configurazione di Endpoints
L'esempio bookstore-grpc
contiene i file che devi copiare e configurare localmente.
- Crea un file descrittore protobuf autonomo dal file
.proto
del servizio:- Salva una copia di
bookstore.proto
dal repository di esempio alla directory di lavoro attuale. Questo file definisce l'API del servizio Libreria. - Crea la seguente directory nella tua directory di lavoro:
mkdir generated_pb2
- Crea il file descrittore
api_descriptor.pb
utilizzando il compilatore di buffer di protocolloprotoc
. Esegui questo comando 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. Nell'ambiente di compilazione 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 tua directory di lavoro attuale (la stessa directory che contienebookstore.proto
). Per comodità, in questa pagina il documento di configurazione dell'API gRPC viene indicato con questo nome, ma puoi chiamarlo in un altro modo se preferisci. Aggiungi quanto segue i contenuti del file: L'indentazione è importante per il formato YAML. Ad esempio,# 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
name
deve essere allo stesso livello ditype
. Nel campo
name
, specifica CLOUD_RUN_HOSTNAME, la parte del nome host dell'URL riservato sopra in Prenotare un nome host Cloud Run. Non includere l'identificatore del protocollo, ad esempiohttps://
ogrpcs://
.Nel campo
address
della sezionebackend.rules
, sostituisci BACKEND_HOST_NAME con il servizio Cloud Run gRPC Bookstore effettivo 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 il deployment della configurazione.- Salva il documento di configurazione dell'API gRPC.
Per ulteriori informazioni, consulta Configurare gli endpoint.
esegui il deployment della configurazione di Endpoints
Per eseguire il deployment della configurazione di Endpoints, utilizza il comando
gcloud endpoints services deploy
. Questo comando utilizza
Gestione dei servizi
per creare un servizio gestito.
- Assicurati di trovarti nella directory in cui si trovano i file
api_descriptor.pb
eapi_config.yaml
. - Conferma che il progetto predefinito a riga di comando
gcloud
attualmente in uso è il progetto Google Cloud che vuoi eseguire il deployment della configurazione di Endpoints. 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 questo comando:
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 Google Cloud:gcloud endpoints services deploy api_descriptor.pb api_config.yaml
Durante la creazione e la configurazione del servizio, Service Management genera le informazioni al terminale. Al termine del deployment, verrà visualizzato un messaggio simile a viene visualizzato quanto segue:
Service Configuration [CONFIG_ID] uploaded for service [bookstore.endpoints.example-project.cloud.goog]
CONFIG_ID è la configurazione univoca del servizio Endpoints ID 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 del servizio è costituito da una data seguita da un numero di revisione. Se esegui il deployment della configurazione di Endpoints sempre nello stesso giorno, il numero di revisione viene incrementato o l'ID configurazione.
Verifica dei servizi richiesti
Come minimo, Endpoints ed ESP richiedono l'attivazione dei seguenti servizi Google:Nome | Titolo |
---|---|
servicemanagement.googleapis.com |
API Service Management |
servicecontrol.googleapis.com |
API Service Control |
Nella maggior parte dei casi, il comando gcloud endpoints services deploy
attiva questi
servizi obbligatori. Tuttavia, il comando gcloud
viene completato correttamente, ma
non attiva 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 di Endpoints in un progetto Google Cloud esistente in cui questi servizi sono stati disattivati esplicitamente.
Utilizza il seguente comando per verificare che i servizi richiesti siano abilitati:
gcloud services list
Se non vedi i servizi richiesti nell'elenco, attivali:
gcloud services enable servicemanagement.googleapis.com
gcloud services enable servicecontrol.googleapis.com
Abilita anche il servizio Endpoints:
gcloud services enable ENDPOINTS_SERVICE_NAME
Per determinare ENDPOINTS_SERVICE_NAME, puoi:
Dopo aver eseguito il deployment della configurazione di Endpoints, vai alla pagina Endpoints nella console Cloud. L'elenco dei possibili ENDPOINTS_SERVICE_NAME è riportato nella colonna Nome servizio.
Per OpenAPI, ENDPOINTS_SERVICE_NAME è il valore specificato nel campo
host
della specifica OpenAPI. Per gRPC, ENDPOINTS_SERVICE_NAME è il valore specificato nel camponame
della configurazione degli endpoint gRPC.
Per ulteriori informazioni sui comandi gcloud
, consulta
Servizi gcloud
.
Se viene visualizzato un messaggio di errore, consulta Risoluzione dei problemi di deployment della configurazione di Endpoints.
Per ulteriori informazioni, consulta Eseguire il deployment della configurazione di Endpoints.
Creazione di una nuova immagine ESPv2
Crea la configurazione del servizio Endpoints in una nuova immagine Docker ESPv2. In un secondo momento, eseguirai il deployment di questa immagine sul servizio Cloud Run riservato.
Per compilare la configurazione del servizio in una nuova immagine Docker ESPv2:
Scarica questo script sulla tua macchina locale su cui è installata gcloud CLI.
Esegui lo script con il seguente comando:
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 riservato sopra in Prenotazione di 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, compilarla in una nuova immagine ESPv2 e caricarla nel registry dei container del progetto. Lo script utilizza automaticamente la versione più recente di ESPv2, indicata dal carattere 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 Cloud Run ESPv2 con la nuova immagine creata sopra. Sostituisci CLOUD_RUN_SERVICE_NAME con lo stesso nome servizio Cloud Run utilizzato quando hai prenotato inizialmente il nome host riportato sopra in Prenotazione di 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 Endpoints in modo da utilizzare opzioni di avvio di ESPv2 aggiuntive, ad esempio l'attivazione di CORS, puoi passare 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 sull'impostazione della variabile di ambiente
ESPv2_ARGS
, incluso l'elenco delle opzioni disponibili e informazioni su come specificare più opzioni, consulta Flag di Extensible Service Proxy 2.- Concedi all'ESPv2 l'autorizzazione per richiamare i tuoi servizi Cloud Run.
Esegui il seguente comando per ogni servizio. Nel seguente comando:
- Sostituisci BACKEND_SERVICE_NAME con il nome del servizio Cloud Run invocato. 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 trovarlo è andare alla pagina IAM nella console Google Cloud e trovare il service account predefinito di Compute Engine, ovvero l'account di servizio utilizzato nel flag "member".
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 invocato. Se utilizzi il servizio creato
eseguendo il deployment di "gcr.io/endpointsv2/python-grpc-bookstore-server:2",
utilizza
Per ulteriori informazioni, consulta Gestire l'accesso utilizzando 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
Osserva i grafici delle attività dell'API nella Endpoint > Servizi.
Vai alla pagina Servizi endpoint
La visualizzazione dei dati relativi alla richiesta nei grafici può richiedere alcuni minuti.
Esamina i log delle richieste per la tua API nella pagina Esplora log.
Se non ricevi una risposta positiva, consulta la sezione Risoluzione dei problemi relativi alle risposte.
Hai eseguito il deployment e il test di un'API in Endpoints.
monitora l'attività dell'API
Visualizza i grafici delle attività della tua API nella pagina Endpoints > Servizio nella console Google Cloud.
Visualizzare i grafici delle attività di Endpoints
La visualizzazione dei dati relativi alle richieste nei grafici può richiedere alcuni minuti.
Esamina i log delle richieste per la tua API nella pagina Esplora log.
Creazione di un portale per gli sviluppatori per l'API
Puoi utilizzare il portale Cloud Endpoints per creare un portale per gli sviluppatori, un sito web che puoi utilizzare per interagire con l'API di esempio. Per saperne 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 sezione Eliminare un'API e le relative istanze per informazioni su come interrompere i servizi utilizzati da questo tutorial.