Tutoriel Cron Job AWS Lambda Functions - Comment planifier des tâches

Les tâches Cron sont généralement utilisées pour planifier des commandes à un moment précis. Vous pouvez les utiliser pour des tâches telles que l'exécution de sauvegardes, la surveillance de l'état du système ou l'exécution de tâches de maintenance du système.

Les tâches Cron sont un utilitaire utile pour les administrateurs système. Et lorsque vous administrez un système dans le cloud, les tâches cron sont toujours très utiles - vous devez encore effectuer de nombreuses tâches administratives sur vos systèmes.

Une façon d'exécuter des tâches cron dans le cloud consiste à utiliser une fonction en tant que service (FaaS), comme Lambda dans l'écosystème AWS.

Les fonctions s'exécutent lorsqu'elles sont déclenchées pour le faire, et elles exécutent du code dans le cloud sans avoir besoin de provisionner ou de maintenir une infrastructure. Les fonctions peuvent également être configurées pour s'exécuter à un certain moment ou avec une certaine périodicité, comme les tâches cron traditionnelles.

Dans cet article de blog, j'utiliserai l'écosystème AWS pour vous montrer un exemple concret sur la façon de créer une tâche cron à l'aide d'une fonction dans le cloud.

Événements Amazon CloudWatch

Pour utiliser une fonction Lambda en tant que tâche cron, nous devons comprendre les événements Amazon CloudWatch.

Les événements Amazon CloudWatch sont envoyés lorsqu'il y a des modifications dans les ressources AWS. Ces événements peuvent déclencher une fonction AWS Lambda. Lorsque vos ressources AWS changent d'état, elles envoient automatiquement des événements CloudWatch au flux d'événements.

Par conséquent, vous pouvez créer une règle qui déclenche une fonction Lambda spécifique lorsque quelque chose se produit. Par exemple, vous pouvez appeler automatiquement une fonction Lambda en cas de modification dans un groupe AutoScaling.

En outre, les événements CloudWatch peuvent appeler une fonction Lambda pour s'exécuter selon une planification régulière. Et de cette façon, vous pouvez avoir, par exemple, une fonction Lambda qui désactive toutes vos instances EC2 de test et de développement après 18 heures et une autre qui les active après 8 heures.

Mise en place de la démo

Je souhaite vous montrer un exemple de fonction Lambda qui peut effectuer des actions sur vos instances EC2. J'utiliserai AWS SAM pour définir ma fonction Lambda en tant qu'infrastructure en tant que code.

Si vous souhaitez essayer cette démonstration, vous devez disposer d'un compte AWS et d'une ou plusieurs instances EC2 configurées dans votre compte AWS. Ce sont ceux que nous allons manipuler à partir des fonctions Lambda. Les instances EC2 sont la version AWS des machines virtuelles dans le cloud.

Vous pouvez essayer la démo sur AWS Cloud9 IDE (un IDE basé sur un navigateur), car AWS SAM est déjà configuré dans cet IDE. Si vous souhaitez savoir comment utiliser AWS Cloud9 IDE pour faire fonctionner les fonctions Lambda, vous pouvez regarder cette vidéo.

Dans cet exemple, nous allons démarrer et arrêter les instances EC2 à l'aide de deux AWS Lambdas différentes qui sont déclenchées à un moment donné. Nous démarrons les instances à 8 heures tous les jours et les désactivons à 18 heures lorsque la journée est terminée.

Pour cela, nous allons utiliser un événement CloudWatch pour déclencher le Lambda au bon moment et également le SDK AWS pour effectuer les opérations dans les instances.

Le code finalisé pour cet exemple est disponible dans ce référentiel GitHub. Pour que ce code fonctionne dans AWS Cloud9 IDE, vous devez configurer votre compte GitHub dans l'EDI pour pouvoir cloner le projet, puis le cloner dans l'EDI.

Lorsque vous avez cela prêt, exécutez simplement cette commande dans le répertoire cloné:

$ sam deploy --guided

Lors de l'exécution de cette commande, vous obtiendrez un ensemble de questions auxquelles vous devrez répondre afin de configurer ce projet pour qu'il s'exécute correctement.

La première chose que vous devez définir est un nom pour votre projet. Ensuite, vous définissez la région dans laquelle elle est déployée - choisissez la même où se trouvent vos instances EC2. Ensuite, nous devons donner au script de déploiement une liste des instances que nous voulons manipuler. Et puis nous avons terminé - il déploiera le projet sur notre compte AWS.

Définition de la fonction AWS Lambda

La première chose que je veux vous montrer est comment nous définissons une fonction AWS Lambda qui est déclenchée à un moment donné à l'aide d'AWS SAM. Cette définition sera dans le fichier appelé "template.yml".

Voici à quoi ressemble une fonction. Regardons les lignes importantes:

La première ligne est le nom de la fonction, dans ce cas « StartInstanceFunction ».

Ensuite, nous avons la définition « Propriétés ». La première propriété est le « Handler ». Ici, nous allons spécifier le module (fichier) où se trouve le code à exécuter, puis la méthode à l'intérieur de ce module.

Et puis nous avons le « CodeUri », qui est le chemin qui vous montre où trouver ce fichier. Dans ce cas, notre code sera à l'intérieur d'un répertoire appelé «cron» dans un fichier appelé «handler.js» et dans une méthode appelée «startInstance».

