Je souhaite arrêter et démarrer des instances à des heures prédéfinies ou selon des seuils d'utilisation spécifiques afin de réduire mon utilisation Amazon Elastic Compute Cloud (Amazon EC2). Est-ce que je peux configurer AWS Lambda et Amazon CloudWatch Events pour m'aider à faire cela automatiquement ?

Vous pouvez utiliser un événement CloudWatch pour lancer une fonction AWS Lambda afin de démarrer et d'arrêter vos instances EC2 à des intervalles réguliers.

Remarque : cet article fournit un exemple pour une solution simple. Pour une solution plus complexe, consultez AWS Instance Scheduler.

Les événements CloudWatch vous permettent de créer un événement qui est déclenché à une heure donnée ou selon un intervalle spécifique en réponse aux événements qui ont lieu dans votre compte. Vous pouvez par exemple créer un événement en utilisant CloudWatch Events pour une heure spécifique ou vous pouvez créer une alarme lorsque l'utilisation de la CPU pour une instance atteint un seuil spécifique. Vous pouvez également configurer une fonction Lambda pour démarrer et arrêter les instances lorsqu'elles sont déclenchées par ces événements.

Dans cet exemple, nous utilisons des fonctions Lambda pour démarrer et arrêter les instances EC2, puis nous utilisons CloudWatch Events pour démarrer les instances le matin et les arrêter la nuit.

1.    Ouvrez la console AWS Lambda et choisissez Créer une fonction.
2.    Choisissez Créer à partir de zéro.
3.    Saisissez un Nom pour votre fonction, comme « StopEC2Instances ».

4.    Développez le menu déroulant Rôle, puis sélectionnez Créer un rôle personnalisé. Cela ouvre un nouvel onglet ou une nouvelle fenêtre dans votre navigateur.
5.    Dans le menu déroulant Rôle IAM, sélectionnez Créer un nouveau rôle IAM, puis saisissez un Nom de rôle, comme « lambda_start_stop_ec2 ».
6.    Sélectionnez Afficher le document de stratégie, Modifier, puis Ok lorsque vous êtes invité à lire la documentation. Modifiez la stratégie comme suit :

{
  "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": "*"
    }
  ]
}

7.    Sélectionnez Autoriser pour terminer le rôle et revenir à la console AWS Lambda.
8.    Pour arrêter vos instances, saisissez ce qui suit dans l'éditeur de code de fonction :

import boto3
# Enter the region your instances are in. Include only the region without specifying Availability Zone; e.g., 'us-east-1'
region = 'XX-XXXXX-X'
# Enter your instances here: ex. ['X-XXXXXXXX', 'X-XXXXXXXX']
instances = ['X-XXXXXXXX']

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name=region)
    ec2.stop_instances(InstanceIds=instances)
    print 'stopped your instances: ' + str(instances)

  9.  Dans le menu déroulant Runtime, sélectionnez Python2.7.
10.  Dans Paramètres de base, saisissez 10 secondes pour l'Expiration de la fonction.
11.  Cliquez sur Enregistrer.
12.  Réalisez ces étapes à nouveau pour créer une autre fonction qui relance vos instances à l'aide de ce qui suit :

import boto3
# Enter the region your instances are in. Include only the region without specifying Availability Zone; e.g.; 'us-east-1'
region = 'XX-XXXXX-X'
# Enter your instances here: ex. ['X-XXXXXXXX', 'X-XXXXXXXX']
instances = ['X-XXXXXXXX']

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name=region)
    ec2.start_instances(InstanceIds=instances)
    print 'started your instances: ' + str(instances)

Remarque : utilisez un nom et une description qui reflètent que cette fonction sera utilisée pour lancer les instances. Vous pouvez utiliser le rôle créé précédemment.

Tester vos fonctions

1.    Ouvrez la console AWS Lambda et choisissez Fonctions.
2.    Sélectionnez votre fonction, puis Test.
3.    Dans Nom de l'événement, saisissez un nom, puis cliquez sur Créer.

Remarque : le corps de l'événement de test n'a pas d'incidence sur votre fonction, étant donné qu'elle ne l'utilise pas.

Créez un événement CloudWatch qui déclenche la fonction Lambda le soir

1.    Ouvrez la console Amazon CloudWatch.
2.    Cliquez sur Événements, puis sur Créer une règle.
3.    Sélectionnez Programme sous Source de l'événement.
4.    Saisissez un intervalle horaire ou une expression cron indiquant à Lambda quand arrêter vos instances. Pour en savoir plus sur la syntaxe adéquate, consultez Syntaxe des expressions de planification pour les règles.
Remarque : les expressions cron sont évaluées selon l'heure UTC. Assurez-vous d'ajuster l'expression à votre fuseau horaire favori.
5.    Sélectionnez Ajouter une cible, puis fonction Lambda.
6.    Pour la Fonction, sélectionnez la fonction Lambda qui arrête vos instances.
7.    Sélectionnez Configure details.
8.    Utilisez les informations ci-dessous dans les champs affichés :
       Pour Nom, saisissez un nom pertinent comme « StopEC2Instances ».
       Pour Description, ajoutez une description significative (par exemple, « arrête les instances EC2 tous les soirs »).
       Pour État, choisissez Activé.
       Sélectionnez Create rule.

Pour redémarrer vos instances le matin, effectuez à nouveau ces étapes et utilisez l'heure de début de votre choix.


Cette page vous a-t-elle été utile ? Oui | Non

Retour au Centre de connaissances AWS Support

Vous avez besoin d'aide ? Consultez le site du Centre AWS Support.

Date de publication : 07/07/2016

Date de mise à jour : 26/03/2018