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

Date de la dernière mise à jour : 21/10/2020

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 dois-je utiliser AWS Lambda et Amazon CloudWatch Events pour faire cela ?

Brève description

Remarque : cet exemple de configuration est une solution simple. Pour une solution plus robuste, utilisez AWS Instance Scheduler. Pour plus d'informations, consultez la section Comment arrêter et démarrer mes instances à l'aide d'AWS Instance Scheduler ?

Pour cette configuration, procédez comme suit :

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

2.    Créez des fonctions Lambda pour démarrer et arrêter vos instances EC2.

3.    Créez des règles d'événement CloudWatch qui déclenchent votre fonction sur un programme. Par exemple, vous pouvez créer une règle pour arrêter vos instances EC2 la nuit et une autre pour les relancer le matin.

Remarque : vous pouvez également créer des règles déclenchant un événement se trouvant dans votre compte AWS.

Résolution

Obtenez les ID des instances EC2 que vous souhaitez arrêter et redémarrer, puis suivez ces instructions.

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

1.    Créez une stratégie IAM à l'aide d'un é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'autorisation, recherchez et choisissez la stratégie IAM que vous avez créée.

Créez des fonctions Lambda pour démarrer et arrêter vos instances EC2

1.    Dans la console AWS Lambda, choisissez Créer une fonction.

2.    Choisissez Créer à partir de zéro.

3.    Sous Informations de base, procédez comme suit :
Pour Nom de la fonction, saisissez un nom l'identifiant comme la fonction utilisée pour arrêter vos instances EC2. Par exemple, « StopEC2Instances ».
Dans le champ Exécution, sélectionnez Python 3.7.
Sous Autorisations, développez Sélectionner ou créer un rôle d'exécution.
Sous Rôle d'exécution, sélectionnez Utiliser un rôle existant.
Sous Rôle existant, choisissez le rôle IAM que vous avez créé plut tôt.

4.    Sélectionnez Créer une fonction.

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

Remarque : pour région, remplacez « us-west-1 » avec la région AWS dans laquelle se trouve vos instances. Pour instances, remplacez les ID d'instance EC2 d'exemple avec les ID des instances spécifiques que vous souhaitez 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 Réglages de base, définissez Expiration à 10 secondes.

Remarque : configurez les réglages de la fonctions Lambda comme requis pour votre cas d'utilisation. Par exemple, si vous souhaitez arrêter et lancer plusieurs instances, vous pouvez avoir besoin d'une valeur différente pour Expiration et Mémoire.

7.    Choisissez Save (Enregistrer).

8.    Répétez les étapes 1-7 pour créer une autre fonction. Procédez différemment pour que cette fonction démarre vos instances EC2 :
À l'étape 3, saisissez un Nom de fonction comme fonction utilisée pour démarrer vos instances EC2. Par exemple, « StartEC2Instances ».
À l'étape 5, copiez et collez ce code dans le volet de modification dans l'éditeur de code (lambda_function) :

Remarque : pour Région et Instances, utilisez les mêmes valeurs que vous avez utilisées pour le code pour arrêter 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))

Testez votre fonction Lambda

1.    Dans la console AWS Lambda, choisissez Fonctions.

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

3.    Choisissez Actions, puis Test.

4.    Dans la boîte de dialogue Configurer l'événement de test, choisissez Créer un nouvel événement de test.

5.    Saisissez un nom d'événement, puis choisissez Créer.

Remarque : vous n'avez pas à changer le code JSON pour l'événement de test ; la fonction ne l'utilise pas.

6.    Choisissez Test pour exécuter la fonction.

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

Astuce : vous pouvez vérifier l'état de vos instances EC2 avant et après avoir effectué le test pour confirmer que vos fonctions fonctionnent comme prévu.

Créez des règles qui déclenchent vos fonctions Lambda

1.    Ouvrez la console Amazon CloudWatch.

2.    Dans le panneau de navigation de gauche, sous Événements, choisissez Règles.

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

4.    Sous Source de l'événement, choisissez Programme.

5.    Effectuez l'une ou l'autre des opérations suivantes :
Pour le champ Taux fixe de, saisissez un intervalle de temps en minutes, heures ou jours.
Pour le champ Expression Cron, saisissez une expression qui indique à Lambda quand arrêter vos instances. Pour plus d'informations sur la syntaxe des expressions, consultez Expressions de planification des règles.
Remarque :
les expressions Cron sont évaluées selon l'heure UTC. Assurez-vous d'ajuster l'expression pour le fuseau horaire de votre choix.

6.    Sous Cibles, choisissez Ajouter une cible.

7.    Choisissez Fonction Lambda.

8.    Pour Fonction, choisissez la fonction qui arrête vos instances EC2.

9.    Sélectionnez Configure details.

10.    Sous Définition de la règle, procédez comme suit :
Pour Nom, saisissez un nom pour identifier la règle, telle que « StopEC2Instances ».
(Facultatif) Pour Description, décrivez votre règle. Par exemple, « Arrête les instances EC2 chaque nuit à 22 h ».
Pour État, sélectionnez la case 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. Procédez comme suit :
À l'étape 5, pour le champ Expression Cron, saisissez une expression qui indique à Lambda quand démarrer vos instances.
À l'étape 8, pour 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 ».