Run NestJS Application in Serverless Framework on AWS

In this article, we’re going to learn how we can run a NestJS application as a Lamda function using the Serverless framework on the AWS platform.

Image for post
Image for post
NestJS application in Serverless framework on AWS

Hands-on Steps:

First, we need to install Nest CLI globally to create a NestJS application.

npm i -g @nestjs/clinest new nest-sls && cd nest-sls

These are the node packages that we need to install first before we proceed.

npm install aws-lambda aws-serverless-express express --save

Here we map our NestJS application into the ExpressJS application so that we can use this during AWS Lamda function implementation.

// src/app.tsimport { NestFactory } from '@nestjs/core';
import { ExpressAdapter } from '@nestjs/platform-express';
import { INestApplication } from '@nestjs/common';
import { AppModule } from './app.module';
import { Express } from 'express';
export async function createApp(
expressApp: Express,
): Promise<INestApplication> {
const app = await NestFactory.create(
AppModule,
new ExpressAdapter(expressApp),
);
return app;
}

Now we convert our ExpressJS application into AWS Lamda function so that it can use our application as a function.

// src/serverless.tsimport { Server } from 'http';
import { Context } from 'aws-lambda';
import { createServer, proxy, Response } from 'aws-serverless-express';
import * as express from 'express';
import { createApp } from './app';
let cachedServer: Server;async function bootstrap(): Promise<Server> {
const expressApp = express();
const app = await createApp(expressApp);
await app.init();
return createServer(expressApp);
}
export async function handler(event: any, context: Context): Promise<Response> {
if (!cachedServer) {
const server = await bootstrap();
cachedServer = server;
}
return proxy(cachedServer, event, context, 'PROMISE').promise;
}

Here we mentioned all the configurations for the Serverless application.

// serverless.ymlservice: serverless-nestjsframeworkVersion: '2'useDotenv: trueprovider:
name: aws
runtime: nodejs12.x
stage: ${opt:stage, 'dev'}
region: ${opt:region, 'ap-southeast-1'}
apiGateway:
shouldStartNameWithService: true
environment:
NODE_ENV: ${env:NODE_ENV}
functions:
app:
handler: dist/serverless.handler
events:
- http:
method: any
path: /{any+}

Make sure, we always build our application before deploying to AWS. Because all the changes will reflect after the build process is successful as we upload the files from the dist directory into AWS S3.

npm run build && sls deploy

Serverless Offline:

To speed up our development cycles, we can run and test our application on our local machine. Therefore, we can use this serverless-offline plugin to run our Serverless application on our local machine.

Install this npm package before we proceed.

npm install serverless-offline --save-dev

We need to add this serverless-offline plugin in our Serverless configuration file. [NB: serverless-offline should always be the last plugin]

// serverless.yml...plugins:
- serverless-offline
...

Same as before, we always build our application before running the application. Because all the changes will reflect after the build process is successful as our AWS Lamda function points to the dist directory.

npm run build && sls offline start

The Startup

Medium's largest active publication, followed by +756K people. Follow to join our community.

Medium is an open platform where 170 million readers come to find insightful and dynamic thinking. Here, expert and undiscovered voices alike dive into the heart of any topic and bring new ideas to the surface. Learn more

Follow the writers, publications, and topics that matter to you, and you’ll see them on your homepage and in your inbox. Explore

If you have a story to tell, knowledge to share, or a perspective to offer — welcome home. It’s easy and free to post your thinking on any topic. Write on Medium

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store