Inscription à notre newsletter

Suivez notre actualité, nos dernières innovations et découvrez nos publications en avant-première.
N'attendez plus et inscrivez-vous !

Sélectionner votre profil

[recaptcha]

Merci de vous etre inscrit !

Plafonnement des coûts sur Google Cloud Platform (projets multiples, budget sur plusieurs mois)….sans payer un centime :)

Mehdi BEN HAJ ABBES
Google Cloud Architect – Expert technique Big Data

Le 8 Octobre 2018, Umanis a lancé son premier  hackathon en partenariat avec Google Cloud. L’objectif : mettre l’Intelligence Artificielle au service du bien commun!

Lors de cet hackathon, les candidats auront la possibilité de découvrir Google Cloud Services afin de mettre en oeuvre leurs solutions. En tant qu’organisateurs (Umanis), nous offrons un budget de 500 EU pour chaque projetCe budget est utilisable pendant 2 mois, soit la durée du hackathon. Notre partenaire Google Cloud, offre un crédit limité pouvant être attaché à un compte de facturation. Vous verrez dans quelle mesure nous limitons les sommes que nous pouvons dépenser sur la Plateforme Google Cloud pour le hackathon.

Au moment d’écrire ces lignes, il n’y a pas de solution simple. Voici notre histoire en plus de détails:

  • Les dépenses budgétaires sont réinitialisées le premier jour de chaque mois, mais nous voulons gérer le budget du projet pour toute la durée du hackathon, qui dépasse un mois.
  • L’établissement d’un budget permet d’envoyer des alertes, mais ne permet pas de définir des limites pour les ressources ou la consommation API.
  • Le compte de facturation est lié aux projets hackathon et à d’autres projets, cependant nous souhaitons gérer uniquement les budgets pour les projets hackathon. et cela non seulement pour un projet, mais pour de nombreux projets  hackathon

 

Vous trouverez une grande partie de la solution dans la documentation Cloud Billing, Cap (disable) billing to stop usage, (Limiter (désactiver) la facturation pour arrêter l’utilisation). Malheureusement, elle ne vous permettra pas de résoudre tous les problèmes, elle ne permet de limiter les coûts que pour un seul projet et cela pour une période qui ne dépasse pas un mois.

La documentation Google Cloud est l’une des meilleures que j’ai pu utiliser. Je n’hésiterai donc pas à copier parfois, en apportant bien sûr les modifications nécessaires à notre solution, des extraits de cette documentation et plus précisément certaines parties contenues dans les deux sections suivantes

Budgets

Capping costs (limiter les coûts)

La solution en bref

Comme la solution Cloud Billing, notre solution limite les coûts en désactivant la facturation. Soyez donc bien attentifs aux alertes qui se trouvent dans le lien ci-dessus (capping costs/limiter les coûts).

Nous allons :

  • Créer un budget (une ressource Google Cloud) par projet pour lequel nous voulons limiter les coûts
  • Lier le budget au projet que nous voulons plafonner
  • Activer les notifications par programmation afin qu’elles reçoivent les messages Cloud Pub/Sub avec le statut actuel du budget
  • Configurer chaque notification de budget afin qu’elle soit publiée dans la même rubrique Cloud Pub/Sub
  • Utiliser une fonction cloud unique pour gérer par programmation les notifications de budget reçues via la rubrique Cloud Pub/Sub pour tous les projets

Je recommande de créer un projet parallèle à des fins d’administration / exploitation. Dans le présent article j’ai donné un nom à mon projet admin avec l’identifiant  mehdi-labs-201811; à partir de maintenant, je l’appellerai projet Admin. C’est là que nous allons créer notre rubrique Cloud Pub / Sub afin d’y recevoir les notifications de budget pour tous les projets que nous voulons contrôler. Nous appellerons cette rubrique: budgets-notifications (notifications budgets). C’est là également que nous déploierons notre fonction Cloud pour gérer les différentes notifications de budgets et plafonner les coûts.
Dans cet article, j’utiliserai plafonner les coûts et contrôler de manière interchangeable. Il en va de même pour budget et alerte budgétaire. En réalité, il s’agit davantage de budget que d’alerte budgétaire

Vous trouverez ici dans la documentation Google Cloud Billing, une très bonne description des notifications de budgets que vous devriez recevoir dans la rubrique créée Cloud Pub/Sub. Voir ci-dessous un exemple de notification dans le format JSON que vous pouvez publier dans la rubrique à des fins de test.

{
  "budgetDisplayName": "project-id-to-cap",
  "alertThresholdExceeded": 0.9,
  "costAmount": 10.26,
  "costIntervalStart": "2018-10-01T07:00:00Z",
  "budgetAmount": 500,
  "budgetAmountType": "SPECIFIED_AMOUNT",
  "currencyCode": "EUR"
}

Commençons :

Créer un budget pour un projet :

Pour activer les notifications de budget par programmation:

