Nx + Serverless + NestJS

nx

Serverless + Nx + NestJS

Hoy, discutiremos cómo integrar un marco sin servidor con la aplicación NestJS generada por Nx. El objetivo de la configuración es,

  • Debería poder ejecutar la aplicación como una aplicación típica de NestJS Express. Sin dependencia en el serverless.
  • Configure el serverless para entornos superiores.
  • También debería poder ejecutar la aplicación usando el complemento sin conexión sin servidor localmente.

Hay varias formas, pero se me ocurrió este enfoque para el proyecto. El proyecto tiene múltiples aplicaciones, por lo que queremos que los desarrolladores no se preocupen demasiado por la tecnología sin servidor y mantengan el proceso simple de manera efectiva.


Paso 1: Cree la aplicación NestJS usando la CLI de NX,

nombre del espacio de trabajo: usuarios-ws

nombre de la aplicación: usuarios-api

Paso 2: configure la aplicación para ejecutarla como una aplicación rápida para el desarrollo local.

  • Cambie el nombre del archivo main.ts al archivo local-main.ts.
  • Navegue hasta el archivo project.json y agregue una nueva configuración llamada local, la estructura de configuración de muestra es:
{
"main": "apps/users-api/src/local-main.ts",
"optimization": false,
"extractLicenses": true,
"inspect": false,
}

Con esto, podemos ejecutar la aplicación como una típica aplicación express. El comando es el siguiente,

Paso 3: Instale las bibliotecas del marco Serverless

  • Instale serverless global, para facilitar la ejecución de la aplicación.
  • Instale las bibliotecas que ayudan a ejecutar la aplicación NestJS en el entorno sin servidor de AWS

Paso 4: Configurar la aplicación sin servidor

  • Cree un archivo main.ts y un ejemplo de muestra se encuentra a continuación,
import { NestFactory } from '@nestjs/core';
import { configure as serverlessExpress } from '@vendia/serverless-express';
import { Callback, Context, Handler } from 'aws-lambda';
import { AppModule } from './app/app.module';

let server: Handler;

async function bootstrap(): Promise<Handler> {
const app = await NestFactory.create(AppModule);
const globalPrefix = 'users-api';
app.setGlobalPrefix(globalPrefix);

await app.init();
const expressApp = app.getHttpAdapter().getInstance();
return serverlessExpress({ app: expressApp });
}

export const handler: Handler = async (event: any, context: Context, callback: Callback) => {
server = server ?? (await bootstrap());
return server(event, context, callback);
};
  • Cree un serverless.yaml en la carpeta raíz y agregue la configuración para ejecutar la aplicación en modo sin conexión.
    • El ejemplo de muestra es el siguiente:
frameworkVersion: '>=3'
service: users-apis
configValidationMode: error
plugins:
- serverless-plugin-optimize
- serverless-offline

provider:
name: aws
stage: ${opt:stage, 'dev'}
runtime: nodejs16.x
deploymentMethod: direct
disableRollback: false
tracing:
# Can only be true if API Gateway is inside a stack.
apiGateway: true
# Optional, can be true (true equals 'Active'), 'Active' or 'PassThrough'
lambda: true
environment:
NODE_ENV: ${opt:stage, 'dev'}
versionFunctions: false

custom:
serverless-offline:
useChildProcesses: true
httpPort: 3000
websocketPort: 3001
lambdaPort: 3002
optimize:
external: ['swagger-ui-dist']

package:
patterns:
- '!./**'
- ./dist/apps/users-api/**
- node_modules/**

functions:
participants-app:
handler: dist/apps/users-api/main.handler
package:
individually: false
events: # HTTP API endpoint (API Gateway v2)
- httpApi:
method: any
path: /users-api/{proxy+}

Ahora, podremos ejecutar la aplicación en modo sin servidor.

Básicamente, la aplicación está construida y la CLI sin servidor se usa para ejecutar la aplicación como una aplicación sin servidor.

La biblioteca de nodemon se puede usar durante el tiempo de desarrollo para buscar los cambios en la carpeta src en la aplicación user-api y ejecutar el comando anterior. Esto evitará volver a ejecutar el comando anterior para cada cambio de archivo.

Resumen

Aprendimos cómo podemos configurar la aplicación NX NestJS junto con un marco sin servidor. En general, estamos creando la aplicación utilizando la compilación Nx y la CLI sin servidor utilizada para ejecutar la aplicación.

Crearé una nueva historia que hable sobre la integración sin servidor con Nx project.json en los próximos días. Siéntase libre de dar su opinión sobre el enfoque, gracias.


Gracias por llegar hasta aquí, si encuentras esto útil no olvides dejar un👍🏼y suscribirse para recibir más contenido.

Si le interesa, puede echar un vistazo a algunos de los otros artículos que he escrito recientemente sobre AWS y Laravel:

Recent Post