Detener e Iniciar instancias EC2 usando Lambda y Python3

Hello World 🙂

Si estás inmerso en el mundo de la nube pública, es probable que en algún momento necesites analizar tus costos y encontrar formas de optimizarlos. En el caso de AWS, es común centrarse en las instancias EC2, ya que son uno de los recursos más utilizados por las empresas. A menudo descubres que hay instancias que solo se utilizan durante las horas laborables y que podrías ahorrar algunos dólares, especialmente en entornos como Dev, QAT, Staging, entre otros, que pueden permanecer inactivos durante la noche e incluso los fines de semana.

Hoy, comenzaremos una serie de 3 entradas dedicadas a explorar diferentes métodos para detener e iniciar instancias EC2 en horarios específicos.

  1. Python3 con funciones Lambda

    • Exploraremos cómo aprovechar las funciones Lambda de AWS junto con Python3 para automatizar este proceso.
  2. Cloud Custodian

    • Descubriremos cómo utilizar Cloud Custodian, una herramienta de código abierto, para automatizar también este proceso.
  3. SSM (Systems Manager)

    • Exploraremos cómo dentro del AWS Systems Manager podemos utilizar «Maintenance Windows» automatizar este proceso.

A lo largo de esta serie, proporcionaremos instrucciones detalladas y ejemplos prácticos para cada método, con el objetivo de optimizar costos en AWS y mejorar la eficiencia de los recursos en la nube.

En este primer artículo, exploraremos la poderosa combinación de Lambda junto con Python3 y la librería Boto3. Descubriremos cómo esta combinación puede brindarnos una solución eficiente.

Requisitos:

1- Antes que nada, es crucial agregar un «tag» a nuestras instancias para poder filtrarlas eficientemente. Esta práctica nos ofrece una flexibilidad invaluable en comparación con el filtrado directo por ID. Al añadir un «tag«, podemos controlar fácilmente cuándo queremos que la instancia se apague o encienda según el horario especificado. Si en algún momento ya no necesitamos que la instancia siga este horario, simplemente eliminamos el «tag» correspondiente. Esta metodología no solo es práctica, sino también sencilla de implementar. En este ejemplo agregaremos el tag «stop-start=true» a las instancias EC2.

2- Crear la función Lambda.

En este ejemplo, vamos a crear una función Lambda para detener las instancias. Ir a la sección de Lambda en la consola de AWS.

Nota: Es importante resaltar que tendremos que generar 2 funciones Lambda, una para detener y otra para iniciar las instancias.

  • En este caso vamos a usar un rol existente.
  • El rol seleccionado anteriormente tiene la siguiente política.
    • {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": "logs:CreateLogGroup",
                  "Resource": "arn:aws:logs:us-east-1:############:*"
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "logs:CreateLogStream",
                      "logs:PutLogEvents"
                  ],
                  "Resource": [
                      "arn:aws:logs:us-east-1:############:log-group:/aws/lambda/StopEC2Instances:*"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "ec2:Start*",
                      "ec2:Stop*",
                      "ec2:DescribeInstances*"
                  ],
                  "Resource": "*"
              }
          ]
      }
    • Recuerda cambiar «############» por el # de su cuenta

3- Generar el «trigger» que va a utilizar la función Lambda.

  • Aquí seleccionamos «EventBridge«, el cual nos permite definir un «Schedule expression«, donde vamos a definir el horario para detener o iniciar las instancias.

4- Copiar el código para la función Lambda

  • Copiamos el código y le damos «Deploy«.

5- Si ejecutamos un «Test» de la función, obtenemos lo siguiente:

  • Aquí vemos como las instancias fueron detenidas correctamente.

6- Puedes ir a la sección de «Monitor » de la Lambda y obtener información de la misma.

En el procedimiento anterior, hemos combinado el uso de tags en las instancias EC2 junto con Lambda. Sin embargo, si prefieres no utilizar tags y, en su lugar, pasar directamente los ID de las instancias a las funciones Lambda, he dejado en el repositorio de GitHub un par de funciones que te permitirán hacerlo de manera sencilla.

Conclusiones

Esta es una buena solución para detener nuestras instancias en un horario específico, lo que resulta especialmente útil cuando necesitamos optimizar costos en la nube. Sin embargo, es importante tener en cuenta que esta función puede consumir un poco más de los 3 segundos que vienen por defecto en Lambda. Es posible que necesites actualizar esta configuración en la función para garantizar un rendimiento óptimo, yo he realizado el mismo procedimiento, pero filtrando solo por el ID de las instancias y no he tenido que realizar esa configuración.

Espero que esta entrada les haya sido útil y que la puedan poner a prueba en sus entornos. No dudes en compartir tus experiencias y preguntas en los comentarios.

¡Nos vemos en la próxima entrada!

Nota: Todo el código lo pueden encontrar en el siguiente repositorio.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Docker

Artículo anterior

De Jenkins a Docker Hub en minutos.
Docker

Siguiente artículo

Liberar espacio ocupado por Docker