Comment utiliser Lambda pour arrêter et démarrer des instances Amazon EC2 à intervalles réguliers ?

Lecture de 7 minute(s)
0

Je souhaite arrêter et démarrer mes instances Amazon Elastic Compute Cloud (Amazon EC2) automatiquement afin de réduire mon utilisation d'Amazon EC2.

Brève description

Vous pouvez utiliser AWS Lambda et Amazon EventBridge pour arrêter et démarrer des instances EC2 automatiquement.

Remarque : la résolution ci-après correspond à un cas de figure simple. Si vous souhaitez une solution plus poussée, vous pouvez utiliser AWS Instance Scheduler. Pour en savoir plus, consultez la page Démarrage et arrêt automatiques des instances AWS.

Pour utiliser Lambda afin d'arrêter et de démarrer des instances EC2 à intervalles réguliers, procédez comme suit :

  1. Créez une politique IAM et un rôle IAM personnalisés pour votre fonction Lambda.
  2. Créez des fonctions Lambda qui arrêtent et démarrent les instances EC2.
  3. Testez vos fonctions Lambda.
  4. Créez des planifications EventBridge qui exécutent votre fonction selon un programme.
    Remarque : vous pouvez également créer des règles qui réagissent aux événements de votre compte AWS.

Résolution

Remarque : après avoir effectué les étapes suivantes, il est possible que vous receviez une erreur Client error on launch. Pour en savoir plus, consultez la page Lorsque je démarre mon instance avec des volumes chiffrés attachés, celle-ci s'arrête immédiatement avec le message d'erreur « Client error on launch ».

Vous devez obtenir les ID des instances EC2 que vous souhaitez arrêter et démarrer. Ensuite, effectuez les étapes suivantes.

Création d'une politique IAM et d'un rôle IAM pour votre fonction Lambda

  1. Utilisez l'éditeur de politique JSON pour créer une politique IAM. Collez le fichier JSON suivant dans l'éditeur de politique :

    {  "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "logs:CreateLogGroup",
            "logs:CreateLogStream",
            "logs:PutLogEvents"
          ],
          "Resource": "arn:aws:logs:*:*:*"
        },
        {
          "Effect": "Allow",
          "Action": [
            "ec2:Start*",
            "ec2:Stop*"
          ],
          "Resource": "*"
        }
      ]
    }
  2. Créez un rôle IAM pour Lambda.
    Important : lorsque vous attachez une politique d'autorisations à Lambda, veillez à choisir la politique IAM que vous venez de créer.

Remarque : si vous utilisez un volume Amazon Elastic Block Store (Amazon EBS) chiffré par une clé AWS Key Management Service (AWS KMS) gérée par le client, ajoutez kms:CreateGrant à la politique IAM.

Création de fonctions Lambda qui arrêtent et démarrent vos instances

  1. Ouvrez la console Lambda, puis sélectionnez Créer une fonction.
  2. Sélectionnez Créer à partir de zéro.
  3. Sous Informations de base, saisissez les informations suivantes :
    Pour le champ Nom de la fonction, saisissez un nom qui décrit la fonction, tel que « StopEC2Instances ».
    Pour le champ Exécution, sélectionnez Python 3.9.
    Sous Autorisations, développez le menu déroulant Modifier le rôle d'exécution par défaut.
    Sous Rôle d'exécution, sélectionnez Utiliser un rôle existant.
    Sous Rôle existant, sélectionnez le rôle IAM.
  4. Sélectionnez Créer une fonction.
  5. Dans l'onglet Code, sous Source du code, collez le code suivant dans le volet de l'éditeur de code de l'onglet lambda_function. Ce code arrête les instances que vous identifiez :
    import boto3
    region = 'us-west-1'
    instances = ['i-12345cb6de4f78g9h', 'i-08ce9b2d7eccf6d26']
    ec2 = boto3.client('ec2', region_name=region)
    
    def lambda_handler(event, context):
        ec2.stop_instances(InstanceIds=instances)
        print('stopped your instances: ' + str(instances))
    Remplacez us-west-1 par la région AWS dans laquelle se trouvent vos instances. Remplacez InstanceIds par les ID des instances que vous souhaitez arrêter et démarrer.
  6. Sélectionnez Déployer.
  7. Dans l’onglet Configuration, sélectionnez Configuration générale, puis Modifier.
  8. Définissez le champ Expiration sur 10 secondes, puis sélectionnez Enregistrer.
    Remarque : (facultatif) vous pouvez régler les paramètres de la fonction Lambda. Vous pouvez par exemple utiliser des valeurs différentes pour les champs Expiration et Mémoire, afin d'arrêter et de démarrer plusieurs instances.
  9. Répétez les étapes 1 à 7 pour créer une autre fonction. Procédez comme suit pour que cette fonction démarre les instances :
    À l'étape 3, saisissez un autre nom de fonction. Par exemple, « StartEC2Instances ».
    À l'étape 5, collez le code suivant dans le volet de l'éditeur de code sous l’onglet lambda_function :
    import boto3
    region = 'us-west-1'
    instances = ['i-12345cb6de4f78g9h', 'i-08ce9b2d7eccf6d26']
    ec2 = boto3.client('ec2', region_name=region)
    
    def lambda_handler(event, context):
        ec2.start_instances(InstanceIds=instances)
        print('started your instances: ' + str(instances))

          Utilisez votre région et les mêmes ID d'instances.

