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

Lecture de 6 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

Utilisez AWS Lambda et Amazon EventBridge pour arrêter et démarrer automatiquement les instances EC2.

Remarque : La résolution ci-après correspond à un cas de figure simple. Pour une solution plus évoluée, utilisez Instance Scheduler sur AWS. Pour en savoir plus, consultez la section 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.

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 plus d'informations, consultez la section Stratégie de clé AWS KMS requise pour une utilisation avec des volumes chiffrés.

Résolution

Prérequis : Vous devez obtenir les ID des instances EC2 que vous souhaitez arrêter et démarrer.

Créer une stratégie IAM et un rôle IAM pour votre fonction Lambda

Procédez comme suit :

  1. Utilisez l'éditeur de stratégie JSON pour créer une stratégie IAM. Saisissez le document de stratégie JSON suivant dans l'éditeur de stratégie :

    {
        "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.

  3. Attachez la stratégie IAM au rôle IAM.

Remarque : Si vous utilisez un volume Amazon Elastic Block Store (Amazon EBS), une configuration supplémentaire peut être requise. Si le volume Amazon EBS est chiffré avec une clé AWS Key Management Service (AWS KMS) gérée par le client, ajoutez kms:CreateGrant à une stratégie IAM.

Créer des fonctions Lambda qui arrêtent et démarrent vos instances

Procédez comme suit :

  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 Nom de la fonction, saisissez un nom qui décrit la fonction, tel que StopEC2Instances ou StartEC2Instances.
    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. Sélectionnez l’onglet Code.

  6. Dans l'onglet lambda_funciton.py sous Source du code, saisissez le code suivant dans l'éditeur de code pour arrêter_instances :

    import boto3region = '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))

    Pour démarrer_instances, saisissez le code suivant dans l'éditeur de code :

    import boto3region = '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))

    Remarque : Remplacez us-west-1 par la région AWS dans laquelle se trouvent vos instances et InstanceIds par les ID des instances que vous souhaitez arrêter et démarrer.

  7. Sélectionnez Déployer.

  8. Dans l’onglet Configuration, sélectionnez Configuration générale, puis Modifier.

  9. Définissez Délai d’expiration sur 10 secondes, puis sélectionnez Enregistrer.

Tester vos fonctions Lambda

Procédez comme suit :

  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 un nom d'événement, puis sélectionnez 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érifier le statut de vos instances

Console Amazon EC2

Avant et après le test, vérifiez le statut de vos instances pour vous assurer que vos fonctions sont opérationnelles.

CloudTrail

Vous pouvez également utiliser AWS CloudTrail pour vérifier que la fonction Lambda a bien arrêté ou démarré l'instance.

Procédez comme suit :

  1. Ouvrez la console CloudTrail.
  2. Dans le volet de navigation, sélectionnez Historique des événements.
  3. Dans la liste déroulante Attributs de recherche, 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éer des règles EventBridge afin d’exécuter vos fonctions Lambda

Procédez comme suit :

  1. Ouvrez la console EventBridge.
  2. Sélectionnez Créer une règle.
  3. Saisissez un nom pour votre règle, par exemple StopEC2Instances ou StartEC2Instances.
  4. (Facultatif) Pour Description, saisissez une description pour la règle.
  5. Pour Type de règle, sélectionnez Planifier, puis Continuer dans EventBridge Scheduler.
  6. Dans le Modèle de planification, pour le champ Occurrence, sélectionnez Planification récurrente.
  7. Pour Type de planification, choisissez une planification basée sur les tarifs ou une planification basée sur cron, puis effectuez l'une des étapes suivantes :
    Pour Planification basé sur les tarifs, saisissez une valeur de tarif, puis sélectionnez un intervalle de temps en minutes, heures ou jours.
    -ou-
    Pour Planification basée sur cron, saisissez une expression indiquant à Lambda quand arrêter ou démarrer votre instance.
    Remarque : les expressions Cron sont évaluées en UTC. Veillez à adapter l'expression en fonction du fuseau horaire de votre choix.
  8. Sur la page Sélectionner les cibles, sélectionnez Fonction Lambda dans la liste déroulante Cible.
  9. Pour Fonction, sélectionnez la fonction qui arrête ou démarre vos instances.
  10. Sélectionnez Passez à la vérification et à la création, puis sélectionnez Créer.

Remarque : Vous pouvez également créer des règles qui réagissent aux événements de votre compte AWS.

Informations connexes

Didacticiel : Créer une règle planifiée EventBridge pour les fonctions AWS Lambda

Événements liés aux services AWS dans EventBridge

Options de facturation et d'achat Amazon EC2

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un 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'

a répondu il y a un an

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 un an