Si administráis Amazon Web Services, alguna vez os habrá pasado la necesidad del cliente de ahorrar coste con el servicio de EC2.
El servicio de EC2 no tiene una interfaz o un programador de tareas de momento para hacer un uso inteligente de apagado y encendidos de las instancias.
Esta claro que un administrador de sistemas, no va a estar pendiente a las 12 de la noche para apagar la instancia (Si lo de apagar un sistema lo puedes hacer con un cron en Linux o con un programador de tareas de Windows) o encender la instancia EC2 a las 4 de la mañana. Debido que seria absurdo, lo que nos interesa a todo persona que administre sistemas es automatizar y controlar que todo vaya correcto.
Os voy a explicar como encender y apagar automáticamente las instancias EC2 a tu antojo con el servicio Lambda.
Primer paso
Debéis crear un Policy (Política) para que el servicio Lambda pueda ayudarnos a apagar/encender nuestras instancias, esto lo tenéis que crear en el apartado IAM.
Cuando creáis la política os recomiendo que le pongáis un nombre relacionado con la acción, como por ejemplo: EC2InstanceStartStop
En la política en la pestaña de JSON debéis añadir lo siguiente:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "EC2InstanceStartStop", "Effect": "Allow", "Action": [ "ec2:DescribeInstanceStatus", "ec2:DescribeInstances", "ec2:StartInstances", "ec2:StopInstances" ], "Resource": [ "*" ] }, { "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Effect": "Allow", "Resource": "arn:aws:logs:*:*:*" } ]
Una vez creada la política, vamos al apartado de roles y seleccionamos AWS Lambda para el Tipo de Rol
En el siguiente paso debemos enlazar la política que con una simple búsqueda de la política EC2InstanceStartStop podremos encontrar fácilmente.
Una vez seleccionada debemos ir al siguiente paso:
Ponerle una etiqueta con acorde a la política y función, por ejemplo EC2InstanceStartStop
Segundo Paso
Nos dirigimos a la consola de Lambda, hacemos clic en Crear una función, en este caso voy a crear la función de EC2InstanceStart ya que va a ser solo para encender la instancia.
Una vez acabada la función EC2InstanceStart, deberás hacer lo mismo pero con la de apagado.
En la pantalla de crear una función hacemos clic en Crear desde Cero.
En el apartado de Información básica escribimos un nombre relacionado con todo lo anterior, por ejemplo EC2InstanceStartStop.
En el apartado de tiempo de ejecución seleccionamos Node.js 12.x que es lenguaje que vamos a usar con Lambda.
Una vez en el panel de nuestra función EC2InstanceStartStop de lambda hacemos clic en el desencadenador para definir a que hora queremos ejecutar nuestro código de apagar y encender las instancias.
En el apartado de desencadenador debemos seleccionar EventBride (CloudWatch Events)
En la pantalla de la configuración del desencadenador realizamos lo siguiente:
- Crear una regla nueva
- Nombre de la regla (Por ejemploEC2InstanceStart)
- En tipo de regla seleccionamos Expresión de programación
- Expresión de programacion debemos añadir la programación horaria en la que queramos que nuestro servidor se encienda en este caso cron(0 7 ? * MON-FRI *) que traducido en legible significa de Lunes a Viernes a las 07:00 segun la zona horaria GMT 0 de AWS se ejecutara nuestra función.
- Una vez todo rellenado, hacemos clic en agregar.
No te desanimes, ya queda poco para acabar.
PASO 3
En el apartado de nuestra función ahora aparecerá nuestro desencadenador y debemos hacer clic en el icono llamado EC2InstanceStart.
Abajo de la misma pantalla de nuestra función nos aparece lo siguiente:
Debemos hacer clic en Index.js y borrar todo el contenido para pegar el siguiente código.
En este código es para arrancar la instancia y es importante cambiar lo siguiente:
- ‘REGION’ por la región actual de tu instancia de EC2
- ‘INSTANCEID’ por la id de tu instancia de EC2
var AWS = require('aws-sdk'); exports.handler = function(event, context) { var ec2 = new AWS.EC2({region: 'REGION'}); ec2.startInstances({InstanceIds : ['INSTANCEID'] },function (err, data) { if (err) console.log(err, err.stack); // an error occurred else console.log(data); // successful response context.done(err,data); }); };
Si en caso quisieras parar la instancia es el siguiente código:
var AWS = require('aws-sdk'); exports.handler = function(event, context) { var ec2 = new AWS.EC2({region: 'REGION'}); ec2.stopInstances({InstanceIds : ['INSTANCEID'] },function (err, data) { if (err) console.log(err, err.stack); // an error occurred else console.log(data); // successful response context.done(err,data); }); };
Deberías cambiar los mismos datos que en arrancar la instancia.
En el apartado de abajo en configuracion basica hacemos clic en editar.
Una vez en configuración básica debemos asegurarnos que tiene 128 MB de memoria y esta ejecutando nuestro rol de EC2InstanceStartStop.
Nos faltaría añadir una capa a nuestra función de Lambda seleccionando en Layers y luego haciendo clic en Añadir una nueva capa.
En la ventana de la capa seleccionamos Capas de AWS y Seleccionamos por ejemplo AWSLambda-Perl5 con la versión 17.
Con estos pasos realizados nuestra instancia de EC2 automáticamente se encenderá sin depender de ti.