- 인쇄
- PDF
Serverless Framework
- 인쇄
- PDF
서버리스 프레임워크는 다양한 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
...
Basic 트리거
- triggerName: basicTrg
type: basic
productId: <API Gateway Product ID>
apiName: <API Gateway API Name>
stageName: <API Gateway Stage Name>
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
을 생성합니다. provider
와 plugins
을 다음과 같이 설정해야 합니다.
- 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 예제에서 하기의 항목들은 사용자의 리소스 정보로 대체되어야 합니다.
- Basic Trigger, Github Trigger 외부 연결 주소 생성을 위한 productId, apiName, stageName
- 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:
# basic trigger on vpc platform
- triggerName: vBasicTrg
type: basic
productId: "2vnk18dvh2"
apiName: "api"
stageName: "v2"
# cron trigger on vpc platform
- triggerName: vCronTrg
type: cron
cronOption: "* * 1 * *"
# github trigger on vpc platform
- triggerName: vGitTrg
type: github
username: "cloudfunctions@ncloud.com"
accessToken: "*****"
repository: "navercloud/cloudfunctions"
events:
- "*"
productId: "2vnk18dvh2"
apiName: "api"
stageName: "v2"
# cloud iot core trigger on vpc platform
- triggerName: vCloudIotTrg
type: iot
iotLink:
- ruleName: "myIoTRule"
# 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 런타임을 제공하며 추후 전체 런타임 지원 예정입니다.
- 로컬 디버그 기능은 지원하지 않습니다.