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 Lambda
- 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
Vamos a la consola de AWS Servicio Lambda y creamos una función que denominaremos Encendido Servidor Telmo J que refiere al nombre del servidor que nosotros hemos nombrado.
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.
Una vez hemos terminado las 2 Lambdas vamos a al servicio de Cloud Watch — ) Event Rules para disparar los eventos a través de un horario que definamos.
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?
Tenga en cuenta algunas recomendaciones que puede ayudar a revisar cuál puede ser el problema:
- 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/