Compartir en Twitter
Go to Homepage

CÓMO CREAR CRON JOBS CON AWS LAMBDA Y CLOUDWATCH

November 18, 2025

Introducción a los Cron Jobs en AWS Lambda

En el entorno de la computación en la nube, la automatización de tareas administrativas sigue siendo una necesidad crítica para optimizar recursos y reducir la intervención manual. Los cron jobs son herramientas esenciales que permiten programar comandos o scripts para que se ejecuten en momentos específicos o con una periodicidad definida. Tradicionalmente utilizados en sistemas Unix para tareas como respaldos, monitoreo del sistema o mantenimiento, los cron jobs han evolucionado para adaptarse a entornos serverless como AWS Lambda. Este tutorial explica cómo configurar cron jobs en AWS Lambda utilizando Amazon CloudWatch Events para automatizar tareas en la nube, como la gestión de instancias EC2, sin la necesidad de administrar infraestructura subyacente. A través de un ejemplo práctico, aprenderás a implementar funciones Lambda que se ejecuten en horarios específicos, utilizando AWS SAM (Serverless Application Model) para definir la infraestructura como código.

AWS Lambda es un servicio de computación serverless que ejecuta código en respuesta a eventos, eliminando la necesidad de aprovisionar o gestionar servidores. Al combinarlo con CloudWatch Events, puedes programar estas funciones para que se ejecuten automáticamente, replicando el comportamiento de los cron jobs tradicionales. Este enfoque es ideal para tareas repetitivas, como encender o apagar instancias EC2 en horarios específicos, procesar datos o realizar mantenimientos periódicos. A lo largo de este artículo, se detalla paso a paso cómo configurar un cron job en AWS Lambda, incluyendo la definición de la función, la programación de eventos y la interacción con recursos como EC2 mediante el AWS SDK.

Requisitos Previos

Antes de comenzar, asegúrate de cumplir con los siguientes requisitos para seguir el tutorial sin inconvenientes:

  • Una cuenta activa de AWS con permisos para crear funciones Lambda, reglas de CloudWatch Events y gestionar instancias EC2.
  • Al menos una instancia EC2 configurada en tu cuenta de AWS, ya que el ejemplo práctico implica encender y apagar estas instancias.
  • AWS CLI instalado y configurado en tu máquina local o en un entorno como AWS Cloud9 IDE.
  • AWS SAM CLI instalado para desplegar la infraestructura como código.
  • Conocimientos básicos de Node.js, ya que el ejemplo utiliza este runtime, aunque los conceptos son aplicables a otros lenguajes soportados por Lambda (Python, Java, etc.).
  • Un editor de código o IDE para trabajar con los archivos de configuración y el código de la función.

Si prefieres trabajar en un entorno preconfigurado, AWS Cloud9 IDE es una excelente opción, ya que incluye AWS SAM y otras herramientas necesarias. Puedes crear un entorno Cloud9 desde la consola de AWS y clonar el código de ejemplo desde un repositorio GitHub, como se detalla más adelante.

Entendiendo Amazon CloudWatch Events

Amazon CloudWatch Events es un servicio que permite monitorear cambios en los recursos de AWS y reaccionar a ellos mediante la generación de eventos. Estos eventos pueden desencadenar acciones, como invocar una función Lambda, enviar notificaciones a SNS o encolar mensajes en SQS. En el contexto de los cron jobs, CloudWatch Events ofrece la capacidad de programar la ejecución de funciones Lambda en intervalos regulares o en momentos específicos, utilizando expresiones cron o rate.

Las expresiones cron en CloudWatch Events constan de seis campos separados por espacios, que especifican minutos, horas, día del mes, mes, día de la semana y año. Por ejemplo, la expresión cron(0 8 * * ? *) programa una tarea para que se ejecute todos los días a las 8:00 AM UTC. Las expresiones rate, por otro lado, son más simples y especifican intervalos regulares, como rate(5 minutes) para ejecutar una tarea cada cinco minutos. Este tutorial utiliza expresiones cron para mayor precisión en la programación.

Un caso de uso común es automatizar la gestión de instancias EC2. Por ejemplo, puedes configurar una función Lambda que encienda instancias de desarrollo a las 8:00 AM y las apague a las 6:00 PM, optimizando costos al evitar que las instancias permanezcan activas fuera del horario laboral. CloudWatch Events actúa como el disparador que invoca la función Lambda en el momento especificado.

