본문 바로가기

Cloud Providers/AWS

[lambda]Serverless Framework를 사용하여, 람다함수로 express 서버를 띄워보자

Serverless Framework란

Serverless Framework is open source software that builds, compiles, and packages code for serverless deployment, and then deploys the package to the cloud.
출처

AWS 공식문서에 따르면 Serverless Framework란 서버리스 배포를 위한 코드를 빌드, 컴파일한 후 클라우드에 배포하주는 오픈소스 소프트웨어이다. 쉽게 말하면 AWS의 SAM을 활용하여 서버리스 배포를 CLI에서 쉽게 할 수 있는 것처럼, Serverless Framework도 서버리스 배포를 쉽게 할 수 있게 도와주는 도구이다. 다른점은 Azure, Google과 같은 다양한 클라우드 벤더에 사용될 수 있어 범용성이 높아 자주 쓰인단다.

 

어떻게 사용하나?

어떻게 사용하는지 알기위해 serverless framework에서 node.js를 express로 띄우는 앱을 콘솔로 간단히 만들어본다.

//serverless.yaml
org: masonjar
app: aws-node-express-api
service: aws-node-express-api
frameworkVersion: '3'

provider:
  name: aws
  runtime: nodejs14.x

functions:
  api:
    handler: handler.handler
    events:
      - httpApi: '*'

서비스 이름은 aws-node-express-api이다.

provider는 aws를 사용했으니 aws상에 인프라를 생성할 것이니, 그에 적합한 로그인과 IAM 권한이 필요할 것이다.

$ aws configure

해당 명령어로 로컬에서 serverless framework가 aws에 접근할 수 있게 한다.

functions를 보니 handler라는 함수가 httpApi의 모든 접근에 대해 열려있는 것을 api라고 한 것을 알 수 있다.

해당 람다함수에 대한 정보이다.

const serverless = require("serverless-http");
const express = require("express");
const app = express();

app.get("/", (req, res, next) => {
  return res.status(200).json({
    message: "Hello from root!",
  });
});

app.get("/hello", (req, res, next) => {
  return res.status(200).json({
    message: "Hello from path!",
  });
});

app.use((req, res, next) => {
  return res.status(404).json({
    error: "Not Found",
  });
});

module.exports.handler = serverless(app);

express를 활용하여 기본적인 api 요청 응답을 작성할 수 있는 코드이다. 

endpoint에 get과 같은 메소드로 요청을 보내면 상태코드와 메세지를 json형태로 전달해주고 있다.

js로 express서버를 그냥 띄웠을 경우 코드와 다른점은 serverless-http가 필요하고, serverless(app)을 module.exports를 통해 serverless.yaml파일이 읽을 수 있게 했다는 점이다.

 

배포하자

$ npm install //의존성 설치
$ serverless deploy

의존성 설치와 serverless deploy명령어만 있으면 간단히 배포된다. 이것이 serverless의 장점인 것 같다. 기존에 한번 써봤던 AWS SAM이 serverless를 AWS 서비스에 대해 잘 적용하기 위해 늦게 나온 기술이다.

 

확인하자

우리는 api를 람다로 배포하였다. 직접 콘솔가서 확인해보는 것도 좋은 방법이다. curl을 통해 api가 잘 작동하는지 확인할 수 있다. deploy가 완료되면 endpoint와 메소드가 표시된다. 그곳으로 curl을 보내어 어떤 응답이 오는지 확인하자.

$ curl <api-gateway-endpoint>

장점

위 방법을 활용한다면, RESTful api를 작성하기 위해 EC2를 띄워 계속 서버를 돌릴 필요가 없으므로 비용이 적게 들 것이다.

또한, 람다가 잘 작동하기 위해 API gateway같은 부가적으로 연결된 클라우드 리소스까지 deploy 명령어로 자동으로 생성되고 한꺼번에 삭제할 수 있다는 장점이 있다.

직접 콘솔에 들어가서 리소스를 일일히 확인하고 연결하는 것보다 훨씬 편한 방법이다. 또한 이미 만들었다면 만들어진 yaml파일을 바탕으로 어떤 리소스가 만들어졌는지 빠르게 파악할 수 있다.

다양한 클라우드 벤더사의 serverless 서비스에 적용할 수 있는 것으로 알고 있다. 그것도 참 큰 장점이다.