MrRaph_

5 minute(s) de lecture

Résumé des épisodes précédents

Dans la partie 1 nous avons vu les différents composants qui seront utilisés par notre stopinator. Nous allons maintenant nous pencher sur les deux éléments clefs de ce projet, l’utilistion du framework Serverless et la création de notre fonction Lambda.

Note : Tous les codes présentés dans cette suite d’articles sont disponible dans ce dépôt GitHub.

Le framework Serverless

Installation

L’installation du framework est relativement simple, elle nécessite toute fois que Node.js soit installé sur votre poste. Ceci n’est pas couvert dans cette suite d’article.

Une fois Node.js installé sur votre poste, l’installation de Serverless est très simple, il suffit de lancer la commande suivante.

npm install -g serverless

Il est maintenant temps de passer à la configuration du framework.

Configuration

La configuration principale de Serverless est liée à la configuration de la ligne de commande AWS - que je vous conseille fortement d’installer. Serverless va se servir des informations de connexion que vous aurez configuré pour utiliser la ligne de commande AWS.

Assurez-vous que vous disposez d’une paire Acces Key, Secret Key créée depuis la console AWS. Si vous n’en avez pas, leur création est documentée ici par AWS.

Une vidéo expliquant la configuration de informations de connexion pour Serverless est disponible sur la chaine Youtube du projet.

Si vous avez installé la ligne de commande AWS

Si vous avez déjà installé la CLI AWS, alors vous avez probablement déjà configuré l’authentification à votre compte. Vous pouvez vérifier cela en regardant le contenu des fichiers suivants (en fonction de l’OS que vous utilisez) :

  • ~/.aws/credentials (Linux / macOS)
  • C:\Users\USERNAME .aws\credentials (Windows)

Si vous n’avez pas encore configuré la CLI pour vous connecter à votre compte AWS, il faut utiliser la commande aws configure. Cette dernière vous demandera les informations nécessaires à la connexion à votre compte AWS et renseignera le fichier .aws/credentials. Ceci est documenté ici.

Vous pourrez ensuite utiliser ces informations de connexion avec Serverless.

Si vous n’avez pas installé la ligne de commande AWS

Serverless propose un moyen de configurer l’accès à votre compte via sa propre ligne de commande. Ceci ce fait via la ligne de commande suivante.

serverless config credentials --provider aws --key <Access Key> --secret <Secret Key>

La configuration complète du framework est documentée ici.

Identifier le nom du profile AWS

Pour utiliser les informations d’identification AWS configurée dans les paragraphes précédents, il faut que vous connaissiez le nom du profile associé à la paire Acces Key, Secret Key que vous souhaitez utiliser. Pour cela, il faut aller voir dans le fichier .aws/credentials.

[profileName1]
aws_access_key_id=***************
aws_secret_access_key=***************

[profileName2]
aws_access_key_id=***************
aws_secret_access_key=***************

Dans l’exemple ci-dessus, deux profiles sont configurés, l’un s’appelant profileName1 et l’autre profileName2. Dans la suite de cet article, j’utiliserai en exemple le profile profileName1.

Création du service

Nous voilà maintenant dans le coeur du problème ! Nous allons créer un projet avec le framework Serverless. Ce projet va nous permettre de déployer et de configurer notre fonction Lambda sans même ouvrir la console web AWS.

La création du service, est très simple, elle revient à exécuter la commande suivante.

serverless create --template aws-python --path Stopinator

Création du service avec Serverless

Cette commande va créer le dossier “Stopinator” ainsi que deux fichiers :

  • handler.py
  • serverless.yml

Le premier fichier - handler.py - contiendra le code de la fonction Lambda du stopinator et le second - serverless.yml - contiendra lui la configuration de cette fonction et tous ses à-côtés. Il faudra en effet configurer l’event CloudWatch qui va déclencher son exécution. Il faudra également qu’il contienne les éléments de configuration IAM pour que notre fonction puisse agir sur les instances EC2.

Créons notre fonction Lambda

Note : Le code complet de la fonction est disponible ici.

Le coeur de notre fonction Lambda va se situer dans le fichier handler.py. Nous allons remplacer la fonction existante dans ce fichier, la fonction hello qui s’y trouve a été créée par le framework Serverless lors de la création du service. Nous allons donc remplacer cette fonction hellopar le code suivant.

def doStop(event, context):

    response = "doStop"

    for instance in filterInstances(event['ENV'], 'running'):
        instance.stop()

    return response

Cette fonction prend deux paramètres - event et context - par défaut pour les fonctions Lambda. Elle appelle ensuite la fonction filterInstances à laquelle elle passe un paramètre ENV qu’elle a elle même reçue via les paramètres de la fonction Lambda et un paramètre contenant l’état souhaiter des instances à traiter. Dans ce cas, les instances sur lesquelles nous souhaitons agir sont celles qui sont en cours d’exécution, nous passons donc l’état running. Puis elle boucle sur chaque instance retournée par cette dernière fonction et stoppe l’instance concernée.

Nous allons également ajouter le code de la fonction filterInstances à la fin du fichier handler.py.

def filterInstances(env, state):
    filters = [
            {'Name':'tag:Environment', 'Values':[ env ]},
            {'Name': 'instance-state-name', 'Values': [ state ]}
        ]
    allInstances = ec2.instances.filter(Filters=filters)

    return allInstances

Cette fonction va filtrer les instances en fonction de leur environnement et de leur état actuel puis retourner cette liste d’instance.

La suite au prochain épisode !

Maintenant nous avons configuré le framework Serverless, nous avons créé notre fonction Lambda, bref, nous sommes prêt à stopiner !! Dans la troisième partie, nous mettrons le tout en musique !

<< Épisode Précédent Épisode Suivant >>

Note : Tous les codes présentés dans cette suite d’articles sont disponible dans ce dépôt GitHub.

comments powered by Disqus