Funciones Serverless en TypeScript: trabajo avanzado con AWS Lambda

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Funciones Serverless en TypeScript: nivel avanzado en AWS Lambda

\n\n

La arquitectura serverless se ha convertido en el estándar de facto para construir aplicaciones escalables y rentables. AWS Lambda es uno de los servicios más populares para implementar funciones sin servidor. Si ya domina la sintaxis básica y los disparadores (API Gateway, S3, DynamoDB), es hora de pasar a técnicas avanzadas. En este artículo, exploraremos aspectos clave del desarrollo profesional de funciones Lambda en TypeScript: desde la optimización del arranque en frío hasta la integración con VPC y el uso de patrones complejos.

\n\n

1. Optimización del arranque en frío y gestión de memoria

\n\n

El arranque en frío (cold start) es el principal enemigo del rendimiento de las aplicaciones serverless. En TypeScript, este problema se agrava con la etapa de compilación. Veamos tres métodos principales para combatirlo.

\n\n

1.1. Reducción del tamaño del paquete de despliegue

\n

Utilice esbuild para la compilación en lugar del estándar tsc. Realiza tree-shaking y minificación, lo que reduce el tamaño del bundle entre 5 y 10 veces. Ejemplo de configuración para serverless.yml:

\n\n
plugins:\n  - serverless-esbuild\ncustom:\n  esbuild:\n    bundle: true\n    minify: true\n    sourcemap: false\n    target: 'node18'\n    exclude: ['aws-sdk'] # SDK ya está en el entorno Lambda
\n\n

1.2. Uso de Provisioned Concurrency

\n

Para funciones críticas en cuanto a latencia (por ejemplo, las que procesan solicitudes API), configure Provisioned Concurrency. Esto mantiene una cantidad determinada de contenedores "calientes" ejecutándose constantemente:

\n\n
functions:\n  apiHandler:\n    handler: src/handler.apiHandler\n    provisionedConcurrency: 5 # Siempre 5 instancias listas
\n\n

1.3. Optimización de importaciones y código

\n

Evite bibliotecas "pesadas" dentro de la función. Por ejemplo, en lugar de importar todo aws-sdk v3, importe solo los clientes necesarios:

\n\n
// Mal: import * as AWS from 'aws-sdk';\n// Bien:\nimport { DynamoDBClient } from '@aws-sdk/client-dynamodb';\nimport { DynamoDBDocumentClient } from '@aws-sdk/lib-dynamodb';
\n\n

2. Trabajo con Lambda Layers y dependencias

\n\n

Lambda Layers permiten extraer código común y dependencias (por ejemplo, ORM, validadores) fuera de la función. Esto acelera el despliegue y reduce el tamaño de cada paquete individual.

\n\n

2.1. Creación de una capa con utilidades comunes

\n

La estructura del proyecto podría verse así:

\n\n
project/\n├── layers/\n│   └── common/\n│       └── nodejs/\n│           ├── package.json\n│           └── node_modules/\n├── functions/\n│   ├── createUser.ts\n│   └── getUser.ts\n└── serverless.yml
\n\n

En serverless.yml conectamos la capa:

\n\n
layers:\n  commonLibs:\n    path: layers/common\n    compatibleRuntimes:\n      - nodejs18.x\nfunctions:\n  createUser:\n    handler: functions/createUser.handler\n    layers:\n      - { Ref: CommonLibsLambdaLayer }
\n\n

2.2. Tipado para capas

\n

Para que TypeScript "vea" los tipos de la capa, cree un tsconfig.json con rutas:

\n\n
{\n  "compilerOptions": {\n    "paths": {\n      "@common/*": ["layers/common/nodejs/*"]\n    }\n  }\n}
\n\n

Ahora en la función se puede escribir:

\n
import { validateEmail } from '@common/validators';
\n\n

3. Trabajo con VPC y seguridad

\n\n

Las funciones Lambda que operan dentro de una VPC pierden el acceso a Internet público (a menos que se configure un NAT Gateway). Esto es crítico para conectarse a RDS, ElastiCache o API privadas.

\n\n

3.1. Configuración de Lambda en VPC

\n

Configuración a través de serverless.yml:

\n\n
provider:\n  vpc:\n    securityGroupIds:\n      - sg-12345\n    subnetIds:\n      - subnet-abc\n      - subnet-def\n\nfunctions:\n  dbHandler:\n    handler: src/db.handler\n    vpc: true # hereda la configuración del proveedor
\n\n

3.2. Patrón "Thin Handler" para conexiones

\n

Le

Blogs

Book Recommendations