Exemples de notifications de budgets automatisées

Si vous êtes soucieux des coûts et avez besoin de contrôler votre environnement selon votre budget disponible, vous pouvez utiliser les notifications de budget automatisées pour automatiser vos actions budgétaires.

Les notifications de budget se servent des notifications Cloud Pub/Sub pour fournir une mise à jour en temps réel de l'état du budget, exploitant l'évolutivité, la flexibilité et la fiabilité des intergiciels de messagerie d'entreprise au profit du cloud.

Cette page contient des exemples et des instructions détaillées pour utiliser les notifications de budget avec Cloud Functions en vue d'automatiser la gestion des coûts.

Configurer les notifications de budget

La première étape consiste à activer une notification Cloud Pub/Sub pour un budget. Cette étape est décrite dans Gérer les notifications.

Une fois que vous avez activé les notifications de budget, veillez à prendre note des informations suivantes :

  • Sujet Pub/Sub : il s'agit du point de terminaison des notifications configuré pour le budget.
  • ID de budget : il s'agit d'un ID unique pour le budget, qui est indiqué dans toutes les notifications. Vous pouvez localiser l'ID du budget depuis le budget sous Manage notifications (Gérer les notifications). L'ID s'affiche lorsque vous sélectionnez Connect a Pub/Sub topic to this budget (Associer un sujet Pub/Sub à ce budget).

Gérer les notifications de facturation dans la console GCP

Écouter les notifications

L'étape suivante consiste à écouter les notifications en vous abonnant au sujet Pub/Sub. Si le sujet n'a aucun abonné, Pub/Sub abandonnera les messages publiés et vous ne pourrez pas les récupérer plus tard.

Bien qu'il existe de nombreuses façons de créer un abonnement associé au sujet, nous utiliserons dans ces exemples des déclencheurs de fonctions Cloud Functions.

Créer une fonction Cloud Functions

Pour créer une fonction Cloud Functions :

  1. Accédez à la page Cloud Functions de la console Google Cloud Platform. Créez une fonction et donnez-lui un nom en relation avec le budget.
  2. Sous Trigger (Déclencheur), sélectionnez Cloud Pub/Sub topic (Sujet Cloud Pub/Sub).
  3. Sélectionnez le sujet que vous avez configuré dans le budget.
  4. Fournissez le code source et les dépendances que la fonction doit exécuter.

Créer une fonction dans la console GCP

Décrire la fonction Cloud Functions

Pour indiquer à la fonction ce qu'elle doit faire avec la notification reçue, vous pouvez soit écrire le code à l'aide de l'éditeur intégré, soit importer un fichier. Pour plus d'informations sur les notifications que le code recevra, consultez la section Format des notifications.

Par exemple, une fonction peut enregistrer les notifications, les attributs et les données Pub/Sub reçus lorsqu'elle est déclenchée par une notification de budget. Pour en savoir plus, consultez la section Déclencheurs Google Cloud Pub/Sub.

Afficher les événements de la fonction Cloud Functions

Après avoir enregistré la fonction, vous pouvez cliquer sur VIEW LOGS (AFFICHER LES JOURNAUX) pour afficher les notifications de budget enregistrées. Les journaux des appels de fonctions s'affichent alors.

Afficher les événements de la fonction Cloud Functions dans la console GCP

Envoyer des notifications à Slack

L'e-mail n'est pas toujours le meilleur moyen de rester informé des coûts associés à votre utilisation du cloud, surtout si votre budget est critique et sensible au facteur temps. Avec les notifications, vous pouvez transférer vos messages budgétaires vers d'autres plates-formes.

Dans cet exemple, nous décrivons comment transférer les notifications de budget vers Slack. Ainsi, chaque fois que Cloud Billing publie une notification de budget, une fonction Cloud Functions publie un message, à l'aide d'un bot, sur un canal Slack de l'espace de travail du bot.

Configurer un canal Slack et des autorisations

La première étape consiste à créer un espace de travail Slack et les jetons de l'utilisateur bot utilisés pour appeler l'API Slack. Les jetons d'API peuvent être gérés à l'adresse https://api.slack.com/apps. Pour obtenir des instructions détaillées, consultez la page relative aux utilisateurs bot sur le site de Slack.

Configurer les notifications Slack

Écrire une fonction Cloud Functions

  1. Créez une fonction en suivant les étapes décrites dans Créer une fonction Cloud Functions.

  2. Ajoutez des dépendances :

    Python

    Ajoutez slackclient==1.3.0 au fichier requirements.txt de votre fonction :
    slackclient==1.3.0

  3. Écrivez le code permettant de publier des notifications de budget sur un canal de discussion Slack à l'aide de l'API Slack.

  4. Définissez les paramètres postMessage suivants de l'API Slack dans le code :

    • Jeton d'accès OAuth de l'utilisateur bot
    • Canal
    • Text

