Comment arrêter et démarrer des instances Amazon EC2 à des intervalles réguliers avec Lambda ?
Dernière mise à jour : 23/02/2023
Je souhaite réduire mon utilisation d'Amazon Elastic Compute Cloud (Amazon EC2) en arrêtant et en démarrant mes instances EC2 automatiquement.
Brève description
Remarque : la résolution suivante est une solution simple. Pour une solution plus avancée, utilisez AWS Instance Scheduler. Pour plus d'informations, consultez Automatiser le démarrage et l'arrêt des instances AWS.
Pour utiliser Lambda afin d'arrêter et de démarrer des instances EC2 à intervalles réguliers, procédez comme suit :
1. Créez un rôle d'exécution et une stratégie AWS Identity and Access Management (IAM) personnalisés pour votre fonction Lambda.
2. Créez des fonctions Lambda pour démarrer et arrêter vos instances EC2.
3. Testez votre fonction Lambda.
4. Créez des règles EventBridge qui exécutent votre fonction selon une planification.
Remarque : vous pouvez également créer des règles qui réagissent à des événements qui se produisent dans votre compte AWS.
Résolution
Remarque : si vous recevez une erreur Client error on launch (Erreur du client lors du lancement) après avoir effectué les étapes suivantes, consultez Lorsque je démarre mon instance avec des volumes chiffrés attachés, celle-ci s'arrête immédiatement avec l'erreur « client error on launch » (Erreur du client lors du lancement).
Générez les ID des instances EC2 que vous souhaitez arrêter et démarrer. Ensuite, procédez comme suit :
Créez une stratégie IAM et un rôle d'exécution pour votre fonction Lambda
1. Créez une politique IAM à l'aide d'un éditeur de stratégie JSON. Copiez et collez le document de stratégie JSON suivant dans l'éditeur de politique :
{
"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": "*"
}
]
}
2. Créez un rôle IAM pour Lambda.
Important : Lorsque vous associez une stratégie d'autorisations à Lambda, assurez-vous de choisir la stratégie IAM que vous venez de créer.
Créez des fonctions Lambda pour démarrer et arrêter vos instances EC2
1. Ouvrez la console Lambda, puis sélectionnez Create function (Créer une fonction).
2. Choisissez Créer à partir de zéro.
3. Sous Basic information (Informations de base), ajoutez les informations suivantes :
Pour Function name (Nom de la fonction), saisissez un nom l'identifiant comme la fonction utilisée pour arrêter vos instances EC2. Par exemple, « StopEC2Instances ».
Dans le champ Runtime (Exécution), choisissez Python 3.9.
Sous Permissions (Autorisations), développez Change default execution role (Modifier le rôle d'exécution par défaut).
Sous Execution role (Rôle d'exécution), choisissez Use an existing role (Utiliser un rôle existant).
Sous Rôle existant, choisissez le rôle IAM que vous avez créé plut tôt.
4. Sélectionnez Créer une fonction.
5. Sous Code, Code source (Source du code), copiez et collez le code suivant dans le volet de modification de l'éditeur de code : (lambda_function). Ce code arrête les instances EC2 que vous identifiez.
Exemple de code de fonction pour arrêter des instances EC2
import boto3
region = 'us-west-1'
instances = ['i-12345cb6de4f78g9h', 'i-08ce9b2d7eccf6d26']
ec2 = boto3.client('ec2', region_name=region)
def lambda_handler(event, context):
ec2.stop_instances(InstanceIds=instances)
print('stopped your instances: ' + str(instances))
Important : pour region (Région), remplacez « us-west-1 » par la région AWS dans laquelle se trouve vos instances. Pour instances, remplacez les ID d'instance EC2 d'exemple avec les ID des instances spécifiques que vous souhaitez arrêter et démarrer.
6. Choisissez Deploy (Déployer).
7. Dans l'onglet Configuration, sélectionnez General configuration (Configuration générale), puis Edit (Modifier). Définissez Timeout (Délai d'attente) sur 10 secondes, puis sélectionnez Save (Enregistrer).
Remarque : configurez les paramètres de la fonction Lambda de la manière requise pour votre cas d'utilisation. Par exemple, pour arrêter et démarrer plusieurs instances, une valeur différente peut être nécessaire pour Timeout (Délai d'attente) et Memory (Mémoire).
8. Répétez les étapes 1-7 pour créer une autre fonction. Procédez comme suit pour que cette fonction démarre vos instances EC2 :
À l'étape 3, saisissez une valeur Function name (Nom de la fonction) différente de celle que vous avez utilisée précédemment. Par exemple, « StartEC2Instances ».
À l'étape 5, copiez et collez le code suivant dans le volet de modification de l'éditeur de code : (lambda_function).
Exemple de code de fonction pour démarrer des instances EC2
import boto3
region = 'us-west-1'
instances = ['i-12345cb6de4f78g9h', 'i-08ce9b2d7eccf6d26']
ec2 = boto3.client('ec2', region_name=region)
def lambda_handler(event, context):
ec2.start_instances(InstanceIds=instances)
print('started your instances: ' + str(instances))
Important : pour region (Région) et instances, utilisez les mêmes valeurs que celles utilisées pour le code d'arrêt de vos instances EC2.
Tester vos fonctions Lambda
1. Ouvrez la console Lambda, puis sélectionnez Functions (Fonctions).
2. Choisissez l'une des fonctions que vous avez créées.
3. Cliquez sur l'onglet Code.
4. Dans la section Code source (Source du code), sélectionnez Test.
5. Dans la boîte de dialogue Configure test event (Configurer un événement de test), choisissez Create new test event (Créer un nouvel événement de test).
6. Saisissez un Event name (Nom d'événement). Ensuite, sélectionnez Create (Créer).
Remarque : ne modifiez pas le code JSON de l'événement de test. La fonction ne l'utilise pas.
7. Choisissez Test pour exécuter la fonction.
8. Répétez les étapes 1-7 pour l'autre fonction créée.
Vérifier l'état de vos instances EC2
Console de gestion AWS
Vous pouvez vérifier l'état de vos instances EC2 avant et après avoir effectué le test pour confirmer que vos fonctions fonctionnent comme prévu.
AWS CloudTrail
Vous pouvez utiliser CloudTrail pour rechercher des événements et confirmer que la fonction Lambda a arrêté ou démarré l'instance EC2.
1. Ouvrez la console CloudTrail.
2. Dans le volet de navigation, sélectionnez Historique des événements.
3. Sélectionnez la liste déroulante Lookup attributes (Attributs de recherche), puis sélectionnez Event name (Nom de l'événement).
4. Dans la barre de recherche, saisissez StopInstances pour consulter les résultats.
5. Dans la barre de recherche, saisissez StartInstances pour consulter les résultats.
S'il n'y a aucun résultat, la fonction Lambda n'a pas arrêté ni démarré les instances EC2.
Créer des règles EventBridge qui exécutent vos fonctions Lambda
1. Ouvrez la console EventBridge.
2. Sélectionnez Create rule (Créer une règle).
3. Saisissez un Name (Nom) pour votre règle, par exemple « StopEC2Instances ». (Facultatif) Saisissez une description de la règle dans Description.
4. Pour Rule type (Type de règle), sélectionnez Schedule (Planification), puis sélectionnez Continue in EventBridge Scheduler (Continuer dans EventBridge Scheduler).
5. Pour Schedule pattern (Schéma de planification), sélectionnez Recurring schedule (Planification récurrente). Effectuez l'une des étapes suivantes :
Sous Schedule pattern (Schéma de planification), pour Occurrence, sélectionnez Recurring schedule (Planification récurrente). Puis, effectuez l'une des étapes suivantes :
Lorsque Schedule type (Type de planification) est défini sur Rate-based schedule (Planification basée sur le taux), pour Rate expression (Expression rate), saisissez une valeur de taux et sélectionnez un intervalle de temps en minutes, heures ou jours.
Lorsque Schedule type (Type de planification) est défini sur Cron-based schedule (Planification basée sur cron) Pour Cron expression (Expression cron), saisissez une expression qui indique à Lambda quand arrêter votre instance. Pour plus d'informations sur la syntaxe des expressions, consultez Expressions de planification des règles.
Remarque : les expressions cron sont évaluées selon l'heure UTC. Veillez à ajuster l'expression pour le fuseau horaire de votre choix.
6. Dans Select targets (Sélectionner des cibles), sélectionnez Lambda function (Fonction Lambda) dans la liste déroulante Target (Cible).
7. Pour Function (Fonction), choisissez la fonction qui arrête vos instances EC2.
8. Sélectionnez Skip to review and create (Passer à la vérification et à la création), puis Create (Créer).
9. Répétez les étapes 1-8 pour créer une règle afin de démarrer vos instances EC2. Effectuez les étapes suivantes différemment :
Saisissez un nom pour votre règle, comme « StartEC2Instances ».
(Facultatif) Dans Description, saisissez une description pour votre règle, telle que « Démarre les instances EC2 tous les matins à 7 heures ».
Dans l'étape 5, pour le champ Cron expression (Expression cron), saisissez une expression qui indique à Lambda quand démarrer vos instances.
Dans l'étape 7, pour le champ Function (Fonction), choisissez la fonction qui démarre vos instances EC2.
informations connexes
Cet article vous a-t-il été utile ?
Besoin d'aide pour une question technique ou de facturation ?