Tutoriel : arrêt automatique EC2 des instances Amazon auxquelles il manque les balises requises - AWS Ressources de balisage et éditeur de balises

AWS a déplacé la fonctionnalité de gestion des balises Tag Editor de la AWS Resource Groups console vers la Explorateur de ressources AWS console. Avec Resource Explorer, vous pouvez rechercher et filtrer des ressources, puis gérer les balises de ressources à partir d'une console unique. Pour en savoir plus sur la gestion des balises de ressources dans l'explorateur de ressources, consultez la section Gestion des ressources dans le guide de l'utilisateur de l'explorateur de ressources.

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Tutoriel : arrêt automatique EC2 des instances Amazon auxquelles il manque les balises requises

Au fur et à mesure Comptes AWS que votre pool de AWS ressources et que vous gérez augmente, vous pouvez utiliser des balises pour faciliter la catégorisation de vos ressources. Les balises sont couramment utilisées pour les cas d'utilisation critiques tels que la répartition des coûts et la sécurité. Pour gérer efficacement les AWS ressources, celles-ci doivent être étiquetées de manière cohérente. Souvent, lorsqu'une ressource est provisionnée, elle reçoit toutes les balises appropriées. Cependant, un processus ultérieur peut entraîner une modification des balises qui déroge à la politique de l'entreprise en matière de balises. En surveillant les modifications apportées à vos balises, vous pouvez détecter la dérive des balises et réagir immédiatement. Cela vous donne davantage l'assurance que les processus qui dépendent de la bonne catégorisation de vos ressources produiront les résultats souhaités.

L'exemple suivant montre comment surveiller les modifications de balises sur les EC2 instances Amazon afin de vérifier qu'une instance spécifiée possède toujours les balises requises. Si les balises de l'instance changent et que l'instance ne possède plus les balises requises, une fonction Lambda est invoquée pour arrêter automatiquement l'instance. Pourquoi voudrais-tu faire ça ? Il garantit que toutes les ressources sont étiquetées conformément à la politique de votre entreprise en matière de balises, pour une allocation efficace des coûts ou pour pouvoir faire confiance à la sécurité basée sur le contrôle d'accès basé sur les attributs (ABAC).

Important

Nous vous recommandons vivement d'exécuter ce didacticiel dans un compte hors production où vous ne pouvez pas fermer par inadvertance des instances importantes.

L'exemple de code présenté dans ce didacticiel limite intentionnellement l'impact de ce scénario aux seules instances d'une liste d'instances IDs. Vous devez mettre à jour la liste avec l'instance IDs que vous êtes prêt à arrêter pour le test. Cela permet de s'assurer que vous ne pouvez pas arrêter accidentellement toutes les instances d'une région de votre Compte AWS.

Après les tests, assurez-vous que toutes vos instances sont étiquetées conformément à la stratégie de balisage de votre entreprise. Vous pouvez ensuite supprimer le code qui limite la fonction à l'instance de IDs la liste uniquement.

Cet exemple utilise JavaScript et la version 16.x de Node.js. L'exemple utilise l' Compte AWS ID 123456789012 et le Région AWS US East (Virginie du Nord) (). us-east-1 Remplacez-les par votre propre identifiant de compte de test et votre propre région.

Note

Si votre console utilise une région différente par défaut, assurez-vous de changer de région dans ce didacticiel chaque fois que vous changez de console. L'échec de ce didacticiel est souvent dû au fait que l'instance et la fonction se trouvent dans deux régions différentes.

Si vous utilisez une région différente de la régionus-east-1, assurez-vous de remplacer toutes les références dans les exemples de code suivants par la région que vous avez choisie.

Étape 1. Créer la fonction Lambda