Exemple :

Python

from slackclient import SlackClient

# See https://api.slack.com/docs/token-types#bot for more info
BOT_ACCESS_TOKEN = 'xxxx-111111111111-abcdefghidklmnopq'

CHANNEL_ID = 'C0XXXXXX'

slack_client = SlackClient(BOT_ACCESS_TOKEN)

def notify_slack(data, context):
    pubsub_message = data

    notification_attrs = json.dumps(pubsub_message['attributes'])
    notification_data = base64.b64decode(data['data']).decode('utf-8')
    budget_notification_text = f'{notification_attrs}, {notification_data}'

    slack_client.api_call(
      'chat.postMessage',
      channel=CHANNEL_ID,
      text=budget_notification_text)

Plafonner (désactiver) la facturation pour mettre fin à toute utilisation

Cet exemple vous montre comment plafonner les coûts et comment mettre fin à toute utilisation d'un projet Google Cloud en désactivant la facturation. Ainsi, tous les services Google Cloud arrêteront les services payants du projet.

Vous pouvez vouloir plafonner les coûts si l'on vous impose une limite stricte sur ce que vous pouvez dépenser sur Google Cloud Platform. C'est typiquement le cas des étudiants, chercheurs ou développeurs travaillant dans des environnements de bac à sable. Dans de telles circonstances, il est important de bloquer les dépenses, voire d'arrêter tous les services Google Cloud Platform et leur utilisation dès lors que le seuil budgétaire est atteint.

Dans notre exemple, nous utilisons acme-backend-dev comme projet de non-production, sur lequel la facturation peut être désactivée en toute sécurité.

Configurer le plafond budgétaire dans la console GCP

Avant de commencer, vous devez configurer un budget afin d'assurer un suivi des coûts du projet, et activer les notifications de budget.

Gérer les alertes de facturation dans la console GCP

Configurer les autorisations du compte de service

La fonction Cloud Functions est exécutée en tant que compte de service automatiquement créé. Pour que le service puisse désactiver la facturation, vous devez lui accorder des autorisations d'administrateur de la facturation.

Pour identifier le bon compte de service, consultez les informations de la fonction. Le compte de service est répertorié au bas de la page.

Identifier le compte de service dans la console GCP

Vous pouvez gérer les autorisations de l'administrateur de la facturation sur la page Facturation de la console Google Cloud Platform.

Pour accorder des privilèges de Billing Account Administrator (Administrateur de compte de facturation) au compte de service, sélectionnez le nom du compte de service.

Gérer les autorisations dans la console GCP

Écrire une fonction Cloud Functions

Vous devez désormais configurer la fonction pour qu'elle appelle l'API Cloud Billing. Cela permet à la fonction de désactiver la facturation pour le projet acme-backend-dev utilisé dans cet exemple.

  1. Créez une fonction en suivant les étapes décrites dans Créer une fonction Cloud Functions.

  2. Ajoutez les dépendances suivantes :

    Python

    Ajoutez oauth2client==4.1.3 et google-api-python-client==1.7.4 au fichier requirements.txt de votre fonction :
    oauth2client==4.1.3
    google-api-python-client==1.7.4
    

  3. Écrivez du code permettant de désactiver la facturation sur le projet en supprimant le projet du compte de facturation.

  4. Définissez le paramètre PROJECT_NAME. Il s'agit du projet sur lequel vous souhaitez plafonner (désactiver) la facturation.

Python

import base64
import json
import os
from googleapiclient import discovery
from oauth2client.client import GoogleCredentials

PROJECT_ID = os.getenv('GCP_PROJECT')
PROJECT_NAME = f'projects/{PROJECT_ID}'
def stop_billing(data, context):
    pubsub_data = base64.b64decode(data['data']).decode('utf-8')
    pubsub_json = json.loads(pubsub_data)
    cost_amount = pubsub_json['costAmount']
    budget_amount = pubsub_json['budgetAmount']
    if cost_amount <= budget_amount:
        print(f'No action necessary. (Current cost: {cost_amount})')
        return

    billing = discovery.build(
        'cloudbilling',
        'v1',
        cache_discovery=False,
        credentials=GoogleCredentials.get_application_default()
    )

    projects = billing.projects()

    if __is_billing_enabled(PROJECT_NAME, projects):
        print(__disable_billing_for_project(PROJECT_NAME, projects))
    else:
        print('Billing already disabled')

def __is_billing_enabled(project_name, projects):
    """
    Determine whether billing is enabled for a project
    @param {string} project_name Name of project to check if billing is enabled
    @return {bool} Whether project has billing enabled or not
    """
    res = projects.getBillingInfo(name=project_name).execute()
    return res['billingEnabled']