Test de vos fonctions Lambda

  1. Ouvrez la console Lambda, puis sélectionnez Fonctions.
  2. Sélectionnez l'une des fonctions.
  3. Sélectionnez l’onglet Code.
  4. Dans la section Source du code, sélectionnez Test.
  5. Dans la boîte de dialogue Configurer un événement de test, sélectionnez Créer un nouvel événement de test.
  6. Saisissez le Nom de l’événement. Sélectionnez ensuite Créer.
    Remarque : il ne faut pas modifier le code JSON de l'événement de test.
  7. Sélectionnez Test pour exécuter la fonction.
  8. Répétez les étapes 1 à 7 pour l'autre fonction.

Vérification du statut de vos instances

Console de gestion AWS

Avant et après le test, vérifiez l'état de vos instances pour vous assurer que vos fonctions fonctionnent.

CloudTrail

Utilisez AWS CloudTrail pour rechercher des événements, afin de vérifier que la fonction Lambda a bien arrêté ou démarré l'instance.

  1. Ouvrez la console CloudTrail.
  2. Dans le volet de navigation, sélectionnez Historique des événements.
  3. Déroulez la liste déroulante Attributs de recherche, et sélectionnez Nom de l'événement.
  4. Dans la barre de recherche, saisissez StopInstances pour consulter les résultats. Saisissez ensuite StartInstances.

Si aucun résultat ne s'affiche, cela signifie que la fonction Lambda n'a pas arrêté ou démarré les instances.

Création de règles EventBridge exécutant vos fonctions Lambda

  1. Ouvrez la console EventBridge.
  2. Sélectionnez Créer une règle.
  3. Saisissez un nom pour votre règle, tel que « StopEC2Instances ». (Facultatif) Dans le champ Description, saisissez la description de la règle.
  4. Pour le champ Type de règle, sélectionnez Planifier, puis sélectionnez Continuer dans EventBridge Scheduler.
  5. Pour le modèle de planification, sélectionnez Planification récurrente.
  6. Sous Modèle de planification, pour le champ Fréquence, sélectionnez Planification récurrente.
  7. Pour le champ Type de planification, sélectionnez un type de planification, puis procédez comme suit :
    Pour le champ Calendrier basé sur les tarifs, saisissez une valeur de tarif, puis sélectionnez un intervalle de temps en minutes, heures ou jours.
    -ou-
    Pour le champ Calendrier basé sur CRON, saisissez une expression indiquant à Lambda quand arrêter votre instance. Pour en savoir plus sur la syntaxe des expressions, consultez la page Création d'une règle Amazon EventBridge exécutée selon un calendrier.
    Remarque : les expressions Cron sont évaluées en UTC. Veillez à adapter l'expression en fonction du fuseau horaire de votre choix.
  8. Pour le champ Sélectionner les cibles, sélectionnez la Fonction Lambda dans la liste déroulante Cible.
  9. Pour le champ Fonction, sélectionnez la fonction qui arrête vos instances.
  10. Sélectionnez Passez à la vérification et à la création, puis sélectionnez Créer.
  11. Répétez les étapes 1 à 10 pour créer une règle permettant de démarrer vos instances. Procédez comme suit :
    Saisissez un nom pour votre règle, tel que « StartEC2Instances ».
    (Facultatif) Dans le champ Description, saisissez la description de votre règle, par exemple « Démarre les instances EC2 tous les matins à 7 h 00 ».
    À l'étape 7, pour le champ Expression Cron, saisissez une expression indiquant à Lambda quand démarrer vos instances.
    À l'étape 9, pour le champ Fonction, sélectionnez la fonction qui démarre vos instances.

Remarque : il arrive qu'une fonction Lambda arrête une instance et ne parvienne pas à la redémarrer. Ceci se produit lorsqu'un volume Amazon Elastic Block Store (Amazon EBS) est chiffré et que le rôle Lambda n'est pas autorisé à utiliser la clé de chiffrement. Pour en savoir plus, consultez les pages Stratégie de clé AWS KMS requise pour une utilisation avec des volumes chiffrés et Stratégies de clé dans AWS KMS.

Informations connexes

Tutoriel : Planification de fonctions AWS Lambda à l'aide d'EventBridge

Événements des services AWS

Ajout d'actions d'arrêt aux alarmes Amazon CloudWatch

Options d'achat d'instance

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 6 mois
2 Commentaires

Erreur de Typo : import boto3region = 'us-west-1' La syntaxe correcte est : import boto3 (retour chariot C/R) region = 'us-west-1'

Gaetan
a répondu il y a 6 mois

Merci pour votre commentaire. Nous vérifierons et mettrons à jour l'article du Centre de connaissances si nécessaire.

profile pictureAWS
MODÉRATEUR
a répondu il y a 6 mois