serverless framework - 플러그인과 로컬테스트

서버리스 왕초보 탈출기 (2) 서버유지보수로부터 자유로워지자!

Posted by Juri on February 14, 2022

이 글을 읽기 위해서는 javascript와 node js에 대한 기본 지식이 필요합니다.

서버리스에서 지원하는 여러 가지 플러그인에 대해 알아보고 배포 전 로컬환경에서 테스트를 하는 방법을 알아보자.

플러그인 (Plugins)

플러그인 : 서버리스 프레임워크의 새로운 기능을 지원하는 커스텀 자바스크립트 코드

플러그인 설치

먼저, 플러그인을 사용하기 위해서 플러그인을 설치한다.

1
$ serverless plugin install -n plugin1

설치한 후 serverless.yml 파일에 플러그인을 등록한다. 이 때 플러그인을 작성한 순서에 따라 플러그인이 실행된다.

1
2
3
plugins:
  - plugin1
  - plugin2

플러그인 종류

● Serverless Offline

Emulate AWS λ and API Gateway locally when developing your Serverless project

로컬환경에서 AWS LambdaAPI Gateway를 테스트할 수 있게 도와주는 플러그인이다.

1
2
3
$ serverless offline
혹은
$ sls offline

serverless.yml에서 포트를 따로 지정하지 않으면 기본 3000번 포트로 서버가 열린다. http://localhost:3000으로 요청 메세지를 보내 람다 핸들러를 실행시킬 수 있다.

● Serverless Webpack

Serverless plugin to bundle your lambdas with Webpack

람다함수들을 웹팩으로 묶어주는 플러그인이다. 웹팩은 여러 개의 모듈을 하나의 자바스크립트 코드로 압축하는 라이브러리다.

webpack configuration file
아래와 같이 webpack 경로를 따로 지정하지 않으면 webpack.config.js를 찾는다.

1
2
3
4
5
6
7
custom:
  webpack:
    webpackConfig: ./src/my-webpack.config.js
    includeModules: true
      forceExclude:
        - aws-sdk

1
2
3
4
5
6
7
8
9
10
11
12
13
// my-webpack.config.js
const slsw = require("serverless-webpack")
const nodeExternals = require("webpack-node-externals")
const path = require("path")

module.exports = {
  mode: "development",
  entry: slsw.lib.entries,
  outputs: {
    path: path.join(__dirname, ".webpack")
  },
  externals: [nodeExternals()]
}
  • mode: 모드 (production, development)에 따라 최적화 혹은 빠르게 빌드된다.
  • entry: webpack이 빌드할 파일의 시작위치를 나타낸다.
  • output: 생성된 번들을 내보낼 위치와 파일이름을 지정한다.
  • externals: 번들에서 제외할 모듈을 지정한다. 위의 코드는 외부모듈을 지정하고 있다.

● Serverless Prune Plugin

Deletes old versions of functions from AWS, preserving recent and aliased versions

새로 배포했을 때 기존의 배포된 버전은 지워지지 않기 때문에 버전이 계속 쌓이게 된다. 최신 배포 버전을 제외한 모든 버전을 제거하는 플러그인이다.

1
$ sls prune -n <number of version to keep>

루트 디렉토리에서 남길 버전을 입력과 함께 명령어를 입력한다.

1
2
3
4
custom:
  prune:
    automatic: true
    number: 1

배포를 할 때마다 자동으로 실행되게 설정할 수 있다. 또한, 지우지 않고 남길 버전의 갯수도 지정해야 한다.

● Serverless Dotenv Plugin

Preload environment variables from .env into serverless.

.env파일에 있는 데이터를 yml파일에서 사용할 수 있게 해주는 플러그인이다.

1
2
3
4
5
6
7
...
provider:
  name: aws
  runtime: nodejs14.x
  stage: ${env:STAGE}
  region: ${env:AWS_REGION}
...

스테이지나 리젼을 여러개 사용하는 서비스라면 각각의 .env파일을 생성해 데이터를 관리하는 것이 편하다.

● Serverless Plugin Warmup

Keep your lambdas warm during Winter.

일정한 시간간격을 두고 람다를 실행시켜 cold start를 방지하는 플러그인이다.

1
2
3
4
5
custom:
  warmup:
    enabled: true
    events:
        - schedule: cron(0/5 8-17 ? * MON-FRI *)

시간간격을 조정할 수 있고 람다 함수별로 warmup을 실행할 수도 있다.

● Serverless Plugin Scripts

Add scripting capabilities to the Serverless Framework

npm script와 비슷하게 명령어를 만들어서 실행할 수 있다.

1
2
3
4
custom:
  scripts:
    commands:
      hello: echo Hello from ${self:service} service!
1
$ sls hello

CLI에 미리 지정해 둔 명령어를 입력해서 빠르게 스크립트를 실행할 수 있다. 혹은 배포할 때 스크립트가 자동으로 실행되게 할 수 있다.

● Serverless Plugin typescripts

Serverless plugin for zero-config Typescript support

자동으로 tsconfig.json을 읽어서 typescript를 javascript로 컴파일해주는 플러그인이다.

로컬 테스트

Serverless Offline 플러그인을 사용해서 쉽게 로컬테스트를 할 수 있다.

1
2
3
4
5
6
7
8
9
10
// handler.ts

export const hello = async () => {
  return {
    statusCode: 200,
    body: JSON.stringify({
      message: "juri, you are the best!"
    })
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# serverless.yml

service: server
frameworkVersion: '3'

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

functions:
  hello:
    handler: handler.hello
    events:
      - http:
          path: hello
          method: get
plugins:
  - serverless-plugin-typescript
  - serverless-offline

1. PostMan과 같은 API툴

1
$ serverless offline

서버를 켜고 람다 함수에 지정한 HTTP 엔드포인트로 request 메세지를 보낸다.

response를 확인할 수 있다.

2. CLI 명령어

실행하고자 하는 함수를 지정해서 실행시킬 수 있다.

1
$ serverless invoke local --function myFunction

람다함수의 event를 임의로 생성해서 테스트해볼 수 있다.

1
2
3
$ serverless invoke local --function myFunction --path ./lib/data.json

$ serverless invoke local --function myFunction --data '{"a":"bar"}'

이외에도 stageenv도 지정해서 함수를 실행시켜볼 수 있다.

배포

1
$ sls deploy

입력한 AWS 계정으로 배포가 진행된다.

cloudformation lambda

배포가 끝나고난 뒤 AWS console에서 cloudformationlambda가 잘 생성된 것을 확인할 수 있다.

API Gateway 엔드포인트로 request를 보내 배포가 잘 됐음을 확인할 수 있다.

마치며

typescript로 간단한 람다함수를 만들고 API Gateway를 트리거로 배포해보았다. 갈 길이 구만리지만 앞으로 서버리스 왕초보 탈출기를 포스팅하면서 서버리스의 중수 정도는 되고 싶다.