Ce tutoriel explique comment créer un service Cloud Run for Anthos personnalisé qui transforme un paramètre d'entrée de description de graphe en un schéma au format d'image PNG
. Il utilise l'outil de visualisation Graphviz, qui est installé en tant que package système dans l'environnement de conteneur du service.
Graphviz est accessible via les utilitaires de ligne de commande pour le traitement des requêtes.
Objectifs
- Écrire et créer un conteneur personnalisé avec un Dockerfile
- Écrire, créer et déployer un service Cloud Run for Anthos
- Utiliser l'utilitaire Graphviz dot pour générer des schémas.
- Tester le service en publiant un schéma dans la syntaxe DOT à partir de la collection ou de votre création.
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.
Avant de commencer
-
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.
- Activez l'API Cloud Run for Anthos
- Installez et initialisez la gcloud CLI.
- Installez le composant
kubectl
:gcloud components install kubectl
- Mettez à jour les composants :
gcloud components update
- Installez curl pour tester le service
- Créez un cluster en suivant les instructions de la section Configurer Cloud Run for Anthos.
Configurer les paramètres par défaut de gcloud
Pour configurer gcloud avec les valeurs par défaut pour votre service Cloud Run pour Anthos, procédez comme suit :
Définissez le projet par défaut :
gcloud config set project PROJECT_ID
Remplacez PROJECT_ID par le nom du projet que vous utilisez pour ce tutoriel.
Configurez gcloud pour votre cluster :
gcloud config set run/platform gke gcloud config set run/cluster CLUSTER-NAME gcloud config set run/cluster_location REGION
Remplacez :
- CLUSTER-NAME par le nom que vous avez utilisé pour votre cluster ;
- REGION par l'emplacement de cluster compatible de votre choix.
Récupérer l'exemple de code
Pour récupérer l’exemple de code à utiliser, procédez comme suit :
Clonez le dépôt de l'exemple d'application sur votre machine locale :
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
Vous pouvez également télécharger l'exemple en tant que fichier ZIP et l'extraire.
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
Vous pouvez également télécharger l'exemple en tant que fichier ZIP et l'extraire.
Go
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
Vous pouvez également télécharger l'exemple en tant que fichier ZIP et l'extraire.
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
Vous pouvez également télécharger l'exemple en tant que fichier ZIP et l'extraire.
Accédez au répertoire contenant l'exemple de code Cloud Run for Anthos :
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/
Visualiser l'architecture
L'architecture de base est semblable à ceci :
L'utilisateur adresse une requête HTTP au service Cloud Run for Anthos, lequel exécute un utilitaire Graphviz pour transformer la requête en image. Cette image est transmise à l'utilisateur sous forme de réponse HTTP.
Comprendre le code
Définir la configuration de votre environnement avec le fichier Dockerfile
Le fichier Dockerfile
est spécifique au langage et à l'environnement d'exploitation de base que votre service utilisera, par exemple Ubuntu.
Ce service nécessite un ou plusieurs packages système supplémentaires qui ne sont pas disponibles par défaut.
Ouvrez le fichier
Dockerfile
dans un éditeur.Recherchez une instruction
Dockerfile
RUN
. Cette instruction permet d'exécuter des commandes de shell arbitraires pour modifier l'environnement. Si le fichierDockerfile
comporte plusieurs étapes, identifiées par plusieurs instructionsFROM
, vous le trouverez à la dernière étape.Les packages spécifiques requis et le mécanisme pour les installer varient en fonction du système d'exploitation déclaré dans le conteneur.
Pour obtenir les instructions relatives à votre système d'exploitation ou à votre image de base, cliquez sur l'onglet correspondant.
Debian/Ubuntu Alpine Alpine nécessite un deuxième package pour la prise en charge des polices.Pour déterminer le système d'exploitation de votre image de conteneur, vérifiez le nom dans l'instruction
FROM
ou dans un fichier README associé à votre image de base. Par exemple, en cas d'extension depuisnode
, vous trouverez la documentation et le fichierDockerfile
parent sur Docker Hub.Créez l'image pour tester votre personnalisation, en utilisant
docker build
localement ou Cloud Build.
Traiter les requêtes entrantes
L'exemple de service utilise les paramètres de la requête HTTP entrante pour effectuer un appel système qui exécute la commande appropriée de l'utilitaire dot
.
Dans le gestionnaire HTTP ci-dessous, un paramètre d'entrée de description de graphe est extrait de la variable de chaîne de requête dot
.
Les descriptions de graphe peuvent inclure des caractères qui doivent être encodés au format URL pour pouvoir être utilisés dans une chaîne de requête.
Node.js
Python
Go
Java
Vous devrez faire la distinction entre les erreurs de serveur internes et les entrées utilisateur non valides. Cet exemple de service renvoie une erreur de serveur interne pour toutes les erreurs de ligne de commande dot, sauf si le message d'erreur contient la chaîne syntax
, ce qui indique un problème de saisie de la part de l'utilisateur.
Générer un schéma
La logique de base de la génération de schéma utilise l'outil de ligne de commande dot pour traiter le paramètre d'entrée de description de graphe dans un schéma au format d'image PNG.
Node.js
Python
Go
Java
Concevoir un service sécurisé
Toutes les failles de l'outil dot
constituent des failles potentielles du service Web. Pour réduire ces risques, utilisez des versions à jour du package graphviz
en recréant régulièrement l'image de conteneur.
Si vous étendez l'exemple actuel pour accepter les entrées utilisateur en tant que paramètres de ligne de commande, vous devez fournir une protection contre les attaques par injection de commande. Des moyens existent pour prévenir les attaques par injection, parmi lesquels :
- Mapper les entrées dans un dictionnaire de paramètres compatibles.
- Valider les entrées correspondant à une plage de valeurs connues, en utilisant éventuellement des expressions régulières.
- Échapper les entrées pour s'assurer que la syntaxe du shell n'est pas évaluée.
Transmettre le code
Pour transmettre votre code, créez un conteneur avec Cloud Build, importez-le dans Container Registry, puis déployez-le sur Cloud Run for Anthos :
Exécutez la commande suivante pour créer votre conteneur et publier sur Container Registry.
Node.js
gcloud builds submit --tag gcr.io/PROJECT_ID/graphviz
Où PROJECT_ID est l'ID de votre projet GCP et
graphviz
le nom que vous souhaitez attribuer à votre service.En cas de réussite, un message SUCCESS apparaît contenant l'ID, l'heure de création et le nom de l'image. Celle-ci est stockée dans Container Registry et peut être réutilisée au besoin.
Python
gcloud builds submit --tag gcr.io/PROJECT_ID/graphviz
Où PROJECT_ID est l'ID de votre projet GCP et
graphviz
le nom que vous souhaitez attribuer à votre service.En cas de réussite, un message SUCCESS apparaît contenant l'ID, l'heure de création et le nom de l'image. Celle-ci est stockée dans Container Registry et peut être réutilisée au besoin.
Go
gcloud builds submit --tag gcr.io/PROJECT_ID/graphviz
Où PROJECT_ID est l'ID de votre projet GCP et
graphviz
le nom que vous souhaitez attribuer à votre service.En cas de réussite, un message SUCCESS apparaît contenant l'ID, l'heure de création et le nom de l'image. Celle-ci est stockée dans Container Registry et peut être réutilisée au besoin.
Java
Cet exemple utilise Jib pour créer des images Docker à l'aide d'outils Java courants. Jib optimise les builds de conteneurs sans requérir de fichier Dockerfile ni d'installation Docker. Découvrez comment créer des conteneurs Java avec Jib.À l'aide du fichier Dockerfile, configurez et créez une image de base avec les packages système installés pour remplacer l'image de base par défaut de Jib :
gcloud builds submit --tag gcr.io/PROJECT_ID/graphviz-base
Où PROJECT_ID est l'ID de votre projet GCP.
Créez votre conteneur final avec Jib et publiez-le sur Container Registry :
mvn compile jib:build \ -Dimage=gcr.io/PROJECT_ID/graphviz \ -Djib.from.image=gcr.io/PROJECT_ID/graphviz-base
Où PROJECT_ID est l'ID de votre projet GCP.
Utilisez la commande suivante pour effectuer le déploiement :
gcloud run deploy graphviz-web --create-if-missing --image gcr.io/PROJECT_ID/graphviz
Où PROJECT_ID est l'ID de votre projet GCP,
graphviz
est le nom du conteneur ci-dessus etgraphviz-web
est le nom du service.Patientez jusqu'à la fin du déploiement, soit environ 30 secondes.
Si vous souhaitez déployer une mise à jour de code sur le service, répétez les opérations précédentes. Chaque déploiement sur un service crée une nouvelle révision et commence automatiquement à acheminer le trafic une fois prêt.
Essayer
Testez votre service en envoyant des requêtes HTTP POST
contenant des descriptions de syntaxe DOT dans la charge utile de la requête.
Envoyez une requête HTTP à votre service.
Le schéma peut être intégré dans une page Web :
-
Pour obtenir l'adresse IP externe de la passerelle d'entrée Istio, exécutez la commande suivante :
où le résultat ressemble à ce qui suit :kubectl get svc istio-ingress -n gke-system
La valeur EXTERNAL-IP de l'équilibreur de charge est l'adresse IP que vous devez utiliser.NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) istio-ingress LoadBalancer XX.XX.XXX.XX pending 80:32380/TCP,443:32390/TCP,32400:32400/TCP
Exécutez une commande curl en utilisant cette adresse
EXTERNAL-IP
dans l'URL : N'incluez pas le protocole (par exemple,http://
) dansSERVICE_DOMAIN
.curl -G -H "Host: SERVICE_DOMAIN" http://EXTERNAL-IP/diagram.png \ --data-urlencode "dot=digraph Run { rankdir=LR Code -> Build -> Deploy -> Run }" \ > diagram.png
-
Pour obtenir l'adresse IP externe de la passerelle d'entrée Istio, exécutez la commande suivante :
Ouvrez le fichier
diagram.png
obtenu dans une application compatible avec les fichiersPNG
, telle que Chrome.Elle devrait se présenter comme ceci :
Vous pouvez explorer une petite collection de descriptions de schéma prêtes à l'emploi.
- Copiez le contenu du fichier
.dot
sélectionné. Collez-le dans une commande
curl
:curl -G -H "Host: SERVICE_DOMAIN" http://EXTERNAL-IP/diagram.png \ --data-urlencode "dot=digraph Run { rankdir=LR Code -> Build -> Deploy -> Run }" \ > diagram.png
Effectuer un nettoyage
Si vous avez créé un projet pour ce tutoriel, supprimez-le. Si vous avez utilisé un projet existant et que vous souhaitez le conserver sans les modifications du présent tutoriel, supprimez les ressources créées pour ce tutoriel.
Supprimer le projet
Le moyen le plus simple d'empêcher la facturation est de supprimer le projet que vous avez créé pour ce tutoriel.
Pour supprimer le projet :
- 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.
Supprimer les ressources du tutoriel
Supprimez le service Cloud Run pour Anthos que vous avez déployé dans ce tutoriel :
gcloud run services delete SERVICE-NAME
Où SERVICE-NAME est le nom de service que vous avez choisi.
Vous pouvez également supprimer des services Cloud Run for Anthos depuis la console Google Cloud :
Supprimez les configurations gcloud par défaut que vous avez ajoutées lors de la configuration du tutoriel :
gcloud config unset run/platform gcloud config unset run/cluster gcloud config unset run/cluster_location
Supprimez la configuration du projet :
gcloud config unset project
Supprimez les autres ressources Google Cloud créées dans ce tutoriel :
- Supprimez l'image de conteneur nommée
gcr.io/<var>PROJECT_ID</var>/graphviz
de Container Registry. - Si vous avez créé un cluster pour ce tutoriel, supprimez-le.
- Supprimez l'image de conteneur nommée
Étapes suivantes
- Testez votre application graphviz :
- Assurez la compatibilité pour d'autres utilitaires graphviz appliquant différents algorithmes pour générer les schémas.
- Enregistrez les schémas dans Cloud Storage. Voulez-vous enregistrer l'image ou la syntaxe DOT ?
- Ajoutez une protection contre les contenus abusifs avec l'API Cloud Natural Language.
- Découvrez un autre exemple de package système dans la section Traitement des images.
- Découvrez des architectures de référence, des schémas et des bonnes pratiques concernant Google Cloud. Consultez notre Centre d'architecture cloud.