Pour créer la fonction Lambda
  1. Ouvrez la console AWS Lambda de gestion.

  2. Choisissez Créer une fonction, puis sélectionnez Auteur à partir de zéro.

  3. Pour Nom de la fonction, entrez AutoEC2Termination.

  4. Pour Exécution, choisissez Node.js 16.x.

  5. Conservez les valeurs par défaut de tous les autres champs, puis choisissez Create function.

  6. Dans l'onglet Code de la page AutoEC2Termination détaillée, ouvrez le fichier index.js pour afficher son code.

    • Si un onglet contenant le fichier index.js est ouvert, vous pouvez sélectionner la zone d'édition de cet onglet pour modifier son code.

    • Si aucun onglet contenant index.js n'est ouvert, cliquez de nouveau sur le fichier index.js dans le dossier Auto EC2 Terminator dans le volet de navigation. Choisissez ensuite Open.

  7. Dans l'onglet index.js, collez le code suivant dans la boîte de l'éditeur, en remplaçant tout ce qui est déjà présent.

    Remplacez la valeur RegionToMonitor par la région dans laquelle vous souhaitez exécuter cette fonction.

    // Set the following line to specify which Region's instances you want to monitor // Only instances in this Region are succesfully stopped on a match const RegionToMonitor = "us-east-1" // Specify the instance ARNs to check. // This limits the function for safety to avoid the tutorial shutting down all instances in account // The first ARN is a "dummy" that matches the test event you create in Step 3. // Replace the second ARN with one that matches a real instance that you want to monitor and that you can // safely stop const InstanceList = [ "i-0000000aaaaaaaaaa", "i-05db4466d02744f07" ]; // The tag key name and value that marks a "valid" instance. Instances in the previous list that // do NOT have the following tag key and value are stopped by this function const ValidKeyName = "valid-key"; const ValidKeyValue = "valid-value"; // Load and configure the AWS SDK const AWS = require('aws-sdk'); // Set the AWS Region AWS.config.update({region: RegionToMonitor}); // Create EC2 service object. const ec2 = new AWS.EC2({apiVersion: '2016-11-15'}); exports.handler = (event, context, callback) => { // Retrieve the details of the reported event. var detail = event.detail; var tags = detail["tags"]; var service = detail["service"]; var resourceType = detail["resource-type"]; var resource = event.resources[0]; var resourceSplit = resource.split("/"); var instanceId = resourceSplit[resourceSplit.length - 1]; // If this event is not for an EC2 resource, then do nothing. if (!(service === "ec2")) { console.log("Event not for correct service -- no action (", service, ")" ); return; } // If this event is not about an instance, then do nothing. if (!(resourceType === "instance")) { console.log("Event not for correct resource type -- no action (", resourceType, ")" ); return; } // CAUTION - Removing the following 'if' statement causes the function to run against // every EC2 instance in the specified Region in the calling Compte AWS. // If you do this and an instance is not tagged with the approved tag key // and value, this function stops that instance. // If this event is not for the ARN of an instance in our include list, then do nothing. if (InstanceList.indexOf(instanceId)<0) { console.log("Event not for one of the monitored instances -- no action (", resource, ")"); return; } console.log("Tags changed on monitored EC2 instance (",instanceId,")"); // Check attached tags for expected tag key and value pair if ( tags.hasOwnProperty(ValidKeyName) && tags[ValidKeyName] == "valid-value"){ // Required tags ARE present console.log("The instance has the required tag key and value -- no action"); callback(null, "no action"); return; } // Required tags NOT present console.log("This instance is missing the required tag key or value -- attempting to stop the instance"); var params = { InstanceIds: [instanceId], DryRun: true }; // call EC2 to stop the selected instances ec2.stopInstances(params, function(err, data) { if (err && err.code === 'DryRunOperation') { // dryrun succeeded, so proceed with "real" stop operation params.DryRun = false; ec2.stopInstances(params, function(err, data) { if (err) { console.log("Failed to stop instance"); callback(err, "fail"); } else if (data) { console.log("Successfully stopped instance", data.StoppingInstances); callback(null, "Success"); } }); } else { console.log("Dryrun attempt failed"); callback(err); } }); };
  8. Choisissez Déployer pour enregistrer vos modifications et activer la nouvelle version de la fonction.

Cette fonction Lambda vérifie les balises d'une EC2 instance Amazon, comme indiqué par l'événement de changement de balise dans. EventBridge Dans cet exemple, s'il manque la clé de balise requise dans l'instance de l'événement valid-key ou si cette balise ne contient pas la valeurvalid-value, la fonction essaie d'arrêter l'instance. Vous pouvez modifier cette vérification logique ou les exigences relatives aux balises en fonction de vos propres cas d'utilisation spécifiques.

Gardez la fenêtre de la console Lambda ouverte dans votre navigateur.

Étape 2. Configurez les autorisations IAM requises

Avant que la fonction puisse s'exécuter correctement, vous devez lui accorder l'autorisation d'arrêter une EC2 instance. Le rôle AWS fourni lambda_basic_executionn'a pas cette autorisation. Dans ce didacticiel, vous allez modifier la politique d'autorisation IAM par défaut attachée au rôle d'exécution de la fonction nomméAutoEC2Termination-role-uniqueid. L'autorisation supplémentaire minimale requise pour ce didacticiel est deec2:StopInstances.

Pour plus d'informations sur la création de politiques IAM EC2 spécifiques à Amazon, consultez Amazon EC2 : permet de démarrer ou d'arrêter une EC2 instance et de modifier un groupe de sécurité, par programmation et dans la console du guide de l'utilisateur IAM.

Pour créer une politique d'autorisation IAM et l'associer au rôle d'exécution de la fonction Lambda
  1. Dans un autre onglet ou une autre fenêtre du navigateur, ouvrez la page Rôles de la console IAM.

  2. Commencez à saisir le nom du rôle etAutoEC2Termination, lorsqu'il apparaît dans la liste, choisissez-le.

  3. Sur la page Résumé du rôle, choisissez l'onglet Autorisations et choisissez le nom de la politique déjà attachée.

  4. Sur la page Résumé de la politique, choisissez Modifier la politique.

  5. Dans l'onglet Éditeur visuel, choisissez Ajouter des autorisations supplémentaires.

  6. Pour Service, choisissez EC2.

  7. Pour Actions, sélectionnez StopInstances. Vous pouvez saisir du Stop texte dans la barre de recherche, puis choisir le StopInstances moment où elle apparaît.

  8. Pour Ressources, sélectionnez Toutes les ressources, sélectionnez Réviser la politique, puis sélectionnez Enregistrer les modifications.

    Cela crée automatiquement une nouvelle version de la politique et définit cette version comme version par défaut.

    Votre politique finale doit ressembler à l'exemple suivant.

    { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "ec2:StopInstances", "Resource": "*" }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": "logs:CreateLogGroup", "Resource": "arn:aws:logs:us-east-1:123456789012:*" }, { "Sid": "VisualEditor2", "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:us-east-1:123456789012:log-group:/aws/lambda/AutoEC2Termination:*" } ] }

Étape 3. Effectuez un test préliminaire de votre fonction Lambda

Au cours de cette étape, vous soumettez un événement de test à votre fonction. La fonctionnalité de test Lambda fonctionne en soumettant un événement de test fourni manuellement. La fonction traite l'événement de test comme s'il provenait de EventBridge. Vous pouvez définir plusieurs événements de test avec des valeurs différentes pour exercer toutes les différentes parties de votre code. Au cours de cette étape, vous soumettez un événement de test qui indique que les balises d'une EC2 instance Amazon ont changé et que les nouvelles balises n'incluent pas la clé et la valeur de balise requises.

Pour tester votre fonction Lambda
  1. Retournez à la fenêtre ou à l'onglet contenant la console Lambda et ouvrez l'onglet Test pour votre fonction de EC2 terminaison automatique.

  2. Choisissez Créer un nouvel événement.

  3. Dans Event name (Nom de l’événement), saisissez SampleBadTagChangeEvent.

  4. Dans le JSON de l'événement, remplacez le texte par l'exemple d'événement illustré dans l'exemple de texte suivant. Il n'est pas nécessaire de modifier les comptes, la région ou l'ID d'instance pour que cet événement de test fonctionne correctement.

    { "version": "0", "id": "bddcf1d6-0251-35a1-aab0-adc1fb47c11c", "detail-type": "Tag Change on Resource", "source": "aws.tag", "account": "123456789012", "time": "2018-09-18T20:41:38Z", "region": "us-east-1", "resources": [ "arn:aws:ec2:us-east-1:123456789012:instance/i-0000000aaaaaaaaaa" ], "detail": { "changed-tag-keys": [ "valid-key" ], "tags": { "valid-key": "NOT-valid-value" }, "service": "ec2", "resource-type": "instance", "version": 3 } }
  5. Choisissez Save (Enregistrer), puis Test (Tester).

    Le test semble échouer, mais ce n'est pas grave.

    L'erreur suivante devrait s'afficher dans l'onglet Résultats de l'exécution sous Réponse.

    { "errorType": "InvalidInstanceID.NotFound", "errorMessage": "The instance ID 'i-0000000aaaaaaaaaa' does not exist", ... }

    L'erreur se produit parce que l'instance spécifiée dans l'événement de test n'existe pas.

    Les informations figurant dans l'onglet Résultats de l'exécution, dans la section Function Logs, montrent que votre fonction Lambda a réussi à arrêter une EC2 instance. Cependant, cela a échoué car le code tente initialement une DryRunopération pour arrêter l'instance, ce qui indique que l'ID d'instance n'était pas valide.

    START RequestId: 390c1f8d-0d9b-4b44-b087-8de64479ab44 Version: $LATEST 2022-11-30T20:17:30.427Z 390c1f8d-0d9b-4b44-b087-8de64479ab44 INFO Tags changed on monitored EC2 instance ( i-0000000aaaaaaaaaa ) 2022-11-30T20:17:30.427Z 390c1f8d-0d9b-4b44-b087-8de64479ab44 INFO This instance is missing the required tag key or value -- attempting to stop the instance 2022-11-30T20:17:31.206Z 390c1f8d-0d9b-4b44-b087-8de64479ab44 INFO Dryrun attempt failed 2022-11-30T20:17:31.207Z 390c1f8d-0d9b-4b44-b087-8de64479ab44 ERROR Invoke Error {"errorType":"InvalidInstanceID.NotFound","errorMessage":"The instance ID 'i-0000000aaaaaaaaaa' does not exist","code":"InvalidInstanceID.NotFound","message":"The instance ID 'i-0000000aaaaaaaaaa' does not exist","time":"2022-11-30T20:17:31.205Z","requestId":"a5192c3b-142d-4cec-bdbc-685a9b7c7abf","statusCode":400,"retryable":false,"retryDelay":36.87870631147607,"stack":["InvalidInstanceID.NotFound: The instance ID 'i-0000000aaaaaaaaaa' does not exist"," at Request.extractError (/var/runtime/node_modules/aws-sdk/lib/services/ec2.js:50:35)"," at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:106:20)"," at Request.emit (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:78:10)"," at Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:686:14)"," at Request.transition (/var/runtime/node_modules/aws-sdk/lib/request.js:22:10)"," at AcceptorStateMachine.runTo (/var/runtime/node_modules/aws-sdk/lib/state_machine.js:14:12)"," at /var/runtime/node_modules/aws-sdk/lib/state_machine.js:26:10"," at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:38:9)"," at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:688:12)"," at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:116:18)"]} END RequestId: 390c1f8d-0d9b-4b44-b087-8de64479ab44
  6. Pour prouver que le code n'essaie pas d'arrêter l'instance lorsque la bonne balise est utilisée, vous pouvez créer et soumettre un autre événement de test.

    Choisissez l'onglet Test au-dessus de la source du code. La console affiche votre événement de SampleBadTagChangeEventtest existant.

  7. Choisissez Créer un nouvel événement.

  8. Pour Nom de l'événement, tapez SampleGoodTagChangeEvent.

  9. À la ligne 17, supprimez NOT- pour remplacer la valeur parvalid-value.

  10. En haut de la fenêtre de l'événement de test, choisissez Enregistrer, puis sélectionnez Test.

    La sortie affiche ce qui suit, qui montre que la fonction reconnaît la balise valide et ne tente pas d'arrêter l'instance.

    START RequestId: 53631a49-2b54-42fe-bf61-85b9e91e86c4 Version: $LATEST 2022-12-01T23:24:12.244Z 53631a49-2b54-42fe-bf61-85b9e91e86c4 INFO Tags changed on monitored EC2 instance ( i-0000000aaaaaaaaaa ) 2022-12-01T23:24:12.244Z 53631a49-2b54-42fe-bf61-85b9e91e86c4 INFO The instance has the required tag key and value -- no action END RequestId: 53631a49-2b54-42fe-bf61-85b9e91e86c4

    Gardez la console Lambda ouverte dans votre navigateur.