Configurez une rubrique Cloud Pub/Sub Facturation pour y publier vos notifications de budgets. Dans notre cas nous allons créer une rubrique Cloud Pub/Sub qui sera utilisée par tous les budgets

  1. Allez sur Google Cloud Platform Console Cloud Pub/Sub page.
  2. Sélectionnez le projet Admin(mehdi-labs-201811).
  3. Cliquez sur Create topic (créer une rubrique), nommez la rubrique budgets-control (contrôle des budgets), et Sauvegardez.

Pour créer un budget :

  1. Allez à Google Cloud Platform Console
  2. Ouvrez le menu de gauche de la console et cliquez sur Billing.
  3. Si vous avez plusieurs comptes de facturation, sélectionnnez Go to linked billing account( Accédez au  compte de facturation lié) afin de gérer la facturation du projet en cours. Pour localiser un compte de facturation différent sélectionnez Manage billing accounts (gérez les comptes de facturation).
  4. Sur la gauche, cliquez sur Budgets & alerts.
  5. Cliquez sur Create Budget.
  6. Sous Budget name, entrez l’identifiant du projet que vous voulez contrôler  (dans cet article, l’un des identifiants pour projets à plafonner s’appelle project-id-to-cap). C’est la seule façon que j’ai trouvée pour communiquer l’identifiant projet à ma Fonction Cloud qui gère le plafonnement des coûts
  7. Sous Project ou billing account, sélectionnez le projet auquel vous voulez appliquer l’alerte budgetaire.
  8. Sous Budget amountchoisissez le paramétrage du budget pour une somme spécifique dans  Specified amount
  9. Entrez la somme spécifique, dans notre cas 500.
  10. Sous Manage Notifications, sélectionnez Connect a Cloud Pub/Sub topic to this budget.
  11. Sélectionnez notreAdminProject et budgets-control Topic pour les notifications puis cliquez sur Save.
  12. Répétez les mêmes actions, pour créer un budget pour chaque projet dont vous voulez plafonner les coûts

Le code de la Fonction Cloud dès 30,000 pieds

La mise en oeuvre de la Fonction Cloud permettra de dépasser les problèmes de dépenses budgétaires par la réinitialisation au premier jour de chaque mois et par le stockage et la récupération de « l’état du budget » à l’aide de Cloud Firestore.
Si les dépenses totales d’un projet dépassent le budget fixé pour le projet, la facturation sera désactivée pour le projet à l’aide de l’API Cloud Billing.
Bien sûr, nous n’oublierons pas les authentifications et autorisations appropriées si nécessaires.

Heureusement, la plupart des produits / services de Google sont accessibles avec un code, grâce aux APIs de Google Cloud, qui constituent un élément clé de Google Cloud Platform.

API s Google Cloud Bibliothèques client Python

Bien que vous puissiez utiliser les APIs Google Cloud en créant des demandes HTTP directes (ou des appels RPC, le cas échéant), Google fournit des bibliothèques client pour toutes ses APIs Cloud. Cela facilite leur accès à partir de vos langues préférées. Mais il y a une subtilité: il existe différents types de bibliothèques client; voici les 2 que nous allons utiliser :

  • Google CloudClient Libraries (Bibliothèques client): c’est l’option recommandée pour accéder aux APIs Cloud par programmation, lorsque celles-ci sont disponibles. C’est l’option que nous allons utiliser pour Cloud Firestore. Vous trouverez ici here la documentation sur la Bibliothèque client pour l’API Cloud Firestore Python
  • Google APIClient Libraries: Un certain nombre d’APIs Google Cloud ne disposent pas encore de Bibliothèque client. Dans ce cas, vous devrez utiliser une autre version: Google API Client Libraries. C’est ce que j’ai fait avec l’API Google Cloud Billing. Vous trouverez les indications sur son utilisation dans la bibliothèque client Python en  lisant ici puis ici puis ici 😁Lorsque j’ai commencé à écrire cet article, les exemples de code pour la Fonction Cloud dans la documentation de Cloud Facturation n’étaient disponibles que dans Node.js 6 😅 J’ai alors choisi Python pour écrire ma Fonction Cloud et j’ai lié toute la documentation à Python, puisque c’était le long chemin que j’avais parcouru.

L’utilisation de produits Bêta (Python 3.7 Cloud Function Runtime) n’est pas sans prix. Un jour que je testais ma Fonction Cloud tout en changeant une petite partie, le déploiement a échoué. J’ai passé des heures sans succès à essayer d’identifier la cause de l’échec. J’ai déployé la Fonction Cloud hello world intégrée en Node.js 8 (version bêta) et cela n’a pas fonctionné. Enfin, quand j’ai déployé hello world en Node.js 6, CELA A MARCHE!  2 jours plus tard, ma Fonction Cloud Python fonctionnait à nouveau sans aucune modification.

Pourquoi Cloud Firestore

