De temps à autre, il est nécessaire de planifier un événement pour un serveur ou une application, comme un redémarrage ou un script qui doit s’exécuter à heure fixe. Dans l’écosystème AWS, c’est le module Cloudwatch qui nous permet de gérer les planifications. Cependant, Cloudwatch ne permet pas de démarrer un serveur arrêté (mail il est possible de programmer un reboot). Pour arriver à nos fins, nous allons devoir utiliser des fonctions Lambda.

1°) Création des fonctions Lambda

Dans la console AWS, sélectionner Lambda dans la section « Calcul ». Vous arrivez sur la page d’accueil de Lambda qui vous propose de créer votre première fonction (ou le dashboard directement si vous avez déjà mis en place des fonctions Lambda précédemment.) Cliquer sur le bouton et lancer la création de votre fonction.

Les premiers éléments à configurer pour notre fonction

Dans notre exemple, nous allons créer une fonction à partir de zéro. Donnez un nom à votre fonction et choisissez le moteur d’exécution. Ici je suis parti sur du Pyhton en version 3.6 (au moment où j’écris cet article). Dans la section autorisation, choisissez un rôle qui a les autorisations nécessaires à ceux que vous souhaitez faire. Dans notre situation, j’ai choisi un rôle qui avait les droits pour interagir avec les instances EC2 et les flux de logs. Vous pouvez partir sur un nouveau rôle Lambda avec les autorisations de base, mais il n’aura pas nécessairement les droits pour agir sur ce que vous voulez.

Une fois que vous avez tout saisis, on passe à la conception de la fonction elle-même.

On commence à rentrer les mains dans le cambouis..

J’ai laissé volontairement de coté le module Designer pour les fonctions simples que nous allons réaliser, c’est un point que je verrais plus tard si je continue à utiliser Lambda. L’écriture du code se fait directement dans l’éditeur que vous avez sous les yeux. Comme tout les développements, il faut évidemment tester son code avant de le faire exécuter par les règles Cloudwatch. Pour cela, cliquer sur la flèche orientée vers le bas à gauche du bouton « Tester » et lancer la création d’une fonction de test.

Configurer les événements de test

Dans la boite de dialogue suivante, sélectionner « Amazon CloudWatch » dans le modèle d’événement, et donner lui un nom. Ensuite, dans la partie basse où les variables d’exemples sont apparues, saisir le code suivant :

{
"instance_id": "<EC2_INSTANCE_ID>"
}

L’objectif est ici de faire passer une variable (en l’occurrence le où les identifiants des instances EC2) pour que la fonction Lambda soit la plus générique possible. De cette manière, c’est la règle Cloudwatch qui déterminera quel est le(s) serveur(s) à démarrer/éteindre, nous permettant de limiter le nombre de fonction Lambda.

Le paramétrage de la fonction de test, avec les variables à modifier

Une fois que la fonction de test est validée, nous pouvons écrire le code dans l’interface. Voici le code source utilisé pour la fonction de démarrage :

import boto3
import json
region = 'eu-west-3'

def lambda_handler(event, context):
#print("Received event: " + json.dumps(event, indent=2))
id = event['instance_id']
ec2 = boto3.client('ec2', region_name=region)
ec2.start_instances(InstanceIds=id.split())
print('Instance(s) démarrée(s): '+id)

La fonction d’arrêt est quasiment la même :

import boto3 
import json
region = 'eu-west-3'  

def lambda_handler(event, context):
      #print("Received event: " + json.dumps(event, indent=2))
      id = event['instance_id']
      ec2 = boto3.client('ec2', region_name=region)
      ec2.stop_instances(InstanceIds=id.split())
      print('Instance(s) arrétée(s): '+id)

Une fois que les fonctions sont validées, tester les avec la fonction préalablement écrite. Vous ne devez pas avoir d’erreur. De plus, les instances EC2 correspondantes aux identifiants que vous avez saisis doivent changer d’état.

2°) Création des règles Cloudwatch

Dans la console AWS, sélectionner Cloudwatch dans la section « Gestion et gouvernance ».

Aperçu des services AWS

Dans le dashboard qui s’ouvre, cliquer sur la section « Événements > Règles », pour accéder aux règles existantes et en créer. Cliquer sur « Créer une règle » pour lancer le processus.

Formulaire de création d’une règle

Cliquer sur « Programme » pour accéder aux réglages horaires.

Paramétrage du cron

Il est possible de définir un intervalle de temps pour une action (toutes les x minutes/heures par exemple), mais si il y a besoin d’avoir une planification sur un horaire fixe où un jour particulier, il faut alors utiliser le cron. La syntaxe est assez similaire à celui qu’on trouve sur Linux, si ce n’est une option un peu tricky qui est le caractère ‘?’. La documentation AWS se révèle très précieuse sur ce point.

Dans mes tests, j’ai utilisé deux expressions : l’une pour un reboot d’une instance EC2 à 8h tous les lundis, mercredi et vendredi, et l’autre pour un arrêt de cette même instance à 17h les mêmes jours. Les expressions de cron utilisées sont les suivantes :

0 6 ? * 2,4,6 * => Reboot à 8h du matin tous les lundi, mercredi et vendredi.
0 15 ? * 2,4,6 * => Stop de l'instance à 17h

Petite astuce : lorsque la saisie du cron est correcte, vous devez voir sous le champs « Expression cron » les prochaines exécutions de la règle tels que le système la comprend. On peut le voir sur l’image ci-dessous.

IMPORTANT : La planification horaire de Cloudwatch se fait OBLIGATOIREMENT en GMT (Méridien de GreenWich). Donc pensez bien à prendre en compte le décalage horaire lors de la planification. Par exemple, pour un serveur que je veux démarrer à 8h du matin heure française, il faut que je programme la cron pour que l’action se passe à 6h00 GMT (pour l’heure d’été).

C’est à mon sens un gros point noir, parce que cela impose de revoir ses règles deux fois dans l’année, et peux vite devenir un casse-tête dans le cadre de règles avec un grand nombre de fuseau horaire à prendre en compte. Apparemment, il est possible de corriger ce point en passant par le Serverless Framework, mais j’ignore ce qu’il en est exactement.

Exemple de lancement à venir

Une fois que la saisie du cron est correcte, passez sur la partie cible à droite de l’écran. Nous allons reprendre les fonctions Lambda que nous avons écrites à la première partie.

Attention : Nous avons conçu les fonctions Lambda de tel manière qu’elles doivent récupérer les identifiants des instances EC2 lors de leur appel. Pour cela, il faut configurer l’entrée de l’appel par une constante JSON où on spécifie cet identifiant. Attention à l’orthographe du nom de la variable, elle doit être exactement la même que celle définie dans la fonction Lambda..

Appel de notre fonction Lambda en précisant la variable.

Terminer en validant puis saisir un commentaire et un nom pour votre règle. Une fois ceci réalisé, la règle est active. Les serveurs vont maintenant s’arrêter et démarrer tout seul.

La liste des règles existantes, en vert celles qui sont actives.
Catégories : CloudTechs

0 commentaire

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.