AWS/lambda

[AWS Lambda] Serverless Frameworks로 간단한 node API 배포

jangdu 2024. 9. 22. 00:38

Serverless Frameworks

Aws, GCP, Azure 등 여러 클라우드 업체를 지원하는 서버리스 프레임워크로, serverless.yml을 통해서 각 클라우드에 배포를 돕습니다.


AWS의 경우, CloudFormation 선언을 생성하고 해당 생성된 파일로 severless stack을 생성 및 갱신합니다.

그 과정에서 코드의 용량에 따라서 크면 S3에, 작으면 즉시 Lambda로 업로드 해, 해당 코드를 Lambda에서 사용합니다.

 

즉, 서버리스의 코드, 인프라 등 모두 serverless.yml파일 하나로 쉽게 관리가 가능한 프레임워크입니다.

serverless.yml 예시

service: node-serverless

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

functions:
  hello:
    handler: handler.hello
    events:
      - http:
          path: hello
          method: get

 

service는 서버리스 스택의 이름이며,Cloud Formation에서 해당 이름으로,

provider에 정의된 배포할 업체 및 서비스, 런타임을 지정해 해당 서비스에 배포합니다.

 

serverless.yml에서는 functions에서 함수와 그 함수를 위한 트리거를 정의하며,

handler.js내부의 hello함수는 exports로 정의해야합니다.

 

region은 배포할 서비스의 지역이며, 기본값은 us-east-1(미국 동부, 버지니아 북부)로 배포됩니다.

events/hello로 http GET api를 생성한다는 뜻이며, 해당 api를 함수의 트리거로 적용합니다.

 

위 파일을 통해서 배포하면 API Gateway, Lambda, CloudWatch Logs를 연결해주어 API가 동작하도록 하며,
여기서 handler.hello 코드의 용량에 따라서 적으면 람다에 바로, 많으면 S3에 .zip파일로 배포합니다.

Serverless 설치

아래 명령어를 통해 serverless를 설치합니다.

npm install -g serverless

Serverless Project 생성

Project를 만들 디렉토리내에서 다음 명령어로 serverless project를 만들어줍니다.

sls

# or
serverless

 

해당 명령어를 입력하면 다음과 같은 질문들이 나오는데,

필자는 AWS / Node.js / Simple Function템플릿을 선택했습니다.


나머지 질문들은 각 Project와 App의 이름을 입력합니다.

✔ Select A Template: · AWS / Node.js / Simple Function

✔ Name Your Project: · yourProjectName

✔ Create Or Select An Existing App: · Create A New App

✔ Name Your New App: · yourAppName

Serverless Project 구조

정상적으로 프로젝트가 생성되면 아래의 구조로 파일이 만들어집니다.

 

여기서 serverless.yml의 경우에는 위에서 살펴봤으므로 넘어가고 handler.js를 살펴보면 다음과 같습니다.

 

exports.hello = async (event) => {
  return {
    statusCode: 200,
    body: JSON.stringify({
      message: 'Go Serverless v4.0! Your function executed successfully!'
    })
  };
};

 

이 파일은 serverless.yml에서 정의된 hello함수가 들어있는 파일로,

요청을 받으면 간단한 메시지를 응답해주는 간단한 코드로 작성되어있습니다.

 

위 코드의 간단한 api를 배포해보며, Serverless Framework의 간편함을 알아봅시다.

Serverless 배포

Serverless Framework를 사용하면 상당히 간편하게 배포가 가능합니다. 아래 명령어를 사용하여 배포하면 됩니다.

sls deploy

Deploying "hello" to stage "dev" (ap-northeast-2)

✔ Service deployed to stack hello-dev (24s)

endpoint: GET - your-aws-url
functions:
  hello: hello-dev-hello (1.5 kB)

 

이제 hello-dev-hello라는 Lambda함수와 해당 함수를 트리거하는 dev-hello라는 이름의 API-Gateway가 만들어졌습니다.

 

만들어진 endpoint에 요청해서 배포가 잘 이루어졌는지 확인해보겠습니다.

AWS console 확인

AWS Console에 접속해 lambda를 확인해보면 다음과 같이 함수와 트리거가 생성된것을 확인 할 수 있습니다.

 

여기서 주의 할 점은 Lambda에서 사용 할 코드는 압축을 해제하고의 용량을 기준으로 250MB까지만 가능합니다.

 

만약 코드의 크기가 3MB보다 작을 경우에는 코드가 그대로 Lambda에 업로드되며 더 빠른 응답이 가능하지만,
용량이 3MB보다 클 경우에는 AWS S3에 압축된 파일을 업로드하고 해당 람다와 연결시켜줍니다.

 

위 예제의 경우에는 용량이 작아 hanlder.js가 람다로 바로 배포됩니다.

배포된 Severless Project 제거

해당 서버리스 프로젝트를 삭제하는 경우에도 CLI를 통해서 간단하게 할 수 있습니다.


사실 Lambda의 경우에는 비용이 거의 나오지 않아서 삭제를 하지 않아도 큰 영향은 없지만,

배포 가능한 한도가 있으므로 테스트 후 삭제하는 습관을 등이는게 좋습니다.

 

아래의 명령어를 사용하면 serverless project를 삭제할 수 있습니다.

sls remove

이처럼 Serverless를 사용하면, serverless.yml하나만으로 생각보다 간단하게 배포가 가능합니다.

 

EC2의 경우에는 사용하지 않는 API도 시간으로 비용을 지불하기 때문에 이러한 간단한 테스트에서도 비용이 부과되며,
컴퓨터의 스펙이나 권한문제, 배포를 위한 git, 배포 후 24시간을 돌리기위한 pm2와 같은 부분들 등
해당 기능을 EC2에 올리고 API-Gateway와 연결해서 사용하려면 신경써야 할 부분이 한두가지가 아닙니다.

 

하지만 serverless를 사용한 Lambda에 배포한다면, 위처럼 빠르고 쉽게 배포 및 관리를 할 수 있다는 부분에서 큰 장점이 됩니다.

 

다음에는 더 복잡한 API를 통해서 serverless를 더 자세히 알아보겠습니다.