Mon utilisation d'EC2
AWS (Amazon Web Services), c’est l’une des plateformes où tu peux quasiment tout faire à un seul endroit. C’est pour le moment ma plateforme privilégiée pour tout ce qui concerne les backups, via le service S3.
Le sujet d’aujourd’hui va porter sur un autre service, qui est EC2, et qui me sert à tester une multitude de choses. Pour te donner quelques exemples, j’ai expérimenté FFmpeg pour du streaming, pngquant pour compresser des images pour un site web, GitLab CE pour avoir un gestionnaire de dépôts Git, HAProxy avec plusieurs instances pour expérimenter le load balancing, ou encore Traefik comme solution de routage, sans évoquer les nombreux tests que je peux faire avec Plesk et WordPress.
C'est quoi EC2 ?
EC2 est donc à la fois le nom d’un service et le nom que l’on donne à des serveurs virtuels (instances). C’est l’acronyme de « Elastic Compute Cloud », que l’on retrouve chez d’autres hébergeurs sous des appellations assez similaires.
Le service se trouve très facilement en tapant EC2 dans la barre de recherche tout en haut du site.
Particularités des instances EC2
Il y a quelques particularités notables avec les instances d’Amazon, directement liées à leur modèle de coût, et qui sont de vrais game changers, puisqu’il est difficile de retrouver ça chez d’autres concurrents.
La première particularité, c’est la tarification à la seconde. J’ai déjà eu besoin de lancer de gros calculs sur des instances avec plus de 100 cœurs CPU, ainsi que sur des machines équipées de puces H100 de Nvidia, extrêmement coûteuses. Ce mode de facturation apporte une certaine flexibilité et nous offre la possibilité d’accéder à cette puissance de calcul pour un coût raisonnable.
La seconde particularité, c’est que lorsqu’une instance est fermée, elle ne coûte rien. On ne paye que ce que l’on consomme. À ce moment-là, seul le coût du stockage sera facturé, ou éventuellement l’IP si on en a réservé une.
Couper la nuit
Aujourd’hui, je vais donc t’expliquer comment j’économise sur les coûts d’infrastructure en stoppant les serveurs la nuit. Vu le modèle de facturation, tu pourrais croire que c’est simple, mais ce n’est pas forcément si facile, surtout quand on débute.
La solution que je vais te présenter utilise deux autres services AWS : Amazon EventBridge et AWS Lambda.
En vidéo
Avant de te plonger à corps perdu dans cet article, sache aussi que j’ai fait une vidéo qui reprend les différentes parties en action. Cela me semblait nécessaire au vu du nombre de screenshots, qui peuvent rendre l’article un peu indigeste. Mais pas d’inquiétude, j’ai pris soin de détailler chaque étape ci-dessous pour que tu puisses tout suivre tranquillement.
Balise
Les balises sont un outil pratique dans AWS. Tu peux choisir un nom avec une valeur et l’attacher à un objet. En l’occurrence ici, notre objet, ça va être un serveur. Ensuite, via cette balise, on va pouvoir cibler très facilement les serveurs qui doivent être éteints la nuit. Les balises vont donc agir comme un filtre.
Je vais donc ajouter une balise que je vais nommer « AutoStop », et l’attribuer à toutes les instances que je veux éteindre la nuit.
Lors de la création d’une instance ça se passe directement au début, tu peux cliquer sur « Ajouter des balises supplémentaires ».
Je mets comme valeur « true », ce qui me permettra aussi de désactiver le système facilement en changeant la valeur sans forcément retirer la balise.
Si c’est une instance qui a déjà été créée, voici comment gérer les balises très facilement. Rends-toi dans le service EC2 et liste tes instances (1). Recherche l’instance désirée et clique sur sa case à cocher (2). Le bloc en dessous se mettra à jour : clique sur le dernier onglet, « Balises » (3), puis sur « Gérer les balises » (4). Tu pourras alors très facilement ajouter la balise « AutoStop ».
Service Lambda
Éteindre ou démarrer une instance EC2 peut se faire avec un peu de code. Ici, je vais te montrer comment tout automatiser au sein d’AWS. Grâce au service Lambda, tu vas pouvoir héberger ton code directement sur Amazon et l’exécuter depuis différents services, à n’importe quel moment.
Commence par taper Lambda dans la barre de recherche AWS, puis clique sur le nom du service.
Ensuite, clique sur le bouton orange « Créer une fonction », ce qui te permettra de créer deux fonctions : une pour démarrer tes instances, et une autre pour les éteindre.
Lambda : Fonction de démarrage
Choisis le nom que tu veux, et comme langage, sélectionne la dernière version de Python. Pour le reste, tu peux laisser les options par défaut.
Ajoute le code juste ci-dessous à la place du code de démo et clique sur « Deploy ». Ne clique pas encore sur « Test », il faut d’abord lui ajouter un droit, je t’explique ça un peu plus bas.
import boto3
def lambda_handler(event, context):
ec2 = boto3.client('ec2')
instances = ec2.describe_instances(Filters=[{'Name': 'tag:AutoStop', 'Values': ['true']}])
for reservation in instances.get("Reservations"):
for instance in reservation.get("Instances"):
instance_id = instance['InstanceId']
state = instance['State']['Name']
if state == 'stopped':
ec2.start_instances(InstanceIds=[instance_id])
print('Started instance: ' + instance_id)
else:
print('Instance ' + instance_id + ' in state ' + state + ', skipping...')
Quelques explications sur le code. Ça utilise boto3 pour communiquer avec AWS et récupérer l’ensemble des instances EC2 de ton compte qui ont la balise « AutoStop » avec la valeur true (adapte le code avec les noms que tu as choisis). Ensuite, il boucle sur les instances et, pour toutes celles qui ont l’état « stopped », il exécute un démarrage de l’instance.
Voici à quoi ça devrait ressembler dans l’interface.
Lambda : Fonction d'extinction
Crée une nouvelle fonction comme ci-dessus, mais cette fois-ci avec le code suivant. C’est la même logique, sauf qu’ici tu vas récupérer toutes les instances qui ont l’état « running » et les arrêter. Cela va te permettre de gérer la partie extinction des instances.
import boto3
def lambda_handler(event, context):
ec2 = boto3.client('ec2')
instances = ec2.describe_instances(Filters=[{'Name': 'tag:AutoStop', 'Values': ['true']}])
for reservation in instances.get("Reservations"):
for instance in reservation.get("Instances"):
instance_id = instance['InstanceId']
state = instance['State']['Name']
if state == 'running':
ec2.stop_instances(InstanceIds=[instance_id])
print('Stopped instance: ' + instance_id)
else:
print('Instance ' + instance_id + ' in state ' + state + ', skipping...')
Politique pour manipuler les EC2
Il va falloir donner l’autorisation aux deux fonctions Lambda d’agir sur les instances EC2. Pour ce faire, tu vas créer une nouvelle politique via le service IAM.
Tout en haut à droite, clique sur « Créer une politique ».
Dans l’interface qui va apparaître, choisis JSON comme éditeur de politique. Colle le code qui se trouve juste en dessous du screenshot, puis clique sur « Suivant ».
Voici le JSON qui donne les droits pour démarrer, stopper et lister les instances EC2.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:StartInstances",
"ec2:StopInstances",
"ec2:DescribeInstances"
],
"Resource": "*"
}
]
}
Donne un nom compréhensible à ta politique, puis enregistre-la en cliquant sur le bouton « Créer une politique ».
Attacher la politique
Maintenant, il faut attacher la politique aux rôles de tes nouvelles fonctions Lambda. Rends-toi dans le service Lambda, ouvre l’une de tes fonctions, puis dans l’onglet Configuration (1), va dans la section Autorisation (2), et clique sur le rôle (3).
Voici un screenshot qui te permettra de t’y retrouver plus facilement.
Tu verras une politique déjà attachée. Il faut maintenant ajouter celle que tu viens de créer. Clique sur le bouton « Ajouter des autorisations », puis choisis « Attacher des politiques ».
Tape le nom de la politique que tu viens de créer (moi, dans mon cas, je l’avais appelée start_and_stop_ec2). Ensuite, coche la politique et clique sur le bouton « Ajouter des autorisations ».
N’oublie pas d’ajouter la politique au rôle de ton autre fonction Lambda, les deux doivent l’avoir.
À ce stade, tu peux tester tes deux fonctions Lambda pour vérifier qu’elles démarrent et s’arrêtent bien. Une fois que c’est fait, tu peux passer à la suite.
EventBridge
Maintenant que nous avons deux fonctions Lambda qui permettent respectivement de démarrer et d’éteindre des instances, je vais pouvoir te montrer comment planifier l’exécution de ces fonctions. Pour ce faire, je vais utiliser le service Amazon EventBridge (oui, encore un). Tu peux retrouver le service en tapant son nom dans la barre de recherche centrale.
Déplie le menu « Planificateur » et ouvre « Planifications ». Voici un lien qui te permettra d’y accéder directement, sinon je t’ai mis un screenshot pour trouver le menu.
Ensuite, clique sur le bouton orange « Créer une planification ».
Commence par donner un nom à ta planification.
Dans notre cas, on veut avoir une planification récurrente qui s’exécute tous les jours à 6 heures du matin, par exemple. Choisis comme fréquence « Planification récurrente ». Clique sur l’option « Un calendrier basé sur CRON » et adapte les valeurs que j’ai mises pour que cela corresponde à ton besoin. Tu pourras voir une projection des prochains déclenchements.
Moi, je te recommande de choisir une fenêtre flexible de 15 minutes, je pense que ça pourrait optimiser le coût, et dans notre cas, on n’a pas besoin que ça commence pile à l’heure définie.
Ensuite, clique sur « Suivant » tout en bas de la page.
Il va maintenant falloir aller chercher notre fonction Lambda de démarrage, on va donc choisir comme cible « AWS Lambda ».
Dans le panneau suivant, sélectionne la fonction de démarrage que tu as précédemment créée, puis passe à la suite en cliquant sur le bouton « Suivant ».
Ici choisis les mêmes options que moi.
Dans la section « Autorisations », laisse le choix par défaut, renomme juste le rôle pour qu’il soit plus explicite, mais cela n’a pas grande importance.
Ensuite, tu peux cliquer sur « Suivant », tu arriveras sur le récapitulatif de la planification. Descends tout en bas et clique sur « Créer une planification ».
Pour finir, crée une nouvelle planification pour la fermeture : c’est exactement la même chose, tu choisis l’heure de déclenchement le soir et tu exécutes la fonction Lambda qui éteint les instances.
Bonne nuit !
Voilà, le système de démarrage et d’arrêt automatique est en place. Il ne te reste plus qu’à constater les changements au niveau de ta facturation. J’espère qu’avec ce tuto tu pourras faire des économies d’argent.
20/07/2025
Yann Vangampelaere - nouslesdevs -