Configurer Cloud Endpoints gRPC pour Cloud Run avec ESPv2
Cette page vous explique comment configurer Cloud Endpoints pour Cloud Run avec un backend gRPC. Cloud Endpoints utilise le proxy Extensible Service Proxy V2 (ESPv2) en guise de passerelle API. Afin d'assurer la gestion des API par Cloud Run, vous devez déployer le conteneur ESPv2 prédéfini sur Cloud Run. Vous pouvez ensuite sécuriser vos services à l'aide des rôles IAM pour Cloud Run afin qu'ESPv2 puisse les appeler.
Une fois la configuration finalisée, ESPv2 peut intercepter toutes les requêtes adressées à vos services avant de les appeler, et effectuer les vérifications nécessaires, telles que l'authentification. Lorsque le service répond, ESPv2 rassemble et consigne les données de télémétrie, comme illustré par la figure ci-dessous. Vous pouvez afficher les métriques de votre service sur la page Endpoints > Page Services dans la console Google Cloud.
Pour obtenir une présentation de Cloud Endpoints, consultez les pages À propos de Cloud Endpoints et Présentation de l'architecture Cloud Endpoints.
Migrer vers ESPv2
Les versions précédentes de Cloud Endpoints n'acceptaient pas gRPC sur Cloud Run avec ESP. Pour utiliser cette fonctionnalité, effectuez la migration vers Extensible Service Proxy V2.
Liste de tâches
Tout au long du tutoriel, reportez-vous à la liste de tâches présentée ci-dessous. La finalisation du tutoriel suppose de réaliser l'intégralité de ces tâches.
- Créez un projet Google Cloud et, si vous n'avez pas déployé votre propre environnement Cloud Run, déployez un exemple de service gRPC backend. Consultez la section Avant de commencer.
- Réservez un nom d'hôte Cloud Run pour le service ESPv2. Consultez la page Réserver un nom d'hôte Cloud Run.
- Créez un document de configuration de l'API gRPC décrivant votre API, puis configurez les routes vers votre instance Cloud Run. Consultez la section Configurer Endpoints.
- Déployez le document de configuration de l'API gRPC pour créer un service géré. Consultez la section Déployer la configuration Endpoints.
- Créez une image ESPv2 pour Docker avec votre configuration de service Endpoints. Consultez la section Créer une nouvelle image ESPv2.
- Déployez le conteneur ESPv2 dans Cloud Run. Accordez ensuite à ESPv2 l'autorisation IAM (Identity and Access Management) d'appeler votre service. Consultez la section Déployer le conteneur ESPv2.
- Appelez un service. Consultez la section Envoyer des requêtes à l'API.
- Suivez l'activité de vos services. Consultez la section Suivre l'activité de l'API.
- Faites le nécessaire pour éviter que des frais ne soient facturés sur votre compte Google Cloud. Consultez la section Effectuer un nettoyage.
Coûts
Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :
Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût.
Une fois que vous avez terminé les tâches décrites dans ce document, vous pouvez éviter de continuer à payer des frais en supprimant les ressources que vous avez créées. Pour en savoir plus, consultez la section Effectuer un nettoyage.
Avant de commencer
Avant de vous lancer, procédez comme suit :
Dans la console Google Cloud, accédez à la page Gérer les ressources et créez un projet.
Assurez-vous que la facturation est activée pour votre projet.
Notez l'ID du projet, car vous en aurez besoin ultérieurement. Sur le reste de cette page, cet ID est appelé ESP_PROJECT_ID.
Notez le numéro de projet, car vous en aurez besoin ultérieurement. Sur le reste de cette page, ce numéro est appelé ESP_PROJECT_NUMBER.
Téléchargez et installez la Google Cloud CLI.
Suivez les étapes du guide de démarrage rapide de gRPC Python pour installer gRPC et les outils gRPC.
Déployer l'exemple de backend python-grpc-bookstore-server Service gRPC Cloud Run à utiliser avec ce tutoriel. Le service gRPC utilise l'image de conteneur suivante :
gcr.io/endpointsv2/python-grpc-bookstore-server:2
Suivez les étapes du Guide de démarrage rapide : déployer un exemple de conteneur prédéfini pour déployer le service. Veillez à remplacer l'image de conteneur spécifiée dans ce guide de démarrage rapide par
gcr.io/endpointsv2/python-grpc-bookstore-server:2
.Notez la région et l'identifiant du projet dans lequel votre service est déployé. Sur le reste de cette page, cet ID est appelé BACKEND_PROJECT_ID. Le nom désignant le service Cloud Run déployé est BACKEND_SERVICE_NAME. Son nom d'hôte Cloud Run est BACKEND_HOST_NAME.
Réserver un nom d'hôte Cloud Run
Vous devez réserver un nom d'hôte Cloud Run pour le service ESPv2 afin de configurer le document OpenAPI ou la configuration du service gRPC. Pour réserver un nom d'hôte, vous devez déployer un exemple de conteneur dans Cloud Run. Vous déploierez par la suite le conteneur ESPv2 sur le même service Cloud Run.
-
Assurez-vous que la CLI gcloud est autorisée à accéder à vos données et services.
- Connectez-vous.
gcloud auth login
- Dans le nouvel onglet de navigateur qui s'ouvre, choisissez un compte auquel a été attribué le rôle Éditeur ou Propriétaire dans le projet Google Cloud que vous avez créé pour déployer ESPv2 dans Cloud Run.
- Connectez-vous.
- Définissez la région.
gcloud config set run/region us-central1
-
Déployez l'exemple d'image
gcr.io/cloudrun/hello
dans Cloud Run. Remplacez CLOUD_RUN_SERVICE_NAME par le nom que vous souhaitez utiliser pour le service.gcloud run deploy CLOUD_RUN_SERVICE_NAME \ --image="gcr.io/cloudrun/hello" \ --allow-unauthenticated \ --platform managed \ --project=ESP_PROJECT_ID
Si elle réussit, la commande affiche un message semblable à celui-ci :
Service [CLOUD_RUN_SERVICE_NAME] revision [CLOUD_RUN_SERVICE_NAME-REVISION_NUM] has been deployed and is serving traffic at CLOUD_RUN_SERVICE_URL
Par exemple, si vous définissez CLOUD_RUN_SERVICE_NAME sur
gateway
:Service [gateway] revision [gateway-00001] has been deployed and is serving traffic at https://gateway-12345-uc.a.run.app
Dans cet exemple,
https://gateway-12345-uc.a.run.app
correspond à CLOUD_RUN_SERVICE_URL etgateway-12345-uc.a.run.app
à CLOUD_RUN_HOSTNAME. - Notez CLOUD_RUN_SERVICE_NAME et CLOUD_RUN_HOSTNAME.
Vous déploierez par la suite ESPv2 sur le service Cloud Run CLOUD_RUN_SERVICE_NAME.
Spécifiez CLOUD_RUN_HOSTNAME dans le champ
host
du document OpenAPI.
Configurer Endpoints
bookstore-grpc
contient les fichiers à copier localement et à configurer.
- Créez un fichier descripteur protobuf autonome à partir de votre fichier de service
.proto
:- Enregistrez dans votre répertoire de travail actuel une copie du fichier
bookstore.proto
à partir de l'exemple de dépôt. Ce fichier définit l'API du service Bookstore. - Créez le répertoire suivant dans votre répertoire de travail :
mkdir generated_pb2
- Créez le fichier descripteur
api_descriptor.pb
à l'aide du compilateur de tampons de protocoleprotoc
. Exécutez la commande suivante dans le répertoire où vous avez enregistrébookstore.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
Dans la commande ci-dessus,
--proto_path
est défini sur le répertoire de travail actuel. Dans votre environnement de compilation gRPC, si vous utilisez un autre répertoire pour les fichiers d'entrée.proto
, modifiez--proto_path
pour que le compilateur recherche le répertoire dans lequel vous avez enregistré votre fichierbookstore.proto
.
- Enregistrez dans votre répertoire de travail actuel une copie du fichier
-
Créez un fichier texte appelé
api_config.yaml
dans votre répertoire de travail actuel (le même répertoire que celui contenantbookstore.proto
). Pour plus de commodité, cette page utilise ce nom de fichier pour désigner le document de configuration de l'API gRPC, mais vous pouvez lui donner un autre nom si vous préférez. Ajoutez le contenu suivant au fichier : La mise en retrait est importante pour le format YAML. Par exemple, le champ# 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
doit se trouver au même niveau quetype
. Dans le champ
name
, spécifiez CLOUD_RUN_HOSTNAME, c'est-à-dire la partie nom d'hôte de l'URL réservée, comme indiqué ci-dessus dans la section Réserver un nom d'hôte Cloud Run. N'incluez pas l'identifiant de protocole, tel quehttps://
ougrpcs://
.Dans le champ
address
de la sectionbackend.rules
, remplacez BACKEND_HOST_NAME par le service Cloud Run gRPC Bookstore réel créé dans la section Avant de commencer.Notez la valeur de la propriété
title
dans le fichierapi_config.yaml
:title: Cloud Endpoints + Cloud Run gRPC
La valeur de la propriété
title
devient le nom du service Endpoints après le déploiement de la configuration.- Enregistrez le document de configuration de votre API gRPC.
Pour en savoir plus, consultez la page Configurer Endpoints.
Déployer la configuration Endpoints
Pour déployer la configuration Endpoints, exécutez la commande gcloud endpoints services deploy
. Cette commande crée un service géré à l'aide de Service Management.
- Vérifiez que vous êtes bien dans le répertoire contenant les fichiers
api_descriptor.pb
etapi_config.yaml
. - Vérifiez que le projet par défaut actuellement utilisé par l'outil de ligne de commande
gcloud
est bien le projet Google Cloud vers lequel vous souhaitez déployer la configuration Endpoints. Validez l'ID de projet renvoyé par la commande suivante, afin de vous assurer que le service est créé dans le bon projet.gcloud config list project
Si vous devez modifier le projet par défaut, exécutez la commande suivante :
gcloud config set project YOUR_PROJECT_ID
- Déployer le fichier
proto descriptor
et le fichier de configuration à l'aide de la commande Google Cloud CLI:gcloud endpoints services deploy api_descriptor.pb api_config.yaml
Lors de la création et de la configuration du service, Service Management envoie des informations au terminal. Une fois le déploiement terminé, un message semblable au suivant s'affiche :
Service Configuration [CONFIG_ID] uploaded for service [bookstore.endpoints.example-project.cloud.goog]
CONFIG_ID correspond à l'ID unique de configuration du service Endpoints créé par le déploiement. Exemple :
Service Configuration [2017-02-13r0] uploaded for service [bookstore.endpoints.example-project.cloud.goog]
Dans l'exemple précédent,
2017-02-13r0
correspond à l'ID de configuration du service etbookstore.endpoints.example-project.cloud.goog
au nom du service. L'ID de configuration du service se compose d'un horodatage suivi d'un numéro de révision. Si vous déployez à nouveau la configuration Endpoints le même jour, le numéro de révision est incrémenté dans l'ID de configuration du service.
Vérifier les services requis
Endpoints et ESP requièrent au minimum l'activation des services Google suivants :Nom | Titre |
---|---|
servicemanagement.googleapis.com |
API Service Management |
servicecontrol.googleapis.com |
API Service Control |
endpoints.googleapis.com |
Google Cloud Endpoints |
Dans la plupart des cas, la commande gcloud endpoints services deploy
permet d'activer ces services requis. Toutefois, bien que la commande gcloud
ait abouti, elle n'active pas les services requis dans les cas suivants :
Vous avez utilisé une application tierce telle que Terraform et vous n'incluez pas ces services.
Vous avez déployé la configuration Endpoints dans un projet Google Cloud existant dans lequel ces services étaient explicitement désactivés.
Utilisez la commande suivante pour vérifier que les services nécessaires sont activés :
gcloud services list
Si les services requis ne sont pas répertoriés, activez-les :
gcloud services enable servicemanagement.googleapis.comgcloud services enable servicecontrol.googleapis.com
gcloud services enable endpoints.googleapis.com
Activez également votre service Endpoints :
gcloud services enable ENDPOINTS_SERVICE_NAME
Pour déterminer la valeur de ENDPOINTS_SERVICE_NAME, vous pouvez effectuer l'une des opérations suivantes :
Après avoir déployé la configuration Endpoints, accédez à la page Points de terminaison de la console Cloud. La liste des valeurs ENDPOINTS_SERVICE_NAME possibles s'affiche dans la colonne Nom du service.
Pour OpenAPI, ENDPOINTS_SERVICE_NAME correspond à ce que vous avez spécifié dans le champ
host
de votre spécification OpenAPI. Pour gRPC, ENDPOINTS_SERVICE_NAME correspond à ce que vous avez spécifié dans le champname
de votre configuration Endpoints gRPC.
Pour en savoir plus sur les commandes gcloud
, consultez la page Services gcloud
.
Si vous recevez un message d'erreur, consultez la page Dépannage du déploiement de la configuration Cloud Endpoints.
Pour en savoir plus, consultez la page Déployer la configuration Endpoints.
Créer une image ESPv2
Créez la configuration du service Endpoints dans une nouvelle image ESPv2 pour Docker. Vous déploierez par la suite cette image sur le service Cloud Run réservé.
Pour créer la configuration de service dans une nouvelle image ESPv2 pour Docker, procédez comme suit :
Télécharger script sur votre machine locale sur laquelle gcloud CLI est installée.
Exécutez le script avec la commande suivante :
chmod +x gcloud_build_image
./gcloud_build_image -s CLOUD_RUN_HOSTNAME \ -c CONFIG_ID -p ESP_PROJECT_ID
Pour le paramètre CLOUD_RUN_HOSTNAME, spécifiez le nom d'hôte de l'URL que vous avez réservé, comme indiqué ci-dessus dans la section Réserver un nom d'hôte Cloud Run. N'incluez pas l'identifiant du protocole
https://
.Exemple :
chmod +x gcloud_build_image
./gcloud_build_image -s gateway-12345-uc.a.run.app \ -c 2019-02-01r0 -p your-project-id
-
Le script utilise la commande
gcloud
pour télécharger la configuration de service, la compiler dans une nouvelle image ESPv2, puis importer la nouvelle image dans le registre de conteneurs de votre projet. Le script utilise automatiquement la dernière version d'ESPv2, désignée par ESP_VERSION dans le nom de l'image de sortie. L'image de sortie est importée dans l'emplacement suivant :gcr.io/ESP_PROJECT_ID/endpoints-runtime-serverless:ESP_VERSION-CLOUD_RUN_HOSTNAME-CONFIG_ID
Exemple :
gcr.io/your-project-id/endpoints-runtime-serverless:2.14.0-gateway-12345-uc.a.run.app-2019-02-01r0"
Déployer le conteneur ESPv2
Déployez le service ESPv2 pour Cloud Run avec la nouvelle image créée ci-dessus. Remplacez CLOUD_RUN_SERVICE_NAME par le nom du service Cloud Run utilisé lors de la réservation initiale du nom d'hôte, comme indiqué ci-dessus dans la section Réserver un nom d'hôte 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
Si vous souhaitez configurer Endpoints afin d'utiliser d'autres options de démarrage d'ESPv2, telles que l'activation de CORS, vous pouvez transmettre les arguments dans la variable d'environnement
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
Pour en savoir plus et obtenir des exemples de définition de la variable d'environnement
ESPv2_ARGS
, y compris la liste des options disponibles et des informations sur la manière de spécifier plusieurs options, reportez-vous à la page sur les options d'Extensible Service Proxy V2.- Accordez à ESPv2 l'autorisation d'appeler vos services Cloud Run.
Exécutez la commande ci-dessous pour chaque service. Dans la commande suivante :
- Remplacez BACKEND_SERVICE_NAME par le nom du service Cloud Run appelé. Si vous utilisez le service créé en déployant "gcr.io/endpointsv2/python-grpc-bookstore-server:2", utilisez
python-grpc-bookstore-server
comme valeur. - Remplacez ESP_PROJECT_NUMBER par le numéro du projet que vous avez créé pour ESPv2. Pour cela, vous pouvez accéder IAM de la console Google Cloud et recherchez la Compte de service Compute par défaut : il s'agit du compte de service utilisé dans l'option "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
- Remplacez BACKEND_SERVICE_NAME par le nom du service Cloud Run appelé. Si vous utilisez le service créé en déployant "gcr.io/endpointsv2/python-grpc-bookstore-server:2", utilisez
Pour en savoir plus, consultez la page Gérer les accès à l'aide d'IAM.
Envoyer des requêtes à l'API
Pour envoyer des requêtes à l'exemple d'API, vous pouvez utiliser un exemple de client gRPC écrit en Python.
Clonez le dépôt Git dans lequel le code client gRPC est hébergé :
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
Modifiez votre répertoire de travail :
cd python-docs-samples/endpoints/bookstore-grpc/
Installez les dépendances :
pip3 install virtualenv
virtualenv env
source env/bin/activate
pip3 install -r requirements.txt
Envoyez une requête à l'exemple d'API :
python3 bookstore_client.py --host CLOUD_RUN_HOSTNAME --port 443 --use_tls true
Spécifiez le nom d'hôte de votre service Cloud Run ESPv2 dans CLOUD_RUN_HOSTNAME, sans l'identifiant de protocole. Exemple :
python3 bookstore_client.py --host espv2-grpc-HASH-uc.a.run.app --port 443 --use_tls true
Consultez les graphiques d'activité de votre API sur la page Endpoints > Services.
Accédez à la page Services Endpoints
Il peut s'écouler quelques instants avant que la requête ne soit reflétée dans les graphiques.
Consultez les journaux de requêtes de votre API sur la page de l'explorateur de journaux.
Si vous ne recevez pas de réponse positive, consultez la page Dépanner des erreurs de réponse.
Vous venez de déployer et de tester une API dans Endpoints.
Suivre l'activité de l'API
Afficher les graphiques d'activité de votre API sur le point de terminaison > Service de la console Google Cloud.
Afficher les graphiques d'activité Endpoints
Il peut s'écouler quelques instants avant que la requête ne soit reflétée dans les graphiques.
Consultez les journaux de requêtes de votre API sur la page de l'explorateur de journaux.
Créer un portail développeur pour l'API
Vous pouvez utiliser le portail Cloud Endpoints pour créer un portail des développeurs, c'est-à-dire un site Web qui vous permet d'interagir avec l'exemple d'API. Pour en savoir plus, consultez la page Présentation du portail Cloud Endpoints.
Effectuer un nettoyage
Pour éviter que les ressources utilisées sur cette page soient facturées sur votre compte Google Cloud, procédez comme suit :
Pour plus d'informations sur l'arrêt des services utilisés par ce tutoriel, consultez la page Supprimer une API et des instances d'API.