Skip to content

서버 애플리케이션 배포 방법

Hyeokwoo Alex Kwon edited this page Dec 16, 2019 · 1 revision

서버 애플리케이션 배포 방법

서버 애플리케이션의 수동 배포 방법에 대한 안내입니다. 본 애플리케이션은 serverless framework를 활용하여 aws lambda에 배포하도록 설정되었습니다.

배포 방법

  1. npm run build 를 이용하여 배포 파일을 생성합니다.
  2. stage환경의 배포는 다음과 같습니다.
sls deploy -s dev --alias <githubId>

// 예
sls deploy -s dev --alias atercatus

alias뒤에 각자의 github 사용자 이름을 적습니다.

  1. production 환경의 배포는 다음과 같습니다.
sls deploy -s prod --retain

여기저 retain은 버전의 유지를 의미합니다.

배포 관련 코드

serverless.yml

serverless framework를 활용하여 배포할 때에는 다음과 같은 serverless.yml 파일을 작성합니다. 본 파일에는 배포 설정에 대한 내용들을 담고 있습니다.

service: wedev-api # service name. Lambda 이름 제일 앞에 위치

custom:
  STAGE: ${self:provider.stage, 'dev'}
  CONFIG: ${file(./config/config.js):CONFIG.${self:custom.STAGE}}

provider:
  name: aws
  runtime: nodejs10.x
  region: ap-northeast-1
  profile: default
  stage: ${opt:stage, 'dev'} # API Gateway stage // 우선 자신의 github id로 작성
  apiName: ${self:custom.CONFIG.API_NAME} # API Gateway name

plugins:
  - serverless-offline
  - serverless-aws-alias

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

functions:
  index: # Lambda 이름 마지막에 추가
    name: ${self:custom.CONFIG.API_NAME}
    handler: dist/src/index.handler
    vpc:
      securityGroupIds:
        - sg-00716c37241964512
      subnetIds:
        - subnet-018f7fd8aa3ae2c39
        - subnet-0479aca67cf6ca711
        - subnet-0ef00aa4fb1674c5b
        # - subnet-0d58d96b6c7495387

    events:
      - http:
          cors: true
          path: '/'
          method: any
      - http:
          cors: true
          path: '{proxy+}'
          method: any
    retain: false
# npm run build
# sls deploy --alias {github id}

config/config.js

serverless.yml에서 활용하는 환경 변수를 담고 있습니다.

module.exports.CONFIG = serverless => ({
  dev: {
    API_NAME: 'wedev-api-dev',
  },
  prod: {
    API_NAME: 'wedev-api-prod',
  },
});

src/index.ts

서버 애플리케이션을 aws lambda가 핸들링 하기 위해서는 본 파일과 같은 handler 코드를 작성해야 합니다.

import { Context } from 'aws-lambda';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { Server } from 'http';
import { ExpressAdapter } from '@nestjs/platform-express';
import * as serverless from 'aws-serverless-express';
import * as express from 'express';
import * as helmet from 'helmet';
import * as bodyParser from 'body-parser';
import * as cookieParser from 'cookie-parser';

let cachedServer: Server;

async function bootstrapServer(): Promise<Server> {
  const expressApp = express();
  const adapter = new ExpressAdapter(expressApp);
  return NestFactory.create(AppModule, adapter)
    .then(app => {
      app.enableCors({
        origin: process.env.CORS_ALLOWED_ORIGINS.split(','),
        credentials: true,
        preflightContinue: false,
        optionsSuccessStatus: 204,
      });
      app.use(helmet());
      app.use(bodyParser.text());
      app.use(cookieParser());
      return app;
    })
    .then(app => app.init())
    .then(() => serverless.createServer(expressApp));
}

// tslint:disable-next-line: no-any
export const handler = (event: any, context: Context) => {
  if (!cachedServer) {
    bootstrapServer().then(server => {
      cachedServer = server;
      return serverless.proxy(server, event, context);
    });
  } else {
    return serverless.proxy(cachedServer, event, context);
  }
};
Clone this wiki locally