Serverless Framework

Prev Next

서버리스 프레임워크는 다양한 Cloud Provider의 Function-as-a-Service와 연동하여 서버리스 애플리케이션을 개발, 배포, 테스트할 수 있는 오픈소스 웹 프레임워크입니다. 네이버클라우드 Cloud Functions는 서버리스 프레임워크 Provider를 지원하며 서버리스 프레임워크를 활용하여 Cloud Functions를 손쉽게 구성하고 관리할 수 있습니다.

주요 개념

서버리스 프레임워크에서 제공하는 주요 개념과 각 항목별 Cloud Functions와 연관 관계는 다음과 같습니다. 자세한 내용은 Serverless Framework Concepts에서 확인할 수 있습니다.

Functions

서버리스 프레임워크의 Function은 Cloud Functions의 액션과 동일합니다. 배포에 있어서 제일 가장 기본적인 단위이며, 보통 하나의 액션은 하나의 작업을 수행합니다.

Events

서버리스 프레임워크의 Event는 Function을 실행시키는 주체로서 Cloud Functions의 트리거와 동일합니다.

Services

서버리스 프레임워크의 조직 단위 또는 프로젝트 단위입니다. serverless.yml 파일에 Functions, Events 등 서비스에 필요한 내용들을 작성합니다.

구성 요소

Functions

배포/관리할 액션 정보를 정의합니다.

설정 설명 필수 여부 기본값 제약사항
handler 액션의 main 함수가 정의된 파일 이름과 함수 이름. <파일이름>.<함수이름> O - -
runtime 액션의 런타임 O - nodejs, python만 제공
name 액션 이름 X <서비스명>-<스테이지>-<FUNCTION_KEY> -
memory 액션 메모리 X 256 (MB) 128, 256, 512
timeout 액션이 실행될 수 있는 최대 시간 X 60000 (ms) MIN 500 MAX 300000
vpc 액션과 연결되는 VPC, Subnet 정보 X
  • 예시
# serverless.yml
service: myService
 
provider:
  name: navercloud
  region: fin
 
functions:
  hello:
    handler: handler.main 
    runtime: nodejs:16
    name: myAction
    memory: 512
    timeout: 60000
    parameters:
      foo: bar
    vpc:
      vpcNo: 11
      subnetNo: 123
 
plugins:
  - serverless-navercloud

Packages

Cloud Functions는 액션을 관리하는 패키지 리소스를 제공합니다. 패키지를 지정하지 않을 수 있고 정의한 패키지가 없을 경우, 자동으로 생성됩니다.

functions:
  hello:
    handler: hander.main
    packageName: myPackage

명시적으로 패키지를 배포하고 액션에서 지정할 경우, resource/packages에 배포할 패키지를 정의해야 합니다.

functions:
  hello:
    handler: handler.main
    packageName: myPackage
    runtime: nodejs:16
    name: myAction
    vpc:
      vpcNo: 11
      subnectNo: 123
    
resources:
  packages:
     myPackage:
       parameters:
         hello: world
      vpc: true

Events

배포/관리할 트리거 정보를 정의합니다. 배포 시, events 정보가 트리거 리소스로 변환됩니다. events가 지정된 액션의 플랫폼에 따라 트리거의 플랫폼이 결정됩니다.

functions:
   myAction:
     name: myAction
     handler: hadler.main
     events:
       - triggerName: myCronTrigger
          type: cron
          cronOptions: "*/5 * * * *"
       - triggerName: myBasicTrigger
           ...

Cron 트리거

- triggerName: cronTrg
  type: cron
  cronOption: <Cron Expression>

Cloud Insight 트리거

- triggerName: insightTrg
  type: insight
  insightLink:
    - prodKey: <Cloud Insight Event Rule prodKey>
      ruleGrpId: <Cloud Insgiht Event Rule ruleGrpId>
      reminderTime: <Remind Time(m)>
      enableNotiWhenEventClose: <true|false>

Object Storage 트리거

- triggerName: obsTrg
  type: object_storage
  objectStorageLink:
    - bucketName: <Object Storage Bucket Name>
      eventRuleName: <Object Storage Event Rule Name>

사용법

서버리스 프레임워크 CLI를 이용하여 빌드, 배포 등 명령어를 실행하는 방법을 설명합니다.

Package

서비스 구성을 클라우드 상에 배포하지 않고 파일로 패키징 합니다. 패키징 파일을 이용하여 형상 관리에 이용하거나 CI/CD 워크플로와 연동할 수 있습니다. Cloud Functions의 리소스 타입별로 3가지 파일이 생성됩니다.

  • functions.json (액션)
  • packages.json (패키지)
  • triggers.json (트리거)
$ serverless package --package <패키지 경로>

Deploy

serverless.yml 파일 내용에 변경이 있을 경우, 변경 사항을 클라우드에 배포합니다. 기본적으로 Package 과정을 포함하며, --package 옵션을 이용하면 별도 빌드 없이 기존 생성된 패키지를 배포할 수 있습니다.

$ serverless deploy 
$ serverless deploy --package <패키지 경로>

Invoke

클라우드 상에 배포되어 있는 액션을 실행합니다. 실행 결과로 액션 코드 리턴 값을 출력하며 상세 실행 결과가 필요한 경우, verbose 옵션을 추가해야 합니다. 배포되지 않은 액션은 실행할 수 없습니다.

$ serverless invoke -f <액션 이름>
$ serverless invoke -f <액션 이름> --verbose
$ serverless invoke -f <액션 이름> --timeout <타임아웃(ms)>

Logs

액션의 실행 이력과 결과를 조회합니다.