# Ejemplo de expresión cron en CloudWatch Events
ScheduleExpression: cron(0 8 * * ? *)

Configuración del Entorno con AWS SAM

Para este tutorial, utilizaremos AWS SAM, una extensión de AWS CloudFormation que simplifica la definición y despliegue de aplicaciones serverless. AWS SAM permite definir funciones Lambda, eventos y permisos en un archivo YAML, facilitando la gestión de la infraestructura como código.

Primero, crea un directorio para tu proyecto y genera un archivo template.yml que definirá las funciones Lambda y las reglas de CloudWatch Events. A continuación, se muestra la estructura básica del directorio:

.
├── cron
│   └── handler.js
├── template.yml

El archivo template.yml contendrá la definición de dos funciones Lambda: una para encender instancias EC2 y otra para apagarlas. A continuación, se explica cómo configurar este archivo.

Definición de la Función Lambda en AWS SAM

El archivo template.yml define la infraestructura de las funciones Lambda, incluyendo su código, runtime, permisos y disparadores. A continuación, se muestra un ejemplo de la definición de la función que enciende instancias EC2:

Resources:
    StartInstanceFunction:
        Type: AWS::Serverless::Function
        Properties:
            Handler: cron/handler.startInstance
            CodeUri: ./
            Runtime: nodejs18.x
            Environment:
                Variables:
                    INSTANCE_IDS: !Ref InstanceIds
            Policies:
                - Statement:
                      - Effect: Allow
                        Action:
                            - ec2:StartInstances
                        Resource: "*"
            Events:
                Schedule:
                    Type: Schedule
                    Properties:
                        Schedule: cron(0 8 * * ? *)

Analicemos los componentes clave de esta definición:

  • Handler: Especifica el archivo y la función que se ejecutará. En este caso, cron/handler.startInstance indica que la función startInstance está en el archivo handler.js dentro del directorio cron.
  • CodeUri: Indica la ubicación del código de la función. Aquí, ./ apunta al directorio raíz del proyecto.
  • Runtime: Define el entorno de ejecución, en este caso, Node.js 18.x. Otros runtimes soportados incluyen Python, Java, Go y C#.
  • Environment: Permite pasar variables de entorno, como una lista de IDs de instancias EC2, que se configuran durante el despliegue.
  • Policies: Define los permisos de la función. Aquí, se otorga permiso para la acción ec2:StartInstances sobre todos los recursos EC2 (*). Para entornos de producción, limita los recursos a IDs específicos.
  • Events: Configura el disparador de la función. La expresión cron(0 8 * * ? *) programa la ejecución todos los días a las 8:00 AM UTC.

Para la función que apaga las instancias, la definición es similar, pero con una acción diferente (ec2:StopInstances) y una expresión cron ajustada a las 6:00 PM (cron(0 18 * * ? *)).

Implementación del Código de la Función Lambda

El código de la función Lambda se implementa en el archivo handler.js dentro del directorio cron. Este archivo contiene dos funciones: startInstance para encender instancias y stopInstance para apagarlas. A continuación, se muestra el código para startInstance:

const AWS = require("aws-sdk");
const ec2 = new AWS.EC2();

exports.startInstance = async (event, context) => {
    try {
        const instanceIds = process.env.INSTANCE_IDS.split(",");
        const params = {
            InstanceIds: instanceIds,
        };
        await ec2.startInstances(params).promise();
        console.log(`Instancias ${instanceIds} encendidas con éxito`);
        return {
            statusCode: 200,
            body: JSON.stringify("Instancias encendidas"),
        };
    } catch (error) {
        console.error(`Error al encender instancias: ${error}`);
        throw error;
    }
};

Este código realiza las siguientes acciones:

  • Importa el AWS SDK y crea un cliente EC2.
  • Obtiene los IDs de las instancias desde la variable de entorno INSTANCE_IDS.
  • Llama al método startInstances del cliente EC2, pasando los IDs de las instancias.
  • Registra el resultado en CloudWatch Logs y devuelve una respuesta.

El código para stopInstance es similar, pero utiliza el método stopInstances:

exports.stopInstance = async (event, context) => {
    try {
        const instanceIds = process.env.INSTANCE_IDS.split(",");
        const params = {
            InstanceIds: instanceIds,
        };
        await ec2.stopInstances(params).promise();
        console.log(`Instancias ${instanceIds} apagadas con éxito`);
        return {
            statusCode: 200,
            body: JSON.stringify("Instancias apagadas"),
        };
    } catch (error) {
        console.error(`Error al apagar instancias: ${error}`);
        throw error;
    }
};

