Cómo Utilizar AWS Lambda para Apagar/Encender ECS

Cómo Utilizar AWS Lambda para Apagar/Encender ECS

En la era de la nube, la eficiencia de costos es una preocupación clave para las empresas que operan en entornos de infraestructura en la nube como AWS. Uno de los enfoques más efectivos para reducir los costos es apagar la infraestructura cuando no está en uso.

En este artículo, exploraremos cómo utilizar AWS Lambda para automatizar el apagado/encendido de servicios en ECS (Amazon Elastic Container Service) y los beneficios económicos que esto puede aportar.

¿Por qué Apagar Infraestructura No Utilizada?

Cuando ejecutas aplicaciones en la nube, como contenedores en ECS, estás pagando por los recursos que utilizas, ya sean instancias EC2, contenedores en ejecución, o cualquier otro servicio de AWS. Sin embargo, es común que estas aplicaciones no se utilicen las 24 horas del día, los 7 días de la semana. Apagar la infraestructura cuando no está en uso te permite:

  1. Reducir Costos: Al apagar la infraestructura cuando no se está utilizando, puedes evitar pagar por recursos no utilizados, lo que puede generar ahorros significativos a largo plazo.

  2. Optimizar Recursos: Al liberar recursos no utilizados, puedes asignarlos a otras cargas de trabajo que los necesiten, mejorando así la utilización de recursos y optimizando el rendimiento de tu infraestructura.

  3. Cumplir con Buenas Prácticas de Seguridad: Al apagar la infraestructura cuando no se utiliza, reduces la superficie de ataque potencial y proteges tus aplicaciones contra posibles amenazas de seguridad.

Automatización del Apagado con AWS Lambda

AWS Lambda es un servicio de computación sin servidor que te permite ejecutar código en respuesta a eventos sin tener que administrar servidores. Podemos utilizar Lambda para automatizar tareas como el apagado de servicios en ECS cuando no se están utilizando.

Luego nuestro cluster al tener configurado el Capacity Provider se encargara de apagar las instancias EC2 de nuestro Cluster.

A continuación, te explicamos cómo implementar esto:

  1. Escribe la Función Lambda: Utiliza el lenguaje de programación de tu elección (en nuestro caso, Python) para escribir una función Lambda que utilice la biblioteca boto3 de AWS para interactuar con ECS y apagar los servicios deseados.

  2. Configura un Disparador: Configura un disparador para la función Lambda. Esto podría ser un evento de CloudWatch Events programado para ejecutarse en un horario específico, como fuera del horario laboral o en momentos de baja actividad.

  3. Asigna Permisos IAM: Asegúrate de que la función Lambda tenga los permisos necesarios para interactuar con los servicios de ECS. Esto incluye permisos para actualizar servicios y acceder a los recursos necesarios.

  4. Probamos la Lambda: Una vez que hayas implementado la función Lambda, realiza pruebas exhaustivas para asegurarte de que funcione según lo esperado. Al ejecutar la lambda tenes que ver que los servicios en tu Cluster tienen 0 Tasks Running:

Luego de un tiempo (Dependiendo la configuración del ASG y el Capacity Provider), deberías ver como mueren las instancias en tu Cluster:

Automatización del Encendido con AWS Lambda

Para encender las task en nuestros servicios de ECS tenemos que crear una lambda como la anterior pero con el siguiente código. El mismo dejar nuestros servicios con 2 task:

import boto3

def ecs_scale_services(event, context):
    # Configuración de AWS
    ecs_client = boto3.client('ecs')

    # Detalles del cluster
    cluster_name = 'mi-cluster'

    # Lista de nombres de servicios a escalar a 2 tareas
    services_to_scale = ['servicio1', 'servicio2', 'servicio3', 'servicio4', 'servicio5']

    try:
        for service_name in services_to_scale:
            # Escalar cada servicio a 2 tareas
            response = ecs_client.update_service(
                cluster=cluster_name,
                service=service_name,
                desiredCount=2
            )

            # Verificar si la operación fue exitosa
            if response['ResponseMetadata']['HTTPStatusCode'] == 200:
                print(f"Se ha escalado el servicio {service_name} a 2 tareas.")
            else:
                print(f"Error al intentar escalar el servicio {service_name}.")

        return {
            'statusCode': 200,
            'body': 'Todos los servicios han sido escalados a 2 tareas correctamente.'
        }

    except Exception as e:
        print(f"Ocurrió un error: {str(e)}")
        return {
            'statusCode': 500,
            'body': f'Ocurrió un error: {str(e)}'
        }

Beneficios Económicos y Operativos

La automatización del apagado de la infraestructura no solo ofrece beneficios económicos al reducir los costos de AWS, sino que también proporciona beneficios operativos significativos. Algunos de estos beneficios incluyen:

  • Mayor Flexibilidad: Puedes ajustar fácilmente la programación del apagado para adaptarse a las necesidades cambiantes de tu organización.

  • Menor Riesgo: Al reducir la superficie de ataque potencial al apagar la infraestructura no utilizada, disminuyes el riesgo de exposición a amenazas de seguridad.

  • Mejor Utilización de Recursos: Al liberar recursos no utilizados, puedes asignarlos a otras cargas de trabajo que los necesiten, maximizando así la utilización de recursos y optimizando el rendimiento de tu infraestructura.

En resumen, utilizar AWS Lambda para apagar la infraestructura no utilizada en AWS es una estrategia efectiva para reducir costos, optimizar recursos y mejorar la seguridad de tus aplicaciones en la nube. Al automatizar este proceso, puedes lograr ahorros significativos y mejorar la eficiencia operativa de tu infraestructura en la nube.