J’ai choisi Cloud Firestore pour différentes raisons :

  • Bien que Cloud Firestore est encore en Beta au moment de notre écriture, elle représente la prochaine version majeure de Cloud Datastore.
  • Elle repose sur un modèle gratuit qui devient payant au fur et à mesure, avec un niveau gratuit très généreux 🙂
  • Aucune autre solution de stockage Google Cloud à accès aléatoire, à l’exception de Cloud Datastore, ne dispose de ce genre de modèle de tarification à l’utilisation.
  • Il est très facile de parcourir les données Cloud Firestore via la console Google Cloud.

La solution en plus de détails

Commençons par créer la fonction Cloud :

Créer la Fonction Cloud

  1. Allez à la page Cloud Functions de Google Cloud Platform Console. Créez une nouvelle fonction et donnez lui un nom qui soit significatif pour votre budget. J’ai choisi budgets-notifications-handler. (gestionnaire des notifications budgets)
  2. Sous Memory allocated, sélectionnez 128 MB, il n’est pas nécessaire d’utiliser plus de ressources que celle-ci
  3. Sous Trigger, sélectionnez Cloud Pub/Sub topic.
  4. Sélectionnez la rubrique que vous avez configuré sur vos budgets.
  5. Fournissez le code source et les dépendances pour l’exécution de la fonction. Nous allons utiliser l’éditeur en ligne afin que vous puissiez copier / coller le code source que j’ai fourni ci-dessous. Pour ma part, j’ai utilisé Cloud Source Repository (le référentiel Cloud). A vous de jouer !
  6. Sous Runtime, sélectionnez Python 3.7(Beta). Au moment de notre écriture, Python Runtime est encore en Beta en Node.js 8.

Autorisation appropriée pour la Fonction Cloud

Au moment de l’exécution, notre Fonction Cloud utilise le compte de service mehdi-labs-201811@appspot.gserviceaccount.com. Celui-ci est répertorié en bas de la page de détails de la Fonction Cloud.

Il faut que notre fonction Cloud puisse avoir accès à la facturation d’autres projets afin de désactiver celle-ci. Pour ce faire, il faut qu’elle devienne administrateur de comptes de facturation  ( Billing Account Administrator), ainsi que navigateur de projet (Browser), plus précisément resourcemanager.projects.get permission ( obtenir l’autorisation d’agir en tant que directeur des ressources sur chaque projet à surveiller).

Vous pouvez gérer les autorisations de facturation sur la Google Cloud Platform Console Billing page (page Facturation de la console Google Cloud Platform). Comme indiqué ci-dessous, ajoutez le compte de service d’exécution de la Fonction Cloud en tant que membre et attribuez-lui les privilèges d’administrateur de compte de facturation. ( Billing Account Administrator privileges).

Pour attribuer le rôle de navigateur (Browser role ) au compte de service d’exécution de la Fonction Cloud, vous devez l’ajouter en tant que membre à chaque projet à surveiller via la Google Cloud Platform IAM page (page IAM de Google Cloud Platform) et lui attribuer le rôle de navigateur (Browser role )comme indiqué ci-dessous.

Seules 6 autorisations sont attribuées au rôle de navigateur; son utilisation est donc « compatible » avec le principe de moindre privilège.

N’oubliez pas d’activer le Cloud Billing API

Le code

Vous trouverez ci-dessous le code Python de notre Fonction Cloud. J’espère avoir réussi à le documenter suffisamment afin que plus d’explications ne soient plus nécessaires. Les informations exigées sont fournies ci-dessous. Vous pouvez dès à présent commencer à copier/coller dans l’éditeur en ligne de votre fonction Cloud et démarrer !

J’ai créé des données de test (notifications de budget) que vous pouvez modifier et publier via votre propre rubrique Cloud Pub / Sub. J’ai également écrit un script Bash que vous pouvez modifier et utiliser pour déployer votre Fonction Cloud. Tout cela est disponible dans mon référentiel Github Github repository.

Conclusion

J’ai déployé cette solution il y a 6 semaines. Elle surveille 14 projets. Chaque projet envoie une notification de budget toutes les heures. Pour connaître ces détails j’ai ajouté un horodatage à chaque notification de budget avant de la stocker et de la suivre dans Cloud Firestore (implémenté dans le code ci-dessous). Mes accès sur Cloud API facturation, Cloud Pub / Sub, Cloud Function et Cloud Firestore et le stockage de données dans Cloud Firestore n’ont représenté aucun coût (je surveillais également mon projet Admin). En effet, Cloud Pub/SubCloud Firestore et Cloud Function sont dotés d’un niveau de gratuité (les liens mènent à la documentation sur les prix), comme c’est d’ailleurs le cas pour de nombreux autres services de Google Cloud Platform

Enfin, si vous lisez ces lignes, il y a de fortes chances que vous souhaitez comprendre les détails de vos dépenses Cloud. Vous y parviendrez en exportant vos données de facturation vers exporting your billing data to BigQuery, et en obtenant les informations nécessaires à partir de ces données getting the needed insights from that data.

Amusez-vous bien !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *