Didacticiel : configurer un hook de cycle de vie qui appelle une fonction Lambda - Amazon EC2 Auto Scaling

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.

Didacticiel : configurer un hook de cycle de vie qui appelle une fonction Lambda

Dans cet exercice, vous allez créer une EventBridge règle Amazon qui inclut un modèle de filtre qui, lorsqu'il est mis en correspondance, invoque une AWS Lambda fonction en tant que cible de la règle. Nous fournissons le modèle de filtre et l'exemple de code de fonction à utiliser.

Si tout est correctement configuré, à la fin de ce didacticiel, la fonction Lambda exécutera une action personnalisée lors du lancement des instances. L'action personnalisée enregistre simplement l'événement dans le flux de CloudWatch log Logs associé à la fonction Lambda.

La fonction Lambda procède également à un rappel pour laisser le cycle de vie de l'instance se poursuivre si cette action est réussie, mais laisse l'instance abandonner le lancement et se résilier si l'action échoue.

L'illustration suivante résume le flux d'un événement de scale-out lorsque vous utilisez une fonction Lambda pour effectuer une action personnalisée. Après le lancement d'une instance, le cycle de vie de l'instance est suspendu jusqu'à ce que le cycle de vie soit terminé, soit en expirant, soit en recevant un signal indiquant à Amazon EC2 Auto Scaling de continuer.

Le flux d'un événement de scale-out lorsque vous utilisez une fonction Lambda pour effectuer une action personnalisée.

Prérequis

Avant d'entamer ce didacticiel, si vous n'avez pas de groupe Auto Scaling, créez-en un. Pour créer un groupe Auto Scaling, ouvrez la page Groupes Auto Scaling de la console Amazon EC2 et choisissez Créer un groupe Auto Scaling.

Étape 1 : Créer un rôle IAM doté des autorisations nécessaires pour utiliser des actions de cycle de vie

Avant de créer une fonction Lambda, vous devez créer un rôle d'exécution et une politique d'autorisations pour permettre à Lambda d'utiliser des hooks de cycle de vie.

Pour créer la politique
  1. Ouvrez la page Policies (Politiques) de la console IAM et sélectionnez Create policy (Créer une politique).

  2. Sélectionnez l’onglet JSON.

  3. Dans la zone Policy Document (Document relatif à la politique), collez le document suivant, en remplaçant le texte en italique par votre numéro de compte et le nom de votre groupe Auto Scaling.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "autoscaling:CompleteLifecycleAction" ], "Resource": "arn:aws:autoscaling:*:123456789012:autoScalingGroup:*:autoScalingGroupName/my-asg" } ] }
  4. Choisissez Suivant.

  5. Pour Policy name (Nom de la politique), saisissez LogAutoScalingEvent-policy. Sélectionnez Create policy (Créer une politique).

Lorsque vous avez créé la politique, vous pouvez créer un rôle qui l'utilise.

Pour créer le rôle
  1. Dans le panneau de navigation de gauche, sélectionnez Roles (Rôles).

  2. Sélectionnez Create role (Créer un rôle).

  3. Pour Select trusted entity (Sélectionner une entité de confiance), choisissez service AWS .

  4. Pour votre cas d'utilisation, sélectionnez Lambda, puis Next (Suivant).

  5. Sous Ajouter des autorisations, choisissez la politique que vous avez créée (LogAutoScalingEvent-policy) et le nom AWSLambdaBasicExecutionRolede la politique. Ensuite, choisissez Suivant.

    Note

    La AWSLambdaBasicExecutionRolepolitique dispose des autorisations dont la fonction a besoin pour écrire des CloudWatch journaux dans Logs.

  6. Sur la page Name, review, and create (Nommer, vérifier et créer), pour Role name (Nom du rôle), saisissez LogAutoScalingEvent-role, puis choisissez Create role (Créer un rôle).

Étape 2 : créer une fonction Lambda

Créez une fonction Lambda qui servira de cible pour les événements. L'exemple de fonction Lambda, écrit dans Node.js, est invoqué EventBridge lorsqu'un événement correspondant est émis par Amazon EC2 Auto Scaling.

Pour créer une fonction Lambda
  1. Ouvrez la page Functions (Fonctions) sur la console Lambda.

  2. Sélectionnez Create function (Créer une fonction), puis Author from scratch (Créer à partir de zéro).

  3. Sous Basic information (Informations de base), pour Function name (Nom de la fonction), entrez LogAutoScalingEvent.

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

  5. Faites défiler l’écran vers le bas et choisissez Modifier le rôle d’exécution par défaut, puis dans le champ Rôle d’exécution, choisissez Utiliser un rôle existant.

  6. Pour Rôle existant, choisissez LogAutoScalingEvent-role.

  7. Laissez les autres valeurs par défaut.

  8. Sélectionnez Create function (Créer une fonction). Vous retournez au code et à la configuration de la fonction.

  9. Vérifiez que votre fonction LogAutoScalingEvent est toujours ouverte dans la console, puis sous Code source, dans l’éditeur, copiez l’exemple de code suivant dans le fichier index.mjs.

    import { AutoScalingClient, CompleteLifecycleActionCommand } from "@aws-sdk/client-auto-scaling"; export const handler = async(event) => { console.log('LogAutoScalingEvent'); console.log('Received event:', JSON.stringify(event, null, 2)); var autoscaling = new AutoScalingClient({ region: event.region }); var eventDetail = event.detail; var params = { AutoScalingGroupName: eventDetail['AutoScalingGroupName'], /* required */ LifecycleActionResult: 'CONTINUE', /* required */ LifecycleHookName: eventDetail['LifecycleHookName'], /* required */ InstanceId: eventDetail['EC2InstanceId'], LifecycleActionToken: eventDetail['LifecycleActionToken'] }; var response; const command = new CompleteLifecycleActionCommand(params); try { var data = await autoscaling.send(command); console.log(data); // successful response response = { statusCode: 200, body: JSON.stringify('SUCCESS'), }; } catch (err) { console.log(err, err.stack); // an error occurred response = { statusCode: 500, body: JSON.stringify('ERROR'), }; } return response; };

    Ce code enregistre simplement l'événement afin que, à la fin de ce didacticiel, vous puissiez voir un événement apparaître dans le flux de journal CloudWatch des journaux associé à cette fonction Lambda.

  10. Choisissez Deploy (Déployer).

Étape 3 : Création d'une EventBridge règle

Créez une EventBridge règle pour exécuter votre fonction Lambda. Pour plus d'informations sur l'utilisation EventBridge, consultez EventBridge À utiliser pour gérer les événements Auto Scaling.

Pour créer une règle avec la console
  1. Ouvrez la EventBridge console.

  2. Dans le volet de navigation, choisissez Règles.

  3. Choisissez Créer une règle.

  4. Pour Define rule detail (Définir les détails de la règle), procédez comme suit :

    1. Pour Name (Nom), saisissez LogAutoScalingEvent-rule.

    2. Pour Event bus (Bus d’événement), choisissez default (défaut). Lorsqu'un événement est généré Service AWS dans votre compte, il est toujours redirigé vers le bus d'événements par défaut de votre compte.

    3. Pour Type de règle, choisissez Règle avec un modèle d’événement.

    4. Choisissez Suivant.

  5. Pour Build event pattern (Créer un modèle d’événement), procédez comme suit :

    1. Dans Source de l'événement, sélectionnez AWS événements ou événements EventBridge partenaires.

    2. Faites défiler vers le bas jusqu’à Modèle d’événements, puis procédez comme suit :

      1. Pour Event source (Source d’événement), choisissez Services AWS.

      2. Pour Service AWS, choisissez Auto Scaling.

      3. Dans Event type (Type d'événement), choisissez Instance Launch and Terminate (Lancement et résiliation d'une instance).

      4. Par défaut, la règle correspond à tout événement de mise à l'échelle horizontale ou de montée en puissance. Pour créer une règle qui vous avertit lorsqu'un événement de montée en puissance se produit et qu'une instance est dans un état d'attente en raison d'un hook de cycle de vie, choisissez Specific instance event(s) (Événement[s] d'instance spécifique[s]) et sélectionnez EC2 Instance-launch Lifecycle Action (Action du cycle de vie de l'instance EC2 : lancement).

      5. Par défaut, la règle correspond à tout groupe Auto Scaling de la région. Pour que la règle corresponde à un groupe Auto Scaling spécifique, choisissez Nom(s) de groupe spécifique(s), puis sélectionnez le groupe.

      6. Choisissez Next (Suivant).

  6. Pour Select target(s) (Sélectionner la ou les cibles), procédez comme suit :

    1. Pour Target types (Types de cibles), choisissez Service AWS.

    2. Pour Select a target (Sélectionner une cible), choisissez Lambda Function (Fonction Lambda).

    3. Dans Fonction, sélectionnez LogAutoScalingEvent.

    4. Choisissez Next (Suivant) deux fois.

  7. Sur la page Vérifier et créer, choisissez Créer une règle.

Étape 4 : ajouter un hook de cycle de vie

Dans cette section, vous allez ajouter un hook de cycle de vie afin que Lambda exécute votre fonction sur les instances au lancement.

Ajouter un hook de cycle de vie
  1. Ouvrez la page des groupes Auto Scaling de la console Amazon EC2.

  2. Cochez la case située en regard de votre groupe Auto Scaling. Un volet fractionné s'ouvre en bas de la page.

  3. Dans le volet inférieur, sous l'onglet Gestion des instances, accédez à Hooks de cycle de vie et choisissez Créer un hook de cycle de vie.

  4. Pour définir un hook de cycle de vie pour la montée en puissance (lancement d’instances), procédez comme suit :

    1. Dans le champ Nom du hook de cycle de vie, saisissez LogAutoScalingEvent-hook.

    2. Dans le champ Transition du cycle de vie, choisissez Lancement d'instance.

    3. Dans Délai de pulsation, saisissez 300 pour définir le nombre de secondes d'attente d'un rappel de votre fonction Lambda.

    4. Dans le champ Résultat par défaut, choisissez ABANDONNER. Cela signifie que le groupe Auto Scaling résiliera une nouvelle instance si le hook expire sans recevoir de rappel de votre fonction Lambda.

    5. (Facultatif) Laissez le champ Métadonnées de notification vide. Les données d'événement que nous transmettons EventBridge contiennent toutes les informations nécessaires pour appeler la fonction Lambda.

  5. Choisissez Créer.

Étape 5 : tester et vérifier l'événement

Pour tester l'événement, mettez à jour le groupe Auto Scaling en augmentant de 1 la capacité souhaitée du groupe Auto Scaling. Votre fonction Lambda est appelée quelques secondes après l'augmentation de la capacité souhaitée.

Pour augmenter la taille du groupe Auto Scaling
  1. Ouvrez la page des groupes Auto Scaling de la console Amazon EC2.

  2. Cochez la case située en regard de votre groupe Auto Scaling pour afficher les détails dans le volet inférieur tout en continuant à voir les premières lignes du volet supérieur.

  3. Dans le volet inférieur, sous l'onglet Détails, choisissez Détails du groupe puis Modifier.

  4. Pour Desired capacity (Capacité désirée), augmentez la valeur actuelle de 1.

  5. Choisissez Mettre à jour. Pendant le lancement de l'instance, la colonne Statut du volet supérieur affiche le statut Mise à jour de la capacité.

Après avoir augmenté la capacité souhaitée, vous pouvez vérifier que votre fonction Lambda a été appelée.

Pour afficher la sortie de votre fonction Lambda
  1. Ouvrez la page Groupes de journaux de la CloudWatch console.

  2. Sélectionnez le nom du groupe de journaux pour votre fonction Lambda (/aws/lambda/LogAutoScalingEvent).

  3. Sélectionnez le nom du flux de journaux pour afficher les données fournies par la fonction pour l'action de cycle de vie.

Vous pouvez ensuite vérifier que votre instance a été lancée avec succès à partir de la description des activités de mise à l'échelle.

Pour afficher l'activité de mise à l'échelle
  1. Revenez à la page Groupes Auto Scaling et sélectionnez votre groupe.

  2. Dans l'onglet Activité, sous Historique de l'activité, la colonne Statut indique si votre groupe Auto Scaling a réussi à lancer une instance.

    • Si l'action a abouti, le statut de l'activité de mise à l'échelle indique « Succès ».

    • Si elle a échoué, après quelques minutes d'attente, vous verrez une activité de mise à l'échelle accompagnée du statut « Annulée » et du message de statut « L'instance n'a pas réussi à exécuter l'action de cycle de vie de l'utilisateur : l'action de cycle de vie associée au jeton e85eb647-4fe0-4909-b341-a6c42EXAMPLE a été abandonnée : Action de cycle de vie terminée avec le résultat ABANDONNER ».

Pour réduire la taille du groupe Auto Scaling

Si vous n'avez pas besoin de l'instance supplémentaire que vous avez lancée pour ce test, vous pouvez ouvrir l'onglet Détails et réduire la Capacité souhaitée de 1.

Étape 6 : Nettoyer

Si vous n'avez plus besoin des ressources que vous avez créées pour ce didacticiel, procédez comme suit pour les supprimer.

Pour supprimer le hook de cycle de vie
  1. Ouvrez la page des groupes Auto Scaling de la console Amazon EC2.

  2. Cochez la case située en regard de votre groupe Auto Scaling.

  3. Sous l'onglet Gestion des instances, accédez à Hooks de cycle de vie et choisissez le hook de cycle de vie (LogAutoScalingEvent-hook).

  4. Sélectionnez Actions, Delete (Supprimer).

  5. Pour confirmer, choisissez de nouveau Delete (Supprimer).

Pour supprimer la EventBridge règle Amazon
  1. Ouvrez la page Règles dans la EventBridge console Amazon.

  2. Sous Bus d'événement, choisissez le bus d'événement associé à la règle (Default).

  3. Ensuite, activez la case à cocher en regard de votre règle (LogAutoScalingEvent-rule).

  4. Sélectionnez Delete (Supprimer).

  5. Lorsque vous êtes invité à confirmer, saisissez le nom de la règle et choisissez Delete (Supprimer).

Si vous avez terminé d'utiliser l'exemple de fonction, supprimez-le. Vous pouvez également supprimer le groupe de journaux qui stocke les journaux de la fonction, ainsi que le rôle d'exécution et la politique d'autorisations que vous avez créés.

Pour supprimer une fonction Lambda
  1. Ouvrez la page Functions (Fonctions) sur la console Lambda.

  2. Choisissez la fonction (LogAutoScalingEvent).

  3. Sélectionnez Actions, Supprimer.

  4. Lorsque vous êtes invité à confirmer, saisissez delete pour confirmer la suppression de la fonction spécifiée, puis choisissez Delete (Supprimer).

Pour supprimer le groupe de journaux
  1. Ouvrez la page Groupes de journaux de la CloudWatch console.

  2. Sélectionnez le groupe de journaux de la fonction (/aws/lambda/LogAutoScalingEvent).

  3. Sélectionnez Actions, Delete log group(s) (Supprimer le ou les groupes de journaux).

  4. Dans la boîte de dialogue Delete log group(s) (Supprimer le ou les groupes de journaux), sélectionnez Delete (Supprimer).

Pour supprimer le rôle d'exécution
  1. Ouvrez la page Roles (Rôles) de la console IAM.

  2. Sélectionnez le rôle de la fonction (LogAutoScalingEvent-role).

  3. Sélectionnez Delete (Supprimer).

  4. Lorsque vous êtes invité à confirmer, saisissez le nom du rôle et choisissez Delete (Supprimer).

Pour supprimer la politique IAM
  1. Ouvrez la page Policies (Politiques) de la console IAM.

  2. Sélectionnez la politique que vous avez créée (LogAutoScalingEvent-policy).

  3. Sélectionnez Actions, Supprimer.

  4. Lorsque vous êtes invité à confirmer, saisissez le nom de la politique et choisissez Delete (Supprimer).

Les rubriques connexes suivantes peuvent être utiles lorsque vous créez des EventBridge règles basées sur des événements qui se produisent dans les instances de votre groupe Auto Scaling.

Pour suivre un didacticiel qui explique comment utiliser le service de métadonnées d’instance (IMDS) afin d’invoquer une action depuis l’instance elle-même, consultez Tutoriel : utilisation de scripts de données et de métadonnées d'instance pour récupérer l'état du cycle de vie.