Como puedo prender y apagar automáticamente instancias Amazon Ec2 por demanda basado en horarios.

En muchos casos nos hemos encontrado con la necesidad de encender y apagar instancias Amazon Ec2 (tanto Linux como windows) de manera automática en ciertos horarios para ahorrar costos .

La solución que compartimos se hace escalable y adicionalmente a mi parecer ha sido la manera mas económica de hacerlo.

Servicios que usaremos en AWS

  • Amazon cloud Watch
  • Event Rules

Crearemos las funciones Lambdas tanto de Encendido → Start , Apagado Stop de la siguiente manera.

1. Creamos una Política IAM.

El código JSON que debes copiar y pegar en el punto 2 de la imagen es el siguiente :

{
"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": "*"
}
]
}

asignamos un nombre a la política que en nuestro caso le pondremos “Ec2PlayandStop” y damos crear.

Nos muestra que hemos creado satisfactoriamente la política que luego vamos a adicionar al Role de IAM para Lambda.

2. Creamos un rol IAM para Lambda

3. Creamos la Lambda

Al crear la función ponemos el nombre “EncendidoservidorTelmoJ”, seleccionamos la versión del run time “python 3.8” y lo mas importante buscamos el rol creado en el paso 2 “PlayandStoproleBlog”.

Una Vez creada la función Lambda copiamos y pegamos el siguiente código teniendo no sin antes tener identificado la o las instancias ID por que los necesitará poner en el código.

import boto3
region = 'us-east-1'
instances = ['i-0cff3a00763a57d01']
ec2 = boto3.client('ec2', region_name=region)
def lambda_handler(event, context):
ec2.start_instances(InstanceIds=instances)
print('started your instances: ' + str(instances))

Para nuestro caso hemos visto antes en la consola de EC2 el ID de la instancia que vamos aplicar el encendido. i

En los Setting del TimeOut recomendamos poner 10 seg

Nota: Configure los ajustes de la función Lambda según sea necesario para su caso de uso. Por ejemplo, si desea detener e iniciar varias instancias, es posible que necesite un valor diferente para Tiempo de espera, así como para Memoria.

Damos guardar la función para finalizar la Lambda de encendido.

Ahora repetimos todo el paso 3 y creamos de la misma manera la Lambda de apagado.

import boto3
region = 'us-east-1'
instances = ['i-0cff3a00763a57d01']
ec2 = boto3.client('ec2', region_name=region)
def lambda_handler(event, context):
ec2.stop_instances(InstanceIds=instances)
print('started your instances: ' + str(instances))

4. Creación de Reglas en Cloud Watch.

Paso 1: Para nuestro ejemplo necesitamos que el servidor se encienda

Debes escoger Schedule y poner la expresión del Cron que mas se adecué a la programación de encendido de su servidor , en nuestro caso para la hora en Bogotá -Colombia pondremos la regla que todos los días se encienda a las 4:30 AM .

30 9 ? * 1-7 *

Nota: Tome en cuenta que la hora tomada por AWS es GMT por lo que deberá hacer la conversión para su zona horaria.

Paso 2: Debe escoger el Target adecuado de la función Lambda para este caso “EncendidoservidorTelmoJ”

Paso 3: Se configura los detalle de la Regla como nombre, descripción y estado de la regla “Enable” y damos crear rule.

Vemos la Regla creada en nuestro panel de reglas y solo tendríamos que esperar la hora indicada para ver que se encienda automáticamente.

Repetimos el mismo paso de la creación de la Regla pero con la Lambda de Apagado con hora 11:50 PM todos los días Hora Bogotá — Colombia.

Expresión Cron.

50 4 ? * 1-7 *

Luego al esperar la hora programado en nuestro Test de apagado podemos ver que se ejecutó correctamente

¿He realizado todos los pasos del Blog pero no funciona?

  • Revise siempre los Logs de la función Lambda pues le permitirá saber cuál puede ser la falla.

ingrese a la Lambda que esta fallando y ubique dentro de sus métricas “Error count and succes rate” → View

Ubique el Log Group con el nombre de la Lambda y verifique cuál pudiera ser el problema.

podrá encontrar algún error como que el ID de la instancia no existe ya sea por que esta incorrecto o por que esta poniendo la región de manera incorrecta.

Fuente de consulta : https://aws.amazon.com/premiumsupport/knowledge-center/start-stop-lambda-cloudwatch/

Entrepreneur, travel lover, AWS x3, CIO High Cloud Tec , AWS Community Builder, passionate about cloud learning

Entrepreneur, travel lover, AWS x3, CIO High Cloud Tec , AWS Community Builder, passionate about cloud learning