$ serverless logs -f <액션 이름>
$ serverless logs -f <액션 이름> --pageSize <페이지별 로그 수> --pageNo <페이지 번호>
# start/end는 "yyyy-MM-ddTHH:mm:ss" 형태로 작성하며 리전의 표준 시간대를 기준으로 합니다.
$ serverless logs -f <액션 이름> --start <조회 시작일시> --end <조회 종료일시> 
$ serverless logs -f <액션 이름> --tail

튜토리얼

서버리스 프레임워크에서 Cloud Functions 액션, 트리거를 구성하는 방법을 소개합니다. 각 구성 요소의 자세한 설명은 구성 요소를 참고해 주십시오.

환경 구성

서버리스 프레임워크 설치

  • NPM을 이용하여 서버리스 프레임워크 패키지를 설치합니다.
npm install -g serverless@3
참고
  • Serverless Framework v4 이상은 지원하지 않습니다.
  • --global 또는 -g 옵션이 반드시 포함되어야 합니다.
  • Node.js >= 16.0 이 필요합니다.

Ncloud SDK Crendentials 등록

serverless-navercloud는 ncloud-sdk를 이용합니다. 환경 변수에 NCLOUD_ACCESS_KEY(또는 NCLOUD_ACCESS_KEY_ID)와 NCLOUD_SECRET_KEY(또는 NCLOUD_SECRET_ACCESS_KEY)가 등록되어 있어야 합니다.

$ export NCLOUD_ACCESS_KEY="네이버 클라우드 플랫폼 포털이나 Sub Account에서 발급받은 Access Key"
$ export NCLOUD_SECRET_KEY="네이버 클라우드 플랫폼 포털이나 Sub Account에서 발급받은 Secret Key"

Service 생성

아래의 명령어를 통해서 sls-tutorial이라는 이름의 서비스 디렉토리를 생성합니다.

$ mkdir -p sls-tutorial
$ cd sls-tutorial

서비스 구성 파일인 serverless.yml을 생성합니다. providerplugins을 다음과 같이 설정해야 합니다.

지원 region
  • fin
# serverless.yml
service: sls-tutorial
 
provider:
  name: navercloud
  region: fin
 
functions:
  tuto1:
    handler: handler.tuto1
    runtime: nodejs:16
    memory: 256
    timeout: 60000
  tuto2: # tuto2 액션은 vpc 플랫폼에 배포됩니다.
    handler: handler.tuto2
    runtime: nodejs:16
    memory: 256
    timeout: 60000
    vpc:
      vpcNo: 1
      subnetNo: 2
 
plugins:
  - serverless-navercloud

서비스에서 참조할 액션 코드를 작성합니다.

// handler.js
'use strict';
 
function tuto1(params) {
  const name = params.name || 'World';
  console.log('log', { payload: `Hello, ${name}` });
  return { payload: `Hello, ${name}!` };
}
 
function tuto2(params) {
  return { payload: 'hello world' };
}
 
module.exports = {
  tuto1, tuto2
};

네이버 클라우드 플랫폼의 Cloud Functions를 구성할 수 있도록 serverless-navercloud 플러그인을 설치합니다.

$ serverless plugin install -n serverless-navercloud

액션 배포

serverless.yml에 정의된 액션을 Cloud Functions에 배포합니다. functions의 events 속성이 정의된 경우, Cloud Functions의 트리거도 배포되며 액션과 연결됩니다.

$ serverless deploy

액션 실행

클라우드 상에서 액션을 실행할 수 있습니다.

$ serverless invoke -f tuto1

액션 로그 확인

특정 액션의 실행 이력과 로그를 확인할 수 있습니다.

$ serverless logs -f tuto1

액션/트리거 구성 상세 예시

Cloud Functions에서 제공하는 다양한 타입들의 리소스를 serverless.yml에 등록하는 예시입니다.

참고

아래 serverless.yml 예제에서 하기의 항목들은 사용자의 리소스 정보로 대체되어야 합니다.

  • Cloud Insight Trigger의 Product Key와 Rule Group ID
  • Object Storage Trigger의 BucketName과 Event Name
  • VPC / Subnet ID 정보
service: sls-tutorial

provider:
  name: navercloud
  region: fin

functions:
  vAct1:
    name: vAct1
    handler: handler.vpcActionFunc
    runtime: nodejs:16
    memory: 256
    timeout: 60000
    vpc:
      vpcNo: 30308
      subnetNo: 65617
    events:
        # cron trigger on vpc platform
      - triggerName: vCronTrg
        type: cron
        cronOption: "* * 1 * *"
        # cloud insight trigger on vpc platform
      - triggerName: vCloudInsTrg
        type: insight
        description: "cloud insight trigger on vpc platform"
        insightLink:
          - prodKey: "460438474722512896"
            ruleGrpId: "749659968722046976"
            reminderTime: 500
            enableNotiWhenEventClose: false
        # object storage trigger on vpc platform
      - triggerName: vObsTrg
        type: object_storage
        objectStorageLink:
          - bucketName: "myBucket"
            eventRuleName: "myEventRule"
  vAct2:
    name: vAct2
    handler: handler.vpcActionFunc
    runtime: nodejs:12
    memory: 128
    timeout: 60000
    vpc:
      vpcNo: 30308
      subnetNo: 65617
  # sequence action on vpc platform
  vSeqAct:
    sequence:
      - vAct1
      - vAct2
    vpc:
      vpcNo: 30308
      subnetNo: 65617

plugins:
  - serverless-navercloud

제약사항

  • Serverless Framework v4 이상은 지원하지 않습니다.
  • 액션 외부 연결 생성 지원하지 않습니다.
  • Node.js, Python 런타임을 제공하며 추후 전체 런타임 지원 예정입니다.
  • 로컬 디버그 기능은 지원하지 않습니다.