Open4

NestJSバックエンドアプリをサーバレス化

公式ドキュメントを一読した上で作業を開始する。

install

npm i @vendia/serverless-express aws-lambda
npm i -D @types/aws-lambda serverless-offline

rootディレクトリにserverless.ymlを追加する

serverless.yml
service: serverless-example

plugins:
  - serverless-offline

provider:
  name: aws
  runtime: nodejs14.x
  region: ap-northeast-1

package:
  exclude:
    - .git/**
    - src/**
    - test/**
    - nodemon.json
    - README.md

functions:
  main:
    handler: dist/index.handler
    events:
      - http:
          method: ANY
          path: /
      - http:
          method: ANY
          path: '{proxy+}'

src/index.tsを追加する

src/index.ts
import { NestFactory } from '@nestjs/core';
import serverlessExpress from '@vendia/serverless-express';
import { Callback, Context, Handler } from 'aws-lambda';
import { AppModule } from './app.module';

let server: Handler;

async function bootstrap(): Promise<Handler> {
  const app = await NestFactory.create(AppModule);
  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);
};

tsconfig.jsonに追記する

tsconfig.json
  "compilerOptions": {
…
    "esModuleInterop": true
…
ログインするとコメントできます