Arrêter et démarrer automatiquement des instances sur AWS

By Abdennacer Allaoui | 21 April 2017

Introduction

Une problématique courante sur le Cloud public est de pouvoir arrêter et démarrer des instances automatiquement à certaines heures. Le cas d’usage le plus courant est pour les machines de développement, sur des projets mono-pays ou tout du moins mono fuseau horaire.

Personne ne travaille la nuit, autant éteindre les machines.

Sur AWS, une instance éteinte de 20h à 8h et les week-ends coute 65% de moins qu’une machine allumée tout le temps !

Pour arrêter et démarrer les instances, nous utiliserons des fonctions lambda.

L’objectif est d’arrêter toutes les instances qui comportent le tag AutoOff, et d’allumer toutes celles qui ont le tag AutoOn.

Arrêter une instance

Le code de la fonction Lambda est le suivant :

import boto3
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

ec2 = boto3.resource('ec2')

def lambda_handler(event, context):
    filters = [{
            'Name': 'tag:AutoOff',
            'Values': ['True']
        },
        {
            'Name': 'instance-state-name', 
            'Values': ['running']
        }
    ]

    instances = ec2.instances.filter(Filters=filters)

    RunningInstances = [instance.id for instance in instances]

    if len(RunningInstances) > 0:
        shuttingDown = ec2.instances.filter(InstanceIds=RunningInstances).stop()
        print shuttingDown
    else:
        print "Nothing to see here"

Démarrer une instance

Le code de la fonction Lambda est le suivant :

import boto3
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

ec2 = boto3.resource('ec2')

def lambda_handler(event, context):
    filters = [{
            'Name': 'tag:AutoOn',
            'Values': ['True']
        },
        {
            'Name': 'instance-state-name', 
            'Values': ['stopped']
        }
    ]
    
    instances = ec2.instances.filter(Filters=filters)

    StoppedInstances = [instance.id for instance in instances]

    if len(StoppedInstances) > 0:
        startingUp = ec2.instances.filter(InstanceIds=StoppedInstances).start()
        print startingUp
    else:
        print "Nothing to see here"

Scheduler l’exécution de la fonction Lambda

Une fois les fonctions lambda créées, il faut les programmer pour se lancer à l’heure désirée.

AWS conseille de passer par un événement CloudWatch programmé. Il faut donc se rendre dans CloudWatch / Event / Create Rule

Creation d'un event Cloudwatch

Creation d'un event Cloudwatch