Serverless Framework
    • PDF

    Serverless Framework

    • PDF

    Article Summary

    Classic/VPC 환경에서 이용 가능합니다 .

    서버리스 프레임워크는 다양한 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액션 메모리X256 (MB)128, 256, 512
    timeout액션이 실행될 수 있는 최대 시간X60000 (ms)MIN 500 MAX 300000
    vpc액션과 연결되는 VPC, Subnet 정보X생략 시 Classic 리소스로 배포
    • 예시
    # serverless.yml
    service: myService
     
    provider:
      name: navercloud
      region: kr
     
    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: handler.main
        packageName: myPackage
    

    명시적으로 패키지를 배포하고 액션에서 지정할 경우, resource/packages에 배포할 패키지를 정의해야 합니다. vpc: true 옵션이 없으면 Classic 리소스로 배포됩니다.

    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>
    

    Github 트리거

    - triggerName: gitTrg
      type: github
      username: <Github Username>
      accessToken: <Github Access Token>
      repository: <Github Repository>
    

    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>
    

    Cloud IoT 트리거

    - triggerName: iotTrg
      type: iot
      iotLink:
        - ruleName: <Cloud IoT Core Rule Name>
    

    Object Storage 트리거

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

    Source Commit 트리거

    - triggerName: scTrg
      type: source_commit
      sourceCommitLink:
        - repositoryName: <Source Commit Repository Name>
          webhookName: <Source Commit Respository's Webhook Name>
          enable: <true | false>
    

    사용법

    서버리스 프레임워크 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
    
    참고
    • --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을 다음과 같이 설정해야 합니다.

    서비스 구성을 작성합니다. provider와 plugins을 다음과 같이 설정해야 합니다.

    참고
    • 지원 region
      • kr (default)
      • sg
      • jp
    # serverless.yml
    service: sls-tutorial
     
    provider:
      name: navercloud
      region: kr
     
    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
    • Github Trigger의 Github Access Information
    • Cloud IoT Core Trigger의 Rule name
    • Cloud Insight Trigger의 Product Key와 Rule Group ID
    • Object Storage Trigger의 BucketName과 Event Name
    • VPC / Subnet ID 정보
    service: sls-tutorial
    
    provider:
      name: navercloud
      region: kr
    
    functions:
      cAct1:
        handler: handler.classicActionFunc1
        runtime: nodejs:16
        memory: 128
        timeout: 30000
        events:
          # basic trigger on classic platform
          - triggerName: cBasicTrg
            type: basic
            productId: "2vnk18dvh2"
            apiName: "api"
            stageName: "v2"
          # cron trigger on classic platform
          - triggerName: cCronTrg
            type: cron
            cronOption: "* * 1 * *"
          # github trigger on classic platform
          - triggerName: cGitTrg
            type: github
            username: "cloudfunctions@ncloud.com"
            accessToken: "*****"
            repository: "navercloud/cloudfunctions"
            events:
              - "*"
            productId: "2vnk18dvh2"
            apiName: "api"
            stageName: "v2"
          # cloud iot core trigger on classic platform
          - triggerName: cCloudIotTrg
            type: iot
            iotLink:
              - ruleName: "myIoTRule"
          # cloud insight trigger on classic platform
          - triggerName: cCloudInsTrg
            type: insight
            description: "cloud insight trigger on classic platform"
            insightLink:
              - prodKey: "460438474722512896"
                ruleGrpId: "749659968722046976"
                reminderTime: 500
                enableNotiWhenEventClose: false
          # object storage trigger on classic platform
          - triggerName: cObsTrg
            type: object_storage
            objectStorageLink:
              - bucketName: "myBucket"
                eventRuleName: "myEventRule"
      # sequence Action on classic platform
      cAct2:
        handler: handler.classicActionFunc2
        runtime: nodejs:8
      cSeqAct:
        sequence:
          - sls-tutorial-dev-cAct1
          - sls-tutorial-dev-cAct2
      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"
            # source commit trigger on vpc platform
          - triggerName: vScTrg
            type: source_commit
            sourceCommitLink:
              - repositoryName: "myRepo"
                webhookName: "myWebhook"
                enable: true
      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
    

    제약사항

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

    이 문서가 도움이 되었습니까?

    Changing your password will log you out immediately. Use the new password to log back in.
    First name must have atleast 2 characters. Numbers and special characters are not allowed.
    Last name must have atleast 1 characters. Numbers and special characters are not allowed.
    Enter a valid email
    Enter a valid password
    Your profile has been successfully updated.