AWS Lambda es un servicio de computación sin servidor (serverless) que te permite ejecutar código sin tener que aprovisionar ni administrar servidores. Solo pagas por el tiempo de cómputo que consumes.
- Función Lambda: Es el código que escribes y subes a AWS Lambda. Puede estar en varios lenguajes como Node.js, Python, Java, etc.
- Evento: Es lo que desencadena la ejecución de tu función Lambda (por ejemplo, una petición HTTP, un archivo subido a S3, etc).
- Handler: Es el punto de entrada de tu función Lambda, es decir, la función que AWS Lambda invoca cuando se ejecuta.
- Escribes tu función Lambda.
- La subes a AWS Lambda.
- Configuras un evento que la dispare (por ejemplo, una petición HTTP a través de API Gateway).
- AWS ejecuta tu función solo cuando ocurre el evento.
Regístrate en AWS.
- Ve a la consola de AWS.
- Busca "Lambda" en el buscador de servicios.
- Haz clic en "Create function".
- Elige "Author from scratch".
- Dale un nombre a tu función.
- Elige el lenguaje de programación (por ejemplo, Python 3.9).
- Haz clic en "Create function".
Ejemplo en Python:
def lambda_handler(event, context):
return {
'statusCode': 200,
'body': '¡Hola desde Lambda!'
}
- Haz clic en "Test".
- Crea un evento de prueba (puedes dejar el que viene por defecto).
- Haz clic en "Test" de nuevo y verás la respuesta.
Puedes configurar tu Lambda para que se ejecute cuando:
- Se sube un archivo a S3.
- Se inserta un registro en DynamoDB.
- Se recibe una petición HTTP (usando API Gateway).
- Entre otros.
- Mantén tus funciones pequeñas y enfocadas en una sola tarea.
- Usa variables de entorno para configuraciones.
- Maneja los errores correctamente.
- Usa roles de IAM para dar permisos mínimos necesarios.
Si tienes instalado Serverless Framework, puedes hacer una prueba rápida de tu función Lambda localmente con el siguiente comando:
npx serverless invoke local --function NOMBRE_DE_TU_FUNCION
Reemplaza NOMBRE_DE_TU_FUNCION
por el nombre definido en tu serverless.yml
(por ejemplo, procesarRecibo
).
Más información y pasos detallados para desplegar tu Lambda en AWS están en el archivo DEPLOY_SERVERLESS.md
.
- Documentación oficial de AWS Lambda
- Tutorial: Crear una función Lambda
- AWS Lambda en YouTube (video introductorio)
Se dice que las AWS Lambda (y en general, las funciones serverless) deben ser idempotentes porque AWS puede ejecutar la misma Lambda más de una vez para el mismo evento, ya sea por errores, reintentos automáticos o por la forma en que el sistema garantiza la entrega del evento.
Una función es idempotente si ejecutarla una o varias veces con el mismo input produce siempre el mismo resultado y no genera efectos secundarios adicionales.
-
Reintentos automáticos: Si ocurre un error en la entrega o ejecución, AWS puede volver a invocar la Lambda con el mismo evento.
-
Garantía de entrega: En sistemas distribuidos, para garantizar que un evento se procese, puede enviarse más de una vez.
-
Evitar efectos secundarios: Si tu Lambda, por ejemplo, escribe en una base de datos, envía un correo, o realiza un cobro, y no es idempotente, podrías tener datos duplicados, correos dobles o cobros múltiples.
Supón que tienes una Lambda que recibe un evento para crear un usuario:
- No idempotente: Si el evento llega dos veces, se crean dos usuarios iguales.
- Idempotente: Si el evento llega dos veces con el mismo identificador, solo se crea un usuario (o se ignora el duplicado).
Las Lambdas deben ser idempotentes para evitar problemas en caso de reintentos o entregas duplicadas de eventos. Así, si la función se ejecuta más de una vez con el mismo input, no genera efectos secundarios indeseados ni datos duplicados.
-
Separa el controlador de Lambda de la lógica del núcleo: Facilita las pruebas unitarias y el mantenimiento del código.
// core.js export function suma(a, b) { return a + b; } // handler.mjs import { suma } from './core.js'; export const handler = async (event) => ({ resultado: suma(event.a, event.b) });
-
Controla las dependencias: Empaqueta todas las dependencias necesarias con tu función para evitar cambios inesperados por actualizaciones del entorno de AWS Lambda.
- Usa un archivo
package.json
y ejecutanpm install
opnpm install
antes de empaquetar.
- Usa un archivo
-
Minimiza la complejidad de las dependencias: Prefiere frameworks sencillos para reducir el tiempo de arranque (cold start).
- Prefiere usar solo el SDK de AWS y utilidades nativas de Node.js cuando sea posible.
-
Reduce el tamaño del paquete de implementación: Solo incluye lo necesario para acelerar la descarga y el desempaquetado.
- Elimina dependencias y archivos no usados antes de desplegar.
-
Reutiliza el entorno de ejecución: Inicializa clientes de SDK y conexiones fuera del handler para mejorar el rendimiento y reutilizar recursos entre invocaciones.
// Se inicializa fuera del handler import AWS from 'aws-sdk'; const s3 = new AWS.S3(); export const handler = async (event) => { /* usa s3 aquí */ };
-
Evita almacenar datos sensibles o de usuario en el entorno de ejecución: No uses variables globales para datos de usuario o eventos, ya que pueden compartirse entre invocaciones.
// INCORRECTO let usuarioActual; export const handler = async (event) => { usuarioActual = event.user; };
-
Utiliza directivas keep-alive para conexiones persistentes: Configura keep-alive en clientes HTTP/HTTPS para evitar errores por conexiones inactivas.
import https from 'https'; const agent = new https.Agent({ keepAlive: true }); // Usar agent en peticiones HTTP
-
Usa variables de entorno para parámetros operativos: No codifiques valores sensibles o configuraciones directamente en el código.
const bucket = process.env.BUCKET_NAME;
-
Evita invocaciones recursivas: No hagas que la función se invoque a sí misma para prevenir bucles y costos inesperados.
- Si necesitas procesamiento asíncrono, usa colas (SQS) o Step Functions.
-
No uses APIs no documentadas o privadas: Limítate a las APIs públicas y documentadas para evitar problemas de compatibilidad.
- Consulta siempre la documentación oficial de AWS.
-
Escribe código idempotente: Asegúrate de que la función maneje correctamente eventos duplicados y no genere efectos secundarios adicionales.
// Ejemplo: solo crear si no existe if (!(await existeRegistro(event.id))) { await crearRegistro(event.id); }
Estas prácticas ayudan a crear funciones Lambda más seguras, eficientes, fáciles de mantener y menos propensas a errores en producción.