def __disable_billing_for_project(project_name, projects):
    """
    Disable billing for a project by removing its billing account
    @param {string} project_name Name of project disable billing on
    @return {string} Text containing response from disabling billing
    """
    body = {'billingAccountName': ''}  # Disable billing
    res = projects.updateBillingInfo(name=project_name, body=body).execute()
    print(f'Billing disabled: {json.dumps(res)}')

ZONE = 'us-west1-b'

def limit_use(data, context):
    pubsub_data = base64.b64decode(data['data']).decode('utf-8')
    pubsub_json = json.loads(pubsub_data)
    cost_amount = pubsub_json['costAmount']
    budget_amount = pubsub_json['budgetAmount']
    if cost_amount <= budget_amount:
        print(f'No action necessary. (Current cost: {cost_amount})')
        return

    compute = discovery.build(
        'compute',
        'v1',
        cache_discovery=False,
        credentials=GoogleCredentials.get_application_default()
    )
    instances = compute.instances()

    instance_names = __list_running_instances(PROJECT_ID, ZONE, instances)
    __stop_instances(PROJECT_ID, ZONE, instance_names, instances)

def __list_running_instances(project_id, zone, instances):
    """
    @param {string} project_id ID of project that contains instances to stop
    @param {string} zone Zone that contains instances to stop
    @return {Promise} Array of names of running instances
    """
    res = instances.list(project=project_id, zone=zone).execute()

    items = res['items']
    running_names = [i['name'] for i in items if i['status'] == 'RUNNING']
    return running_names

def __stop_instances(project_id, zone, instance_names, instances):
    """
    @param {string} project_id ID of project that contains instances to stop
    @param {string} zone Zone that contains instances to stop
    @param {Array} instance_names Names of instance to stop
    @return {Promise} Response from stopping instances
    """
    if not len(instance_names):
        print('No running instances were found.')
        return

    for name in instance_names:
        instances.stop(
          project=project_id,
          zone=zone,
          instance=name).execute()
        print(f'Instance stopped successfully: {name}')

Valider la désactivation de la facturation

Lorsque la fonction est déclenchée, vous pouvez valider que la fonction a produit le résultat escompté. Le projet ne sera plus visible sous le compte de facturation et les ressources du projet seront désactivées.

Valider la désactivation de la facturation

Vous pouvez réactiver manuellement la facturation pour votre projet dans la console GCP.

Contrôler l'utilisation de manière sélective

Le plafonnement (la désactivation de la facturation), tel qu'il est décrit dans l'exemple précédent, est binaire et final. Le projet est soit activé, soit désactivé. Lorsqu'il est désactivé, tous les services sont arrêtés et toutes les ressources finissent par être supprimées.

Si vous souhaitez obtenir une réponse plus nuancée, vous pouvez contrôler les ressources de manière sélective. Par exemple, si vous souhaitez arrêter certaines ressources Compute mais garder le Storage intact, vous pouvez contrôler l'utilisation de manière sélective. Cela réduira votre coût horaire sans désactiver complètement votre environnement.

Vous pouvez écrire des règles aussi nuancées que vous le souhaitez. Cependant, dans notre exemple, le projet effectue des recherches sur plusieurs machines virtuelles de Compute et stocke les résultats dans Cloud Storage. Cet exemple de fonction Cloud Functions arrêtera toutes les instances de Compute, mais n'aura aucune incidence sur les résultats stockés une fois le budget dépassé.

Configurer les autorisations du compte de service

  1. La fonction Cloud Functions est exécutée en tant que compte de service automatiquement créé. Pour contrôler l'utilisation, vous devez accorder au compte de service des autorisations sur tous les services du projet dont il aura besoin pour apporter des modifications.
  2. Pour identifier le bon compte de service, consultez les informations de la fonction. Le compte de service est répertorié au bas de la page.
  3. Accédez à la page IAM de la console GCP pour définir les autorisations adéquates.
     
    Gérer les alertes de facturation dans la console GCP

Écrire une fonction Cloud Functions

  1. Créez une fonction en suivant les étapes décrites dans Créer une fonction Cloud Functions.

  2. Assurez-vous que vous avez ajouté les dépendances décrites dans Plafonner (désactiver) la facturation pour mettre fin à toute utilisation.

  3. Écrivez du code permettant d'arrêter les ressources du projet.

  4. Définissez le paramètre PROJECT_NAME. Il s'agit du projet que vous souhaitez configurer pour le plafonnement.

Python

import base64
import json
from googleapiclient import discovery
from oauth2client.client import GoogleCredentials

PROJECT_ID = os.getenv('GCP_PROJECT')
PROJECT_NAME = f'projects/{PROJECT_ID}'

Valider la désactivation de la facturation

Vous pouvez valider l'exécution réussie de la fonction en vérifiant que les machines virtuelles de Compute ont été arrêtées dans la console GCP.

Cette page vous a-t-elle été utile ? Évaluez-la :