NestJS en AWS Lambda: Optimizando para Serverless

Cómo adaptar tu proyecto en NestJS para que funcione eficientemente en AWS Lambda, con enfoque en reducción de peso, uso de layers y empaquetado con Webpack.
nestjs aws lambda serverless webpack lambda-layers monolambda
12-04-2025

Introducción

NestJS es un framework robusto y muy completo para construir aplicaciones backend en Node.js. Sin embargo, cuando queremos llevarlo al mundo serverless con AWS Lambda, nos encontramos con varios retos.

La idea de este post es mostrar cómo adaptar un proyecto existente en NestJS para ejecutarlo como una API utilizando Lambdas, destacando tanto sus ventajas como sus limitaciones. Veremos también cómo optimizarlo para que el tamaño de las funciones no sea un problema, utilizando herramientas como Webpack y Lambda Layers, y explicaremos qué es el concepto de una monolambda.

Puntos fuertes

  • NestJS es modular y escalable: facilita el desarrollo de APIs complejas y organizadas.
  • Ecosistema completo: viene con soporte para inyección de dependencias, middlewares, pipes, interceptors, etc.
  • Compatible con Serverless: puede funcionar con adaptadores para entornos Lambda como @nestjs/platform-express junto con aws-serverless-express o @vendia/serverless-express.
  • Reutilización de código: puedes usar el mismo código que en un backend tradicional sin muchos cambios.

Puntos débiles

  • Tamaño del bundle: al incluir muchas dependencias y decoradores, el tamaño final de cada función puede ser demasiado grande para Lambda.
  • Tiempo de arranque (cold start): NestJS necesita tiempo para iniciar su contexto de inyección de dependencias, lo que puede ser crítico en entornos serverless.
  • No está pensado para funciones pequeñas: NestJS promueve aplicaciones más monolíticas, lo que puede ir contra la filosofía del serverless puro (una función = una responsabilidad).

Necesidad de reducir el tamaño de las Lambdas

El límite duro de AWS para los paquetes desplegables (incluyendo dependencias) es de 250 MB descomprimido (50 MB comprimido para subir directamente). NestJS, debido a su estructura y dependencias, puede acercarse rápidamente a esos límites.

Además, un bundle pesado significa tiempos de despliegue más largos y cold starts más lentos. Por eso, optimizar el peso del código es fundamental cuando usamos NestJS en Lambda.

Uso de Lambda Layers

Una forma eficaz de reducir el tamaño del bundle por función es mover dependencias comunes a un Lambda Layer. Esto permite que varias Lambdas compartan el mismo código sin duplicarlo, manteniendo el tamaño de cada función mucho más ligero.

Por ejemplo, puedes incluir en un Layer:

  • node_modules con dependencias pesadas como @nestjs/core, rxjs, etc.
  • utilidades comunes
  • clientes SDK compartidos

Esto se combina bien con Webpack (o tools similares) para evitar duplicaciones innecesarias.

Webpack para empaquetado

Para empaquetar el proyecto y controlar qué se incluye, Webpack es una herramienta clave. Te permite:

  • Excluir node_modules del bundle final
  • Incluir solo los archivos necesarios
  • Minimizar el código para mejorar la performance

Además, puedes configurar externals para que las dependencias vayan al Layer, y usar ts-loader o esbuild-loader para una compilación rápida desde TypeScript.

// webpack.config.js (ejemplo básico)
module.exports = {
    entry: "./src/main.ts",
    target: "node",
    externals: ["@nestjs/core", "rxjs"], // mover al Layer
    module: {
        rules: [{ test: /\.ts$/, loader: "ts-loader" }],
    },
    resolve: {
        extensions: [".ts", ".js"],
    },
    output: {
        filename: "main.js",
        path: __dirname + "/dist",
    },
};

¿Qué es una “monolambda”?

Una monolambda es una Lambda que expone múltiples rutas de una API dentro de la misma función. Es decir, toda tu API está dentro de una sola Lambda, generalmente utilizando Express.

Esto es útil en proyectos NestJS porque evita tener que separar cada handler en funciones individuales, algo que sería complejo por la estructura del framework.

🔧 Se usa típicamente con adaptadores como aws-serverless-express o @vendia/serverless-express para montar toda la app de NestJS en un solo endpoint.

Ventajas:

  • Más sencillo de implementar.
  • Mantiene toda la lógica en un solo lugar.
  • Evita duplicación de código y dependencias.

Desventajas:

  • Un único punto de fallo.
  • Cold start más alto.
  • Puede no escalar tan bien como funciones separadas.

¿Usar NestJS en Lambda? Sí, pero con cabeza. Usando buenas prácticas, herramientas de empaquetado y técnicas como Layers y Monolambda, puedes sacarle mucho partido a un proyecto NestJS sin renunciar a los beneficios del serverless.