Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Tagger automatiquement les instances et volumes AWS EC2

By Avi KeinanMar 17, 20214 min read

Cette page est également disponible en English, Deutsch, Español, Italiano, 日本語 et Português.

Allouer vos dépenses AWS en taggant automatiquement vos workloads EC2

Les instances *John Doe*

En passant en revue votre utilisation d'AWS EC2, vous pouvez tomber sur des instances ou des volumes sans nom, ou pire encore, dont le nom n'est pas explicite. Ces ressources peuvent représenter un pur gaspillage, ou au contraire être critiques pour des workloads de production.

Instance m3.2xlarge *DO NOT DELETE* dans us-east-1 à 388 $/mois

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 de tagging : chaque instance provisionnée doit comporter un tag Name/Owner/Project/etc.

Le tagging des instances et volumes EC2 n'entraîne aucun coût supplémentaire…

…cependant, comme les utilisateurs lancent des instances et écrivent des scripts d'automatisation qui en lancent à leur tour, ce processus reste source d'erreurs.

Pour pallier ces situations, j'ai écrit une solution pour AWS (et une solution similaire pour Google Cloud) qui tagge automatiquement les instances avec le tag Owner, et les volumes avec les tags Owner et AttachedInstance.

Ainsi, à l'avenir, si quelqu'un tombe sur une instance ou un volume dont l'utilité reste floue, ces tags permettront d'identifier rapidement la personne qui les a configurés.

**Comment fonctionne le tagging automatique ?**

  1. L'utilisateur crée une instance AWS EC2.
  2. AWS CloudTrail suit les appels d'API et déclenche AWS EventBridge.
  3. AWS EventBridge déclenche la fonction Lambda.
  4. AWS Lambda tagge l'instance et ses volumes.

Une fois la fonction AWS Lambda déclenchée avec les informations de lancement de l'instance, elle tagge celle-ci avec le tag Owner, dont la valeur correspondra à l'un des éléments suivants :

  1. Utilisateur IAM
  2. Assume Role (par exemple AutoScaling Role, utilisateur SSO, etc.)
  3. Utilisateur Root

Page des instances, tag en bas

Lambda passe ensuite à l'étape suivante : taguer tous les volumes de l'instance avec les tags *Owner* et *AttachedInstance*. Le tag *Owner* reprendra les mêmes informations que celui de l'instance, et le tag *AttachedInstance* contiendra l'instance-id ainsi que le nom de l'instance, lorsqu'il existe.

Page des volumes, tags en bas

Mise en œuvre

  1. Rendez-vous sur la page CloudTrail et cliquez sur Create trail.

2. Donnez un nom au trail.

3. Faites défiler vers le bas et indiquez un nom pour le bucket S3 de CloudTrail. Cliquez ensuite sur Create.

4. Accédez au dashboard Lambda, puis cliquez sur Create function.

5. Donnez un nom à la fonction, sélectionnez Python 3.8 dans la liste déroulante Runtime, puis cliquez sur Create Function.

6. Collez le code du dépôt Github, puis cliquez sur Save.

7. Faites défiler jusqu'à l'encadré Basic settings et cliquez sur le bouton Edit.

Augmentez ensuite le timeout de la fonction Lambda à 1 minute.

Cliquez enfin sur le bouton Save.

8. Remontez en haut et cliquez sur Permissions, puis sur le nom du rôle.

9. Cliquez sur le bouton Add inline policy.

10. Cliquez sur le bouton JSON, collez la politique IAM suivante, puis cliquez sur Review policy.

{
    "Version": "2012-10-17",
    "Statement": [\
        {\
            "Sid": "VisualEditor0",\
            "Effect": "Allow",\
            "Action": "ec2:CreateTags",\
            "Resource": [\
                "arn:aws:ec2:*:*:instance/*",\
                "arn:aws:ec2:*:*:volume/*"\
            ]\
        },\
        {\
            "Sid": "VisualEditor1",\
            "Effect": "Allow",\
            "Action": [\
                "ec2:DescribeInstances",\
                "ec2:DescribeVolumes"\
            ],\
            "Resource": "*"\
        }\
    ]
}

Cette politique autorise la fonction Lambda à identifier les volumes de l'instance, et à tagger l'instance ainsi que ses volumes.

11. Donnez un nom à la politique et cliquez sur Create policy.

12. Revenez à l'onglet Lambda dans votre navigateur et cliquez sur Add trigger.

13. Cliquez sur Select a trigger, recherchez EventBridge, puis cliquez sur Create a new rule dans la liste déroulante Rule.

Donnez un nom et une description à votre règle.

Sous Rule type, sélectionnez le bouton radio Event pattern.

Dans la première liste déroulante, choisissez EC2 ; dans la seconde, sélectionnez AWS API call via CloudTrail.

14. Faites défiler vers le bas, cochez la case Operation, puis saisissez RunInstances dans le champ Operation. Cliquez ensuite sur le bouton Add pour créer le déclencheur d'événement.

15. Enfin, déployez une nouvelle instance de test pour vérifier que tout fonctionne.

Au bout de quelques secondes, la fonction Lambda mise en place taggera automatiquement l'instance et son ou ses volumes.

Rafraîchissez la page et vérifiez les tags de l'instance.

À noter

  1. Cette solution ne taggera que les instances créées après l'installation de la fonction Lambda.
  2. Si vous venez d'activer le trail CloudTrail, comptez jusqu'à une heure avant qu'EventBridge ne commence à invoquer la fonction.
  3. La taille de la réponse CloudTrail est limitée à 500 Ko. Si vous lancez un grand nombre d'instances en un seul appel d'API, la fonction Lambda ne pourra pas toutes les tagger.
  4. AWS EventBridge est une ressource régionale. Si vous travaillez sur plusieurs régions, vous devrez déployer la solution dans chacune d'elles.