Revista Tecnología

Automatiza el apagado de instancias EC2 a través de Lambdas en AWS

Publicado el 24 febrero 2016 por Dbigcloud @dbigcloud

Esta semana os traigo otro post relacionado con AWS, como ya mucho sabréis el uso de instancias EC2 es facturado en AWS por horas encendidas entre otras cosas, por lo que si tenemos instancias que no vamos a usar durante todo el día, podemos apagarla sin que nos repercuta nigún gasto. El método oficial para AWS es hacerlo a través del servicio OpsWorks, pero también podemos realizarlo con Lambdas y eventos programados.

aws lambda banner por DBigCloud

En semanas anteriores os mostré cómo podemos automatizar los snapshots de instancias EC2 usando Lambdas, estaría bien leer el post para comprender que son las Lambdas y como funcionan.
Los requisitos poder comprender está entrada es tener los siguientes conocimientos sobre AWS.

   - Cómo crear una IAM Policy
   - Cómo crear un Rol usando una IAM Policy
   - Información sobre instancias EC2.
   - Cómo crear una Lambda.

Crear la IAM Policy

Cómo todo componente de AWS es necesario establecer unos permisos para poder interactuar entre los demás componentes, en este ejemplo necesitamos tener permisos para que Lambda interactúe con EC2, por ello que es necesario crear una policy, la cual he llamado EC2_Start_Stop_from_Lambda, de la siguiente forma:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:Describe*",
                "ec2:Start*",
                "ec2:RunInstances",
                "ec2:Stop*",
                "lambda:AddPermission",
                "lambda:CreateFunction",
                "lambda:GetFunction",
                "lambda:GetPolicy",
                "lambda:ListFunctions",
                "lambda:UpdateFunctionCode",
                "logs:*"
            ],
            "Resource": "*"
        }
    ]
}

Ahora lo siguiente va a ser crear el Rol al que le vamos a asignar esta policy, de esta forma Lambda tendra los permisos para interactuar con EC2, también con CloudWatch para la programación de la tera.  Cuando creéis el Rol aseguraros que seleccionáis como tipo de rol Lambda.

Crear la Lambda

Debemos crear una Lambda desde cero usando cómo tipo de lenguaje python, sin usar ningún tipo de template, posteriormente asignarle el Rol en Configuration, que se ha creado anteriormente y por último en Event sources, crear un nuevo evento de tipo CloudWatch Events - Schedule.

El código fuente de la Lambda sería el siguiente:

import boto3
import sys

try:
    ec2 = boto3.client('ec2')

except Exception, e1:
    error1 = "Error1: %s" % str(e1)
    print(error1)
    sys.exit(0)

id_instance = 'xxxxxxx'

def check_instance_status(id):
    try:
        return ec2.describe_instance_status(
            InstanceIds = [id]
         )
    except Exception, e2:
        error2 = "Error2: %s" % str(e2)
        print(error2)
        sys.exit(0)

def stopInstance(id):
    print "++++++++++++++++++"
    print "Stopping instance"
    print "++++++++++++++++++"
    try:
         ec2.stop_instances(
            InstanceIds = [id]
         )
    except Exception, e2:
        error2 = "Error2: %s" % str(e2)
        print(error2)
        sys.exit(0)

def lambda_handler(event, context):
    status = check_instance_status(id_instance)
    for stat in status['InstanceStatuses']:
        if stat['InstanceState']['Name'] != 'stopped' :
            stopInstance(id_instance)
        else:
            print 'Instancia con id: ' + id_instance + ' apagada, no es necesario volverla a apagar'

Tenéis que aseguraros que en la variable id_instance añadáis el id de la instancia que queréis apagar, ¿Tenéis varias instancias? con unas simples modificaciones en dicha variables podéis usarla ya que el método stop_instances recibe como parámetro un array de IDs.

La lambda quedaría de la siguiente forma:

 

Lambdas con EC2 AWS por DBigCloud

Para no hacer el post interminable he subido los scripts al repositorio de GitHub de DBigCloud, alli podéis descargar el script para encender la instancia.

Para ver la tarea programada (o crear nuevas) podemos irnos a CloudWatch -> Events - Rules, en la siguiente imagen vemos cómo queda:

lambda schedule aws por DBigCloud

De esta forma podemos crear tareas programadas como si de un crontab de linux se tratase, ya que la API de AWS permite realizar casi cualquier operación sobre instancias EC2, espero que os sea de utilidad.


Compártelo:


Volver a la Portada de Logo Paperblog

Revista