Despliegue del Proyecto con AWS SAM

Para desplegar las funciones Lambda y las reglas de CloudWatch Events, utiliza AWS SAM CLI. Sigue estos pasos:

  1. Asegúrate de que tu directorio contiene el archivo template.yml y el directorio cron con handler.js.
  2. Ejecuta el siguiente comando para empaquetar y desplegar el proyecto:
sam deploy --guided

Este comando inicia un proceso interactivo donde se te pedirá:

  • Un nombre para el stack de CloudFormation.
  • La región de AWS donde se desplegará el proyecto (debe coincidir con la región de tus instancias EC2).
  • Una lista de IDs de instancias EC2, separadas por comas.

Por ejemplo:

Stack Name [sam-app]: cron-job-demo
AWS Region [us-east-1]: us-west-2
Parameter InstanceIds []: i-1234567890abcdef0,i-0987654321fedcba0

Una vez completado, AWS SAM creará las funciones Lambda, las reglas de CloudWatch Events y los permisos necesarios. Puedes verificar el despliegue en la consola de AWS, en los servicios Lambda y CloudWatch.

Pruebas y Monitoreo

Después de desplegar las funciones, espera hasta el horario programado (8:00 AM o 6:00 PM UTC) para verificar que las instancias EC2 se enciendan o apaguen. Alternativamente, modifica la expresión cron en template.yml para ejecutar la función en los próximos minutos, por ejemplo, cron(5 * * * ? *) para ejecutarla cinco minutos después de la hora actual.

Para monitorear la ejecución, utiliza CloudWatch Logs:

  1. Ve a la consola de CloudWatch y selecciona “Log groups”.
  2. Busca el grupo de logs asociado a tus funciones Lambda (por ejemplo, /aws/lambda/StartInstanceFunction).
  3. Revisa los registros para confirmar que las instancias se encendieron o apagaron correctamente.

También puedes verificar el estado de las instancias en la consola de EC2. Si la función startInstance se ejecuta, las instancias pasarán al estado “running”, y si stopInstance se ejecuta, cambiarán a “stopped”.

Limpieza de Recursos

Para evitar costos innecesarios, elimina los recursos creados después de probar el cron job:

  1. Ve a la consola de CloudFormation y selecciona el stack creado por AWS SAM (por ejemplo, cron-job-demo).
  2. Haz clic en “Delete” para eliminar las funciones Lambda, las reglas de CloudWatch Events y los permisos asociados.
  3. Si creaste instancias EC2 específicas para este tutorial, termínalas desde la consola de EC2.

Este proceso asegura que no incurras en cargos adicionales por recursos no utilizados.

Personalización y Casos de Uso Avanzados

Una vez que domines la configuración básica, puedes personalizar los cron jobs para otros casos de uso. Algunos ejemplos incluyen:

  • Procesamiento de datos periódico: Configura una función Lambda para procesar logs o datos en S3 cada hora.
  • Notificaciones automáticas: Envía alertas a través de SNS o SES si un recurso excede ciertos umbrales.
  • Mantenimiento de bases de datos: Ejecuta scripts SQL para limpiar o respaldar bases de datos en RDS.

Para casos más complejos, considera usar expresiones cron más específicas. Por ejemplo, para ejecutar una tarea solo de lunes a viernes a las 9:00 AM, usa cron(0 9 ? * MON-FRI *). También puedes integrar otras herramientas de AWS, como Step Functions para orquestar múltiples tareas o DynamoDB para almacenar configuraciones dinámicas de horarios.

Conclusiones

La combinación de AWS Lambda y Amazon CloudWatch Events ofrece una solución poderosa para automatizar tareas en la nube sin la necesidad de gestionar servidores. Este enfoque serverless es ideal para cron jobs, ya que permite programar tareas como la gestión de instancias EC2, el procesamiento de datos o el envío de notificaciones con alta precisión y escalabilidad. Al utilizar AWS SAM, puedes definir y desplegar estas soluciones como código, facilitando la reproducibilidad y el mantenimiento. Este tutorial proporciona una base sólida para implementar tareas programadas en AWS, y con las personalizaciones adecuadas, puedes adaptar estos conceptos a una amplia gama de casos de uso en tu infraestructura en la nube. Asegúrate de limpiar los recursos después de tus pruebas para optimizar costos y mantener tu cuenta de AWS organizada.