Comment arrêter et démarrer des instances Amazon EC2 à intervalles réguliers à l'aide de Lambda ?

Dernière mise à jour : 30/08/2019

Je souhaite réduire mon utilisation d'Amazon Elastic Compute Cloud (Amazon EC2) en arrêtant et en démarrant mes instances EC2 automatiquement. Comment utiliser AWS Lambda et Amazon CloudWatch Events à cet effet ?

Brève description

Remarque : cet exemple de configuration est une solution simple. Pour disposer d'une solution plus robuste, utilisez AWS Instance Scheduler.

Pour cette configuration, procédez comme suit :

1.    Créez une stratégie AWS Identity and Access Management (IAM) personnalisée et un rôle d'exécution pour votre fonction Lambda.

2.    Créez des fonctions Lambda qui arrêtent et démarrent vos instances EC2.

3.    Créez des règles CloudWatch Events qui déclenchent votre fonction selon une planification. Par exemple, vous pouvez créer une règle pour arrêter les instances EC2 la nuit, et une autre pour les redémarrer le matin.

Remarque : vous pouvez également créer des règles qui se déclenchent lors d'un événement qui se produit dans votre compte AWS.

Solution

Obtenez les ID des instances EC2 à arrêter et démarrer, puis suivez les instructions ci-dessous.

Créer une stratégie et un rôle IAM

1.    Créez une stratégie IAM à l'aide de l'éditeur de stratégie JSON. Collez ce document de stratégie JSON 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. Lorsque vous associez une stratégie d'autorisations, recherchez et choisissez la stratégie IAM que vous avez créée.

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

1.    Dans la console Lambda, sélectionnez Créer une fonction.

2.    Sélectionnez Créer à partir de zéro.

3.    Sous Basic Information (Informations de base), ajoutez les éléments suivants :
Pour Function name (Nom de la fonction), saisissez un nom qui identifie la fonction comme étant la fonction utilisée pour arrêter les instances EC2. Par exemple, « StopEC2Instances ».
Pour Exécution, sélectionnez Python 3.7.
Sous Autorisations, développez Choisir ou créer un rôle d'exécution.
Sous Execution role (Rôle d'exécution), choisissez Use an existing role (Utiliser un rôle existant).
Sous Existing role (Rôle existant), choisissez le rôle IAM que vous avez créé.

4.    Choisissez Créer une fonction.

5.    Copiez ce code, puis sous Code de fonction, collez-le dans le volet de l'éditeur de code (lambda_function). Ce code arrête les instances EC2 que vous identifiez.

Remarque : Pour région, remplacez « us-west-1 » par la région AWS dans laquelle se trouvent vos instances. Pour instances, remplacez l'exemple d'ID d'instance EC2 par les ID des instances à arrêter et démarrer.

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))

6.    Sous Basic settings (Paramètres de base), définissez Timeout (Expiration) sur 10 secondes.

Remarque : définissez les paramètres de fonction Lambda en fonction des besoins de votre cas d'utilisation. Par exemple, si vous souhaitez arrêter et démarrer plusieurs instances, une valeur différente peut être nécessaire pour Timeout (Expiration) et Memory (Mémoire).

7.    Sélectionnez Save (Enregistrer).

8.    Répétez les étapes 1 à 7 pour créer une autre fonction. Effectuez différemment la procédure ci-dessous afin que cette fonction démarre vos instances EC2 :
Dans l'étape 3, saisissez le nom de la fonction qui l'identifie comme étant la fonction utilisée pour démarrer vos instances EC2. Par exemple, « StartEC2Instances ».
Dans l'étape 5, copiez et collez ce code dans le volet dans l'éditeur de code (lambda_function) :

Remarque : pour region (région) et instances, utilisez les mêmes valeurs que celles utilisées pour le code d'arrêt de vos instances EC2.

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))

Tester vos fonctions Lambda

1.    Dans la console Lambda, sélectionnez Fonctions.

2.    Sélectionnez l'une des fonctions que vous avez créées.

3.    Sélectionnez Actions, puis Tester.

4.    Dans la boîte de dialogue Configure test event (Configurer un événement de test), sélectionnez Create new test event (Créer un événement de test).

5.    Saisissez un Nom de l'événement, puis sélectionnez Créer.

Remarque : vous ne devez pas modifier le code JSON pour l'événement de test, étant donné que la fonction ne l'utilise pas.

6.    Sélectionnez Test pour exécuter la fonction.

7.    Répétez les étapes 1 à 6 pour l'autre fonction que vous avez créée.

Conseil : Vous pouvez vérifier le statut de vos instances EC2 avant et après le test afin de vous assurer que vos fonctions fonctionnent correctement.

Créer des règles qui déclenchent vos fonctions lambda

1.    Ouvrez la console CloudWatch.

2.    Dans le volet de navigation de gauche, sous Événements, sélectionnez Règles.

3.    Sélectionnez Create rule (Créer une règle).

4.    Sous Source de l'événement, sélectionnez Programmer.

5.    Ensuite, effectuez l'une des actions suivantes :
Pour Fréquence fixe de, saisissez un intervalle de temps exprimé en minutes, heures ou jours.
Pour Expression cron, saisissez une expression qui indique à Lambda quand vous souhaitez arrêter vos instances. Pour plus d'informations sur la syntaxe des expressions, reportez-vous à Expression de planification des règles.
Remarque : les expressions cron sont évaluées au format UTC. Veillez à ajuster l'expression au fuseau horaire de votre choix.

6.    Sous Cibles, sélectionnez Ajouter une cible.

7.    Sélectionnez Fonction Lambda.

8.    Pour Function (Fonction), sélectionnez la fonction qui arrête vos instances EC2.

9.    Sélectionnez Configurer les détails.

10.    Sous Rule definition (Définition de règle), procédez comme suit :
Pour Nom, saisissez un nom pour identifier la règle, « StopEC2Instances » par exemple.
(Facultatif) Pour Description, décrivez votre règle. Par exemple, « Arrête les instances EC2 tous les soirs à 22 h ».
Pour State (État), cochez la case Enabled (Activé).

11.    Choisissez Create rule (Créer une règle).

12.    Répétez les étapes 1-11 pour créer une règle pour démarrer vos instances EC2. Effectuez la procédure suivante différemment :
Dans l'étape 5, pour Cron expression (Expression Cron), saisissez une expression qui indique à Lambda quand vous souhaitez démarrer vos instances.
Dans l'étape 8, pour Function (Fonction), choisissez la fonction qui démarre vos instances EC2.
Dans l'étape 10, sous Définition de la règle, saisissez un nom tel que « StartEC2Instances » et, le cas échéant, saisissez une description, telle que « Démarrer les instances EC2 chaque matin à 6 h 00 ».