Étape 4 : Créez la EventBridge règle qui lance la fonction

Vous pouvez désormais créer une EventBridge règle correspondant à l'événement et pointant vers votre fonction Lambda.

Pour créer la EventBridge règle
  1. Dans un autre onglet ou une autre fenêtre du navigateur, ouvrez la EventBridge console sur la page Créer une règle.

  2. Dans Nom, entrezec2-instance-rule, puis choisissez Next.

  3. Faites défiler la page jusqu'à Méthode de création et choisissez Modèle personnalisé (éditeur JSON).

  4. Dans la zone d'édition, collez le texte du modèle suivant, puis choisissez Next.

    { "source": [ "aws.tag" ], "detail-type": [ "Tag Change on Resource" ], "detail": { "service": [ "ec2" ], "resource-type": [ "instance" ] } }

    Cette règle fait correspondre les Tag Change on Resource événements des EC2 instances Amazon et invoque ce que vous spécifiez comme cible à l'étape suivante.

  5. Ajoutez ensuite votre fonction Lambda comme cible. Dans la zone Cible 1, sous Sélectionnez une cible, choisissez la fonction Lambda.

  6. Sous Fonction, sélectionnez la fonction de EC2terminaison automatique que vous avez créée précédemment, puis cliquez sur Suivant.

  7. Sur la page Configurer les balises, choisissez Next. Ensuite, sur la page Réviser et créer, choisissez Créer une règle. Cela donne également automatiquement l'autorisation EventBridge d'invoquer la fonction Lambda spécifiée.

Étape 5. Testez la solution complète

Vous pouvez tester votre résultat final en créant une EC2 instance et en observant ce qui se passe lorsque vous modifiez ses balises.

