Évitez l'accumulation de coûts cloud invisibles en étiquetant vos instances dès leur démarrage.

Identifier les instances anonymes
En passant en revue votre utilisation de Google Cloud Compute Engine, vous pouvez tomber sur des instances ou des disques sans nom, ou pire, dont le nom ne veut rien dire. Ces ressources sont peut-être un pur gaspillage, ou au contraire indispensables à des workloads de production.
Ces instances peuvent dater de plusieurs années, sans que personne dans l'organisation ne dispose d'informations à leur sujet ni des identifiants pour s'y connecter.
Pour éviter ce problème, les entreprises mettent en place des politiques d'étiquetage : chaque instance provisionnée doit comporter un label Name/Owner/Project, etc.
Les labels n'entraînent aucun coût supplémentaire dans Google Cloud Compute Engine.
…cependant, comme les instances sont lancées par des personnes ou via des scripts d'automatisation, ce processus reste sujet aux erreurs.
Pour parer à ces situations, j'ai créé une solution d'étiquetage automatique pour Google Cloud (une version équivalente pour AWS est disponible ici) qui ajoute automatiquement le label created-by aux instances, ainsi que les labels created-by et instance aux disques.
Ainsi, à l'avenir, si quelqu'un découvre une instance ou un disque dont l'usage est inconnu, ces labels permettront de retrouver facilement qui l'a mis en place.
Les labels Google Cloud sont limités à un jeu de caractères spécifique. Le script remplace donc l'arobase (@) de l'adresse e-mail par un underscore ( _) et le point ( .) par un tiret ( -).
Comment fonctionne l'étiquetage automatique ?

Vue d'ensemble du processus d'étiquetage
Une nouvelle machine Compute Engine est créée par un utilisateur ou un compte de service.
- L'appel API est enregistré dans StackDriver ; via un sink StackDriver (aussi appelé Operations Logging), l'événement est transmis à Cloud Pub/Sub.
- Cloud Pub/Sub déclenche une Cloud Function en lui transmettant les informations de l'événement.
- La Cloud Function applique les labels à l'instance ainsi qu'à ses disques.
Comment mettre en place l'étiquetage automatique des instances et des disques
S'il s'agit de votre premier déploiement de fonction, vérifiez que l'API Cloud Build est activée.
1. Créer un compte de service dédié avec le minimum de privilèges
Cette étape est facultative, mais vivement recommandée !
Lorsque vous créez une nouvelle Cloud Function, celle-ci utilise par défaut le compte de service App Engine, doté du rôle Editor à l'échelle du projet.
Le rôle Editor autorise la fonction à modifier l'ensemble des ressources du projet. Pour des raisons de sécurité, mieux vaut lui accorder le moins de permissions possible : en cas d'erreur, la fonction se limitera à un jeu restreint d'autorisations lui permettant uniquement de lister les informations des instances et des disques, et de leur appliquer des labels :
# GCP IAM Permissions required for the function:
compute.disks.get
compute.disks.setLabels
compute.instances.get
compute.instances.setLabels
La création d'un compte de service avec un rôle personnalisé est un peu fastidieuse et requiert plusieurs étapes sur différents écrans. Pour vous faciliter la tâche, voici les commandes gcloud permettant de créer ce compte de service :
# Replace <project-id> with your project id. gcloud iam roles create autolabel_instances --title=autolabel-instances --project <project-id> --description='cloud function service account to label instanes and disks upon creation' --permissions=compute.disks.get,compute.disks.setLabels,compute.instances.get,compute.instances.setLabels --stage=GAgcloud iam service-accounts create autolabel-instancesgcloud projects add-iam-policy-binding <project-id> --member serviceAccount:autolabel-instances@<project-id>.iam.gserviceaccount.com --role projects/<project-id>/roles/autolabel_instancesgcloud projects add-iam-policy-binding <project-id> --member serviceAccount:autolabel-instances@<project-id>.iam.gserviceaccount.com --role roles/logging.logWriter
L'adresse e-mail du nouveau compte de service est autolabel-instances@
2. Rendez-vous sur la page Cloud Functions et cliquez sur CREATE FUNCTION.

a) Donnez un nom à la fonction et choisissez Cloud Pub/Sub comme déclencheur. Dans le champ situé en dessous, cliquez sur CREATE A TOPIC et attribuez un titre au nouveau topic.

b) Si vous avez sauté l'étape de création du compte de service, cliquez sur SAVE puis Next. Sinon, cliquez sur VARIABLES, NETWORKING AND ADVANCED SETTINGS, sélectionnez le compte de service que vous venez de créer, puis cliquez sur SAVE et NEXT.
c) Choisissez Python 3.7 comme runtime de la fonction,

Cliquez ensuite sur Source code et basculez sur ZIP Upload. Vous pouvez télécharger le fichier zip depuis notre dépôt GitHub (qui contient également le code source de la fonction), puis cliquez sur DEPLOY.
3. Rendez-vous dans StackDriver Logging
Dans la barre de recherche, cliquez sur la flèche (à droite) pour basculer en mode filtre avancé, puis collez le contenu suivant :
resource.type="gce_instance"
jsonPayload.event_subtype="compute.instances.insert"
jsonPayload.event_type="GCE_API_CALL"
Cliquez ensuite sur CREATE SINK. Donnez-lui un nom, choisissez Pub/Sub comme service de destination et indiquez le topic Pub/Sub créé à l'étape précédente. Pour finir, cliquez sur Create Sink.

4. Lancez une instance pour vérifier le bon fonctionnement de la fonction.
Sur la page VM instances, la nouvelle instance doit apparaître étiquetée automatiquement.

Page VM instances
Sur la page Disks, les disques de l'instance doivent eux aussi être étiquetés automatiquement.

Page Disks
Remarques
Cette solution n'étiquette que les instances créées après l'installation de la Cloud Function.
Nous avons publié en open source Iris — une solution complète développée par DoiT International pour étiqueter automatiquement les ressources Google Cloud.