Application Web sans serveur et gestion des événements pour l'extraction et l'analyse de données
Ce tutoriel peut entraîner des coûts. Utilisez l'Estimateur de coûts pour générer une estimation du coût en fonction de votre utilisation projetée.
Dans ce tutoriel, vous allez créer une application afin de collecter automatiquement les statistiques de trafic GitHub pour les référentiels et fournir la base de l'analyse du trafic. GitHub fournit uniquement un accès aux données de trafic des 14 derniers jours. Si vous voulez analyser des statistiques sur une période plus longue, vous devez télécharger et stocker ces données vous-même. Dans ce tutoriel, vous déployez une application sans serveur dans un projet IBM Cloud Code Engine. L'application gère les métadonnées pour les référentiels GitHub et fournit l'accès aux statistiques pour l'analyse de données. La collecte des données de trafic est effectuée depuis GitHub à la demande dans l'application ou déclenchée par des événements Code Engine, par exemple quotidiennement. L'application présentée dans ce tutoriel implémente une solution compatible avec le service partagé, avec l'ensemble de fonctions prenant en charge le mode à service partagé.

Objectifs
- Déployer une application de base de données Python conteneurisée avec prise en charge du service partagé et accès sécurisé
- Intégrer l'ID d'application en tant que fournisseur d'authentification basé sur OpenID Connect
- Configurer une collecte automatisée, sans serveur, de statistiques de trafic GitHub
Avant de commencer
Pour ce tutoriel, vous devez disposer des éléments suivants :
- IBM Cloud CLI,
- du plug-in IBM Cloud Code Engine,
- du plug-in IBM Cloud® Container Registry,
- d'un compte GitHub.
Vous pouvez exécuter les sections nécessitant un shell dans IBM® Cloud Shell.
Vous trouverez des instructions de téléchargement et d'installation de ces outils pour votre environnement d'exploitation dans le document Démarrer avec les tutoriels.
Configuration du service et de l'environnement (shell)
Dans cette section, vous configurez les services nécessaires et préparez l'environnement. Vous pouvez effectuer ces opérations à partir de l'environnement shell (terminal).
-
Si vous n'êtes pas connecté, utilisez
ibmcloud login
ouibmcloud login --sso
pour vous connecter de manière interactive. -
St le groupe de ressources et la région en exécutant la commande
ibmcloud target
.RESOURCE_GROUP_NAME=Default REGION=us-south ibmcloud target -r $REGION -g $RESOURCE_GROUP_NAME
-
Créez une instance IBM Db2 SaaS avec le plan gratuit (lite) et nommez-la ghstatsDB.
ibmcloud resource service-instance-create ghstatsDB dashdb-for-transactions free $REGION
-
Créez une instance du service App ID. Utilisez ghstatsAppID comme nom et le plan Tranche graduée (graduated-tier).
ibmcloud resource service-instance-create ghstatsAppID appid graduated-tier $REGION
-
Ajoutez un nouvel espace de nom ghstats à IBM Cloud® Container Registry. Vous l'utiliserez pour référencer des images de conteneur. Il existe un registre mondial ainsi que des registres régionaux. Utilisez le registre global.
ibmcloud cr region-set global NAMESPACE=ghstatsYourInitials ibmcloud cr namespace-add $NAMESPACE
Préparation de Code Engine (shell)
Une fois les services mis à disposition et la configuration générale effectuée, vous devez créer le projet Code Engine, puis créer une image de conteneur pour l'application et la déployer.
- Créez un projet Code Engine nommé ghstats. La commande le définit automatiquement comme le contexte Code Engine en cours.
ibmcloud ce project create --name ghstats
- Créez une configuration de génération Code Engine ; en d'autres termes, configurez le projet afin qu'il génère l'image de conteneur pour vous. Il reprend le code du dépôt GitHub pour ce tutoriel et stocke l'image dans le registre dans l'espace de noms précédemment créé en utilisant les informations de l'utilisateur enregistré.
ibmcloud ce build create --name ghstats-build --source https://github.com/IBM-Cloud/github-traffic-stats --context-dir /backend --commit master --image private.icr.io/$NAMESPACE/codeengine-ghstats
- Notez que la commande build create a eu pour effet secondaire de créer un secret d'accès au registre qui permettra au projet d'écrire et de lire le fichier IBM Cloud® Container Registry.
ibmcloud ce registry list
- Ensuite, exécutez le processus de génération réel.
La sortie indique d'autres commandes à exécuter pour suivre les journaux de statut de la génération au fur et à mesure de sa progression. Par exemple :ibmcloud ce buildrun submit --build ghstats-build
ibmcloud ce buildrun logs -f -n ghstats-build-run-123456-123456789
Déploiement de l'application (shell)
Une fois la génération prête, vous pouvez utiliser l'image de conteneur pour déployer l'application, puis lier les services mis à disposition précédemment.
-
Déployer l'application signifie créer une application Code Engine nommée ghstats-app. L'image est extraite du registre et de l'espace de nom donnés.
ibmcloud ce app create --name ghstats-app --image private.icr.io/$NAMESPACE/codeengine-ghstats:latest --registry-secret ce-auto-icr-private-global
Une fois l'application déployée, vous pouvez vérifier qu'elle est disponible à l'adresse URL indiquée dans la sortie. L'application n'est pas configurée et par conséquent, ne peut pas encore être utilisée. Vous pouvez vérifier le statut de déploiement avec
ibmcloud ce app list
ou obtenir des détails en exécutantibmcloud ce app get --name ghstats-app
.Par défaut, la mise à l'échelle minimale est zéro (0). Cela signifie que Code Engine réduit les instances en cours d'exécution à zéro si l'application ne présente pas de charge de travail. Vous pouvez ainsi réduire les coûts, mais un rapide redémarrage de l'application sera nécessaire si vous effectuez à nouveau une mise à l'échelle supérieure à partir de zéro. Pour l'éviter, utilisez le paramètre
--min 1
lors de la création ou de la mise à jour de l'application. -
Pour utiliser les services mis à disposition, vous devez les lier à l'application. Tout d'abord, liez IBM Db2 SaaS, puis App ID :
ibmcloud ce application bind --name ghstats-app --service-instance ghstatsDB
ibmcloud ce application bind --name ghstats-app --service-instance ghstatsAppID
Chaque
application bind
crée les ressources et les relations suivantes:- Un serviceIAM Service ID.
- Une clé d'API IAM est créée dans l'ID IAM Service.
- Clé de service de ressource. Ils sont appelés (Données d'identification du service dans la console IBM Cloud. Essayez la commande suivante pour afficher l'entrée App ID:
ibmcloud resource service-keys --instance-name ghstatsAppID
Au lieu de lier les services à l'application, vous pouvez également utiliser des secrets ou des configmaps. Vous pouvez les associer à des valeurs stockées dans des fichiers ou transmises sous forme de littéraux. Un exemple de fichier pour les secrets et les instructions correspondantes se trouvent dans le dépôt GitHub de ce tutoriel.
Configuration d'App ID et de GitHub (navigateur)
Vous effectuez toutes les étapes ci-après dans votre navigateur Internet. Tout d'abord, configurez App ID en vue de l'utilisation de Cloud Directory et de l'application. Ensuite, créez un jeton d'accès GitHub. Celui-ci est requis par l'application pour extraire les données de trafic.
-
Dans la liste de ressources IBM Cloud®, ouvrez la vue d'ensemble de vos services. Recherchez l'instance du service App ID créée dans la section Services. Cliquez sur son entrée pour ouvrir les détails.
-
Dans le tableau de bord des services, cliquez sur Gérer l'authentification dans le menu de gauche. Vous affichez ainsi la liste des fournisseurs d'identité disponibles, tels que Facebook, Google, SAML 2.0 Federation et Cloud Directory. Pour Cloud Directory, définissez la valeur Activé, et pour tous les autres fournisseurs, la valeur Désactivé.
Vous pouvez configurer l'authentification multifacteur (Multi-Factor Authentication - MFA) et des règles sur les mots de passe avancées. Ce sujet n'est pas abordé dans ce tutoriel.
-
Cliquez sur l'onglet Paramètres d'authentification situé dans la même boîte de dialogue. Dans Ajouter des URL de redirection Web, entrez l'url de votre application +
/redirect_uri
, par exemplehttps://ghstats-app.56ab78cd90ef.us-south.codeengine.appdomain.cloud/redirect_uri
.Pour tester l'application localement, l'URL de redirection est
http://127.0.0.1:5000/redirect_uri
. Vous pouvez configurer plusieurs URL de redirection. Pour tester l'application localement, copiez .env.local.template dans .env, adaptez-la et démarrez-la avecpython3 ghstats.py
. -
Dans le menu de gauche, développez Cloud Directory et cliquez sur Users. La liste des utilisateurs de Cloud Directory apparaît. Cliquez sur le bouton Create User pour vous ajouter comme premier utilisateur. Vous avez terminé la configuration du service App ID .
-
Dans le navigateur, visitez Github.com et allez dans Paramètres -> Paramètres du développeur -> Jetons d'accès personnels. Cliquez sur le bouton Générer un nouveau jeton (classique). Entrez GHStats Tutorial pour Remarque. Activez ensuite public_repo sous la catégorie repo et read:org sous admin:org. A présent, au bas de cette page, cliquez sur Generate token. Le nouveau jeton d'accès s'affiche sur la page suivante. Vous en avez besoin lors de la configuration de l'application suivante.
GitHub Jeton d'accès
Configuration et test de l'application Python
Après la préparation, vous configurez et testez l'application. L'application est écrite en Python à l'aide du célèbre micro-cadre Flask. Vous pouvez ajouter des référentiels pour la collecte de statistiques ou en retirer. Vous pouvez consulter les données de trafic dans une vue tabulaire ou dans un graphique à courbes.
-
Dans un navigateur, ouvrez l'URI de l'application déployée. Vous devriez voir une page d'accueil.
Ecran d'accueil -
Dans le navigateur, ajoutez
/admin/initialize-app
à l'URI et accédez à la page. Cette opération permet d'initialiser l'application et ses données. Cliquez sur le bouton Start initialization. Vous accédez alors à une page de configuration protégée par mot de passe. L'adresse électronique avec laquelle vous vous connectez est considérée comme l'identification de l'administrateur système. Utilisez l'adresse électronique et le mot de passe que vous avez configurés précédemment. -
Dans la page de configuration, entrez un nom (il est utilisé pour les messages d'accueil), votre nom d'utilisateur GitHub et le jeton d'accès que vous avez généré auparavant. Cliquez sur Initialize. Vous créez ainsi les tables de la base de données et insérez des valeurs de configuration. Enfin, il crée des enregistrements de base de données pour l'administrateur système et un locataire.
Première étape -
Après quoi, la liste des référentiels gérés apparaît. Vous pouvez à présent ajouter des référentiels en fournissant le nom du compte ou de l'organisation GitHub et le nom du référentiel. Après avoir saisi les données, cliquez sur Add repository. Le référentiel, ainsi qu'un identificateur nouvellement attribué, doivent apparaître dans la table. Vous pouvez supprimer des référentiels du système en entrant leur ID et en cliquant sur Supprimer le référentiel.
Liste des référentiels -
A des fins de test, cliquez sur Administration, puis sur Collect statistics. Cette opération permet d'extraire les données de trafic à la demande. Ensuite, cliquez sur Repositories et Daily Traffic. Il doit afficher les données collectées.
Données de trafic
Configuration de l'extraction quotidienne des données (shell)
Une fois l'application installée et configurée, il reste à initier l'extraction quotidienne des données de trafic GitHub. Vous allez créer un abonnement cron. À l'instar d'une tâche cron, l'application s'abonne à des événements selon un calendrier précis (événementiel).
-
Créez l'abonnement cron ghstats-daily avec une planification quotidienne à 6h00 TUC avec un événement POST dans le chemin /collectStats. Remplacez SECRET_TOKEN_AS_IDENTIFIER par la valeur de secret de votre choix. Celle-ci sera utilisée pour identifier le donneur d'événements à l'application.
ibmcloud ce subscription cron create --name ghstats-daily --destination ghstats-app --path /collectStats --schedule '0 6 * * *' --data '{"token":"SECRET_TOKEN_AS_IDENTIFIER"}' --content-type application/json
-
Pour que l'application ait connaissance du jeton secret, mettez-la à jour. Remplacez SECRET_TOKEN_AS_IDENTIFIER par la valeur que vous avez choisie à l'étape précédente.
ibmcloud ce app update --name ghstats-app --registry-secret usicr --env EVENT_TOKEN=SECRET_TOKEN_AS_IDENTIFIER
Cette opération permet de créer une révision d'application. Vous pouvez vérifier que les événements ont été reçus et traités par l'application en accédant dans l'application à Administration, puis à Journal système.
La commande ci-dessus crée une planification à 6h00 TUC tous les jours. Pour vérifier directement que la gestion des événements fonctionne, choisissez une heure quelques minutes après l'heure en cours, convertie au format TUC.
Conclusions
Dans ce tutoriel, vous avez déployé une application sans serveur dans IBM Cloud Code Engine. La source de l'application provient d'un référentiel GitHub. Vous avez demandé à Code Engine de générer l'image de conteneur et de la stocker dans IBM Cloud® Container Registry. Ensuite, celle-ci a été extraite de ce registre et déployée en tant que conteneur. L'application est liée à des services IBM Cloud.
L'application et la gestion des événements associée permettent l'extraction automatique des données de trafic depuis les référentiels GitHub. Les informations sur ces référentiels, y compris le jeton d'accès spécifique au titulaire, sont stockées dans une base de données SQL (IBM Db2 Warehouse SaaS). Cette base de données est utilisée par l'application Python pour gérer les utilisateurs, les référentiels et pour présenter les statistiques relatives au trafic. Les utilisateurs peuvent consulter ces statistiques dans des tables pouvant faire l'objet de recherches ou les afficher dans un graphique à courbes simple (voir l'image ci-dessous). Il est également possible de télécharger la liste des référentiels et les données de trafic sous forme de fichiers CSV.

Sécurité : Rotation des données d'identification
Si vous utilisez cette solution en production, vous devez changer régulièrement les données d'identification du service. De nombreuses politiques de sécurité ont une obligation de changer les mots de passe et les données d'identification tous les 90 jours ou à une fréquence similaire.
Vous pouvez recréer les données d'identification pour les services liés à l'application, et par conséquent appliquer une rotation aux données d'identification, en supprimant la liaison des services, puis en liant à nouveau les services. Lorsque vous utilisez des secrets à la place de liaisons de service, vous disposez même de davantage d'options car vous pouvez d'abord recréer les clés de service, puis mettre à jour les secrets et enfin, mettre à jour l'application.
Suppression de ressources
Pour nettoyer les ressources utilisées dans ce tutoriel, vous pouvez supprimer le projet et les services connexes.
- Annulez la liaison des services mis à disposition. Affichez d'abord les liaisons, puis supprimez-les par Noms des liaisons de service (FIRST et SECOND ci-dessous proviennent de la sortie get)
ibmcloud ce application get --name ghstats-app
ibmcloud ce application unbind --name ghstats-app --binding ghstats-app-ce-service-binding-FIRST
ibmcloud ce application unbind --name ghstats-app --binding ghstats-app-ce-service-binding-SECOND
- Supprimez le projet et ses composants :
ibmcloud ce project delete --name ghstats --hard -f
- Supprimez les services :
ibmcloud resource service-instance-delete -f ghstatsDB
ibmcloud resource service-instance-delete -f ghstatsAppID
- Supprimer l'espace de noms Container Registry
ibmcloud cr namespace-rm $NAMESPACE -f
- Supprimez le jeton Github.com
En fonction de la ressource, le service peut ne pas être supprimé immédiatement mais conservé un certain temps (7 jours par défaut). Pour récupérer la ressource, vous pouvez la supprimer de manière définitive ou la restaurer pendant la période de conservation. Pour savoir comment utiliser la récupération de ressources, consultez ce document.
Extension du tutoriel
Vous souhaitez développer ou modifier ce tutoriel ? Voici quelques suggestions :
- Développez l'application pour la prise en charge du service partagé.
- Utilisez des fournisseurs d'identité sociale.
- Ajoutez un sélecteur de date à la page de statistiques pour filtrer les données affichées.
- Utilisez une page de connexion personnalisée pour App ID.
Contenu associé
Voici des liens vers des informations supplémentaires sur les sujets abordés dans ce tutoriel. L'application elle-même est disponible sur ce dépôt GitHub.
Documentation :