Après cela, nous avons la définition « Runtime ». J'utiliserai NodeJS version 12, mais vous pouvez utiliser Python, Java, Go, C # ou tout ce qui vous rend heureux. Lambda prend en charge plusieurs environnements d'exécution prêts à l'emploi et vous pouvez apporter votre propre environnement d'exécution si vous le souhaitez.

Ensuite, nous avons la définition « Environnement » que nous utiliserons pour définir la seule variable environnementale. Cette variable nous permettra d'envoyer au code dynamiquement différents identifiants d'instances, en fonction de la configuration lors du déploiement.

Après cela, nous avons une section appelée « Politiques », dans laquelle nous définissons les autorisations que cette fonction Lambda particulière aura.

Il est important de savoir que toutes les fonctions Lambda sont créées sans aucune autorisation. Cela signifie qu'ils ne peuvent rien faire sur les autres ressources AWS.

Pour que cette fonction Lambda démarre une instance EC2, elle a besoin d'autorisations pour effectuer cette action particulière sur cette ressource AWS particulière. Dans cette politique particulière, nous accordons des autorisations pour démarrer TOUTES les instances EC2 dans ce compte AWS. TOUT est représenté par un «*» dans la section des ressources.

Si ce morceau de code est en cours d'exécution en production, je vous recommande de limiter les ressources à celles que vous souhaitez que ce Lambda puisse démarrer.

Et enfin, la dernière section est la section « Événements ». Ici, nous allons définir comment cette fonction Lambda sera déclenchée. Cette fonction sera déclenchée avec un événement CloudWatch planifié qui déclenche le Lambda tous les jours à 8 heures du matin. Fondamentalement, à 8 heures chaque jour, il activera toutes les instances EC2 que vous spécifiez.

Il existe de nombreuses règles pour former cette expression cron: par exemple, pour dire que vous souhaitez que cela ne s'exécute que du lundi au vendredi, écrivez cron (0 8? * MON-FRI *). Vous pouvez trouver plus d'informations sur le site de documentation des événements CloudWatch ici: //docs.aws.amazon.com/lambda/latest/dg/services-cloudwatchevents-expressions.html.

Codage de la fonction AWS Lambda

Maintenant que nous avons défini la fonction Lambda, nous devons lui fournir du code. Dans le dossier «cron», dans le fichier «handler.js», nous devons ajouter la méthode appelée « startInstance » qui ressemble à ceci:  

Cette méthode sera appelée lorsque la fonction est déclenchée tous les jours à 8 heures du matin. Il obtiendra la liste des instances EC2 à partir d'une variable d'environnement à laquelle nous avons transmis tous les identifiants d'instances pendant le déploiement. Ensuite, il en créera un tableau.

Lorsqu'il a cela, il appellera le kit AWS SDK et enverra le tableau d'ID d'instances en tant que paramètre. Et s'il y a une erreur, il la consignera et la terminera. Immédiatement après la fin de l'exécution de ce Lambda, vous pouvez accéder à votre console EC2 et voir comment vos instances s'allument.

La fonction de désactivation des instances EC2 est très similaire à quelques différences près. Vous pouvez trouver le code de cette fonction dans ce lien et le vérifier.

Exécution du travail cron

Pour exécuter cette tâche cron, il ne reste plus grand-chose à faire. Une fois les deux fonctions déployées dans votre compte AWS, dans la même région que vos instances, elles s'exécuteront et feront ce pour quoi elles ont été programmées.

Maintenant, vous devez attendre 8h ou 18h pour voir s'ils fonctionnent. Ou si vous souhaitez le tester maintenant, modifiez l'heure de l'événement dans la définition Lambda en une heure qui vous convient. Assurez-vous que l'instance est activée si vous prévoyez de la désactiver ou inversement, afin de pouvoir voir les modifications.

Maintenant, attendez de voir ce qui se passe dans la console EC2. Juste après la configuration, vous verrez l'instance s'éteindre ou s'allumer, puis faire l'inverse à l'autre moment de la configuration. Cela durera pour toujours jusqu'à ce que vous supprimiez les fonctions Lambda.

Nettoyer votre compte AWS

Après avoir terminé cette démonstration, je vous recommande de désactiver (ou de supprimer l'instance que vous avez créée pour tester) et de supprimer les fonctions Lambda que vous venez de créer.

La suppression des fonctions lambda est aussi simple que d'accéder à votre service CloudFormation dans votre console de gestion AWS et de supprimer la pile de ressources créée par AWS SAM.

N'oubliez pas non plus de terminer et de supprimer les instances EC2 si vous les avez créées pour cette démo.

De conclure

Les fonctions AWS Lambda sont un outil très utile pour effectuer toutes sortes de tâches dans votre compte AWS. Vous pouvez essentiellement recevoir des notifications de tout changement dans les ressources AWS via des événements CloudWatch, puis vous pouvez accéder à presque tous les services à l'aide du kit AWS SDK. Vous pouvez ainsi effectuer toutes sortes de tâches de maintenance et de tâches automatisées sur votre infrastructure.

Merci d'avoir lu.

Je suis Marcia Villalba, Developer Advocate pour AWS et l'hôte d'une chaîne YouTube appelée FooBar où j'ai plus de 250 didacticiels vidéo sur les pratiques sans serveur, AWS et les ingénieurs logiciels.

  • Twitter: //twitter.com/mavi888uy
  • Youtube: //youtube.com/foobar_codes