Pour tester la solution de surveillance avec une instance réelle
  1. Ouvrez la EC2console Amazon sur la page Instances.

  2. Créez une EC2 instance Amazon. Avant de le lancer, attachez une étiquette avec la clé valid-key et la valeurvalid-value. Pour plus d'informations sur la création et le lancement d'une instance, consultez Étape 1 : Lancer une instance dans le guide de EC2 l'utilisateur Amazon. Dans la procédure de lancement d'une instance, à l'étape 3, où vous entrez la balise Name, choisissez également Ajouter des balises supplémentaires, choisissez Ajouter une balise, puis entrez la clé valid-key et la valeur devalid-value. Vous pouvez continuer sans paire de clés si cette instance est uniquement destinée aux besoins de ce didacticiel et si vous prévoyez de supprimer cette instance une fois celle-ci terminée. Revenez à ce didacticiel à la fin de l'étape 1 ; vous n'avez pas besoin de suivre l'étape 2 : Se connecter à votre instance.

  3. InstanceIdCopiez-le depuis la console.

  4. Passez de la EC2 console Amazon à la console Lambda. Choisissez votre fonction de EC2terminaison automatique, cliquez sur l'onglet Code, puis sur l'onglet index.js pour modifier votre code.

  5. Modifiez la deuxième entrée du en InstanceList collant la valeur que vous avez copiée depuis la EC2 console Amazon. Assurez-vous que la RegionToMonitor valeur correspond à la région qui contient l'instance que vous avez collée.

  6. Choisissez Déployer pour activer vos modifications. La fonction est maintenant prête à être activée en modifiant les balises de cette instance dans la région spécifiée.

  7. Passez de la console Lambda à la console Amazon EC2 .

  8. Modifiez les balises attachées à l'instance en supprimant la balise valid-key ou en modifiant la valeur de cette clé.

    Note

    Pour savoir comment modifier les balises sur une EC2 instance Amazon en cours d'exécution, consultez la section Ajouter et supprimer des balises sur une ressource individuelle dans le guide de EC2 l'utilisateur Amazon.

  9. Patientez quelques secondes, puis actualisez la console. L'instance doit changer son état d'instance en Stopping, puis en Stopped.

  10. Passez de la EC2 console Amazon à la console Lambda avec votre fonction, puis choisissez l'onglet Monitor.

  11. Choisissez l'onglet Journaux, puis dans le tableau des appels récents, sélectionnez l'entrée la plus récente de la LogStreamcolonne.

    La CloudWatch console Amazon s'ouvre sur la page Log events pour le dernier appel de votre fonction Lambda. La dernière entrée doit ressembler à l'exemple suivant.

    2022-11-30T12:03:57.544-08:00 START RequestId: b5befd18-2c41-43c8-a320-3a4b2317cdac Version: $LATEST 2022-11-30T12:03:57.548-08:00 2022-11-30T20:03:57.548Z b5befd18-2c41-43c8-a320-3a4b2317cdac INFO Tags changed on monitored EC2 instance ( arn:aws:ec2:us-west-2:123456789012:instance/i-1234567890abcdef0 ) 2022-11-30T12:03:57.548-08:00 2022-11-30T20:03:57.548Z b5befd18-2c41-43c8-a320-3a4b2317cdac INFO This instance is missing the required tag key or value -- attempting to stop the instance 2022-11-30T12:03:58.488-08:00 2022-11-30T20:03:58.488Z b5befd18-2c41-43c8-a320-3a4b2317cdac INFO Successfully stopped instance [ { CurrentState: { Code: 64, Name: 'stopping' }, InstanceId: 'i-1234567890abcdef0', PreviousState: { Code: 16, Name: 'running' } } ] 2022-11-30T12:03:58.546-08:00 END RequestId: b5befd18-2c41-43c8-a320-3a4b2317cdac

Résumé du didacticiel

Ce didacticiel explique comment créer une EventBridge règle adaptée à un changement de balise lors d'un événement de ressource pour les EC2 instances Amazon. La règle pointait vers une fonction Lambda qui arrête automatiquement l'instance si elle ne possède pas la balise requise.

La EventBridge prise en charge par Amazon des modifications de balises sur les AWS ressources ouvre la voie à une automatisation axée sur les événements pour de nombreuses personnes. Services AWS La combinaison de cette fonctionnalité vous AWS Lambda fournit des outils pour créer des solutions sans serveur qui accèdent aux AWS ressources en toute sécurité, évoluent à la demande et sont rentables.

Parmi les autres cas d'utilisation possibles de l' tag-change-on-resource EventBridge événement, citons :

  • Lancez un avertissement si quelqu'un accède à votre ressource à partir d'une adresse IP inhabituelle : utilisez une balise pour enregistrer l'adresse IP source de chaque visiteur qui accède à votre ressource. Les modifications apportées à la balise génèrent un CloudWatch événement. Vous pouvez utiliser cet événement pour comparer l'adresse IP source à une liste d'adresses IP valides et activer un e-mail d'avertissement si l'adresse IP source n'est pas valide.

  • Vérifiez si des modifications sont apportées à votre contrôle d'accès basé sur les balises pour une ressource : si vous avez configuré l'accès à une ressource à l'aide du contrôle d'accès basé sur les attributs (balises) (ABAC), vous pouvez utiliser les EventBridge événements générés par toute modification apportée à la balise pour demander à votre équipe de sécurité de procéder à un audit.