Serverless 프레임워크로 서버리스 애플리케이션 생성 및 배포하기


이 튜토리얼은 이어지는 튜토리얼입니다. 이 포스트를 통해 블로그에 처음 방문하셨다면 Serverless 강좌 목록 페이지를 확인해주세요.

AWS Lambda, Azure Functions, Google Cloud Functions 를 통하여 서버리스 애플리케이션을 만들게 된다면, 단순히 함수들을 작성하는 것 뿐만이 아니라 해당 애플리케이션에서 필요한 아키텍쳐들을 설정해주어야하는데, 이는 수동으로 하나 하나 직접하기엔 꽤나 번거로운 일 입니다. Serverless 를 사용하면, 매우 간단하게 애플리케이션을 만들고 배포 할 수 있습니다.

이렇게나 간단합니다!

 

그럼, 본격적으로 시작해볼까요?

 

준비사항

Node.js 와 npm

Serverless 를 사용하시려면, 여러분의 작업환경에 Node.js 와 npm 이 설치되어있어야 합니다. (npm 대신 yarn 을 사용하셔도 무방합니다.) 그리고, 앞으로 이 튜토리얼에서는 서버리스 애플리케이션을 자바스크립트로 작성을 하게 되므로 관련 지식을 어느정도 가지고 있으면 도움이 됩니다. (서버리스 애플리케이션은 C#, Java Python, Golang 등으로 작성 할 수도 있습니다.)

Node.js 버전은, LTS 버전으로 설치하세요 (현재 기준 v8.9.2)

Serverless 설치하기

$ npm install -g serverless
$ sls --version
1.26.0

npm 을 통하여 serverless 를 설치하시면, serverless, 혹은 sls 명령어를 통하여 사용 하실 수 있습니다. sls --version 을 입력하여 설치가 잘 됐는지 확인하세요.

Serverless 로그인

Serverless 플랫폼에 로그인을 해보겠습니다. 이 작업은 필수적인 작업은 아니여서, 건너뛰어도 상관 없습니다. Serverless 플랫폼에 로그인을 하고 나중에 배포를 하게 된다면, 다음과 같이 그동한 배포한 함수와, 함수들을 위한 문서들을 확인 할 수 있습니다.

$ sls login

위 명령어를 통해 로그인을 할 수 있습니다. (GitHub 계정으로 로그인 됩니다)

AWS 사용자 및 크리덴셜 만들기

우리는 Serverless 프레임워크를 통하여 AWS 에 우리의 애플리케이션을 배포할 것입니다. 그러려면, 프레임워크가 해당 작업을 진행해 줄 수 있도록 권한 설정을 해 주어야 합니다.

우선, AWS 에 로그인 해서 IAM 페이지에 들어가세요.

그리고, 사용자 탭에 들어가서 사용자 추가를 클릭하세요.

사용자 이름을 적고, 액세스 유형은 프로그래밍 방식 액세스를 선택합니다.

권한 설정 부분에서는 기존 정책 직접연결로 들어가서 AdministratorAccess 를 체크해주세요.

권한 설정은 나중에 가서 실제로 사용하게 될, 필요한 부분만 체크하셔도 됩니다. 예: API Gateway 관련, Lambda 관련, CloudFormation 관련… 지금은 편의상 모든 권한을 주는 정책을 설정해주겠습니다.

설정 완료 후 다음으로 넘어가 사용자 만들기를 완료하면, 액세스 키 ID 와 비밀 액세스 키가 나타납니다:

이 키들은 매우 중요합니다. 그리고, 어디에 노출하게되면 정말 큰일이 날 수 있으니 보안에 유의해주세요.

방금 나온 키를 가지고, 다음과 같이 명령어에 넣어주세요.

$ serverless config credentials --provider aws --key 액세스키ID --secret 비밀액세스키
Serverless: Setting up AWS...
Serverless: Saving your AWS profile in "~/.aws/credentials"...
Serverless: Success! Your AWS access keys were stored under the "default" profile.

Serverless 템플릿을 통하여 애플리케이션 생성하기

Serverless 의 템플릿을 사용하여 새 애플리케이션을 만들어보겠습니다. 우선, 다음 명령어를 실행해주세요.

$ sls create -t

그러면, 다음과 같이 오류가 뜨면서 사용 할 수 있는 템플릿 목록이 나타납니다.

Serverless: Generating boilerplate...

  Serverless Error ---------------------------------------

  Template "true" is not supported. Supported templates are: "aws-nodejs", "aws-nodejs-typescript", "aws-nodejs-ecma-script", "aws-python", "aws-python3", "aws-groovy-gradle", "aws-java-maven", "aws-java-gradle", "aws-kotlin-jvm-maven", "aws-kotlin-jvm-gradle", "aws-kotlin-nodejs-gradle", "aws-scala-sbt", "aws-csharp", "aws-fsharp", "aws-go", "aws-go-dep", "azure-nodejs", "google-nodejs", "kubeless-python", "kubeless-nodejs", "openwhisk-nodejs", "openwhisk-php", "openwhisk-python", "openwhisk-swift", "spotinst-nodejs", "spotinst-python", "spotinst-ruby", "spotinst-java8", "webtasks-nodejs", "plugin" and "hello-world".

정말 다양하죠? 우리는 이중에서 aws-nodejs 를 사용하겠습니다.

자, 터미널에서 다음 명령어를 입력하세요.

$ sls create -t aws-nodejs -p hello-serverless
Serverless: Generating boilerplate...
Serverless: Generating boilerplate in "/Users/velopert/sls-workshop/hello-serverless"
 _______                             __
|   _   .-----.----.--.--.-----.----|  .-----.-----.-----.
|   |___|  -__|   _|  |  |  -__|   _|  |  -__|__ --|__ --|
|____   |_____|__|  \___/|_____|__| |__|_____|_____|_____|
|   |   |             The Serverless Application Framework
|       |                           serverless.com, v1.26.0
 -------'

Serverless: Successfully generated boilerplate for template: "aws-nodejs"

그러면, hello-serverless 라는 경로에 handler.js 파일과 serverless.yml 파일이 나타납니다. 한번 확인해볼까요?

handler.js

'use strict';

module.exports.hello = (event, context, callback) => {
  const response = {
    statusCode: 200,
    body: JSON.stringify({
      message: 'Go Serverless v1.0! Your function executed successfully!',
      input: event,
    }),
  };

  callback(null, response);

  // Use this code if you don't use the http event with the LAMBDA-PROXY integration
  // callback(null, { message: 'Go Serverless v1.0! Your function executed successfully!', event });
};

serverless.yml – 주석 제외

service: hello-serverless

provider:
  name: aws
  runtime: nodejs6.10

functions:
  hello:
    handler: handler.hello

로컬에서 함수 호출해보기

serverless 를 통하여 함수가 잘 작동하는지 확인해보는 방법을 알아봅시다. 함수를 호출 할 때에는 invoke 를 사용합니다.

$ serverless invoke local --function hello
{
    "statusCode": 200,
    "body": "{\"message\":\"Go Serverless v1.0! Your function executed successfully!\",\"input\":\"\"}"
}

serverless.yml 파일 수정하기

serverless.yml 파일을 조금 수정해보겠습니다. 우선, region 과 stage 를 설정해주겠습니다. region 의 경우엔 AWS 에서 배포할 지역을 설정합니다. 기본적으로는 미국으로 설정되니, 이 값을 ap-northeast-2 로 입력하여 한국으로 설정시키겠습니다. stage 는 현재 애플리케이션의 배포 상태를 의미합니다. 이는 prod 로 하거나, dev 로 설정 할 수 있습니다.

추가적으로, hello 함수에서 events 값을 추가하여 API Gatway 와 연결하겠습니다. 코드 4줄이면, 함수에 API 를 달아줄 수 있습니다.

service: hello-serverless

provider:
  name: aws
  runtime: nodejs6.10
  stage: dev
  region: ap-northeast-2

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

배포하기

함수를 배포할 때는, sls deploy 명령어를 입력하시면 됩니다.

$ sls deploy
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading service .zip file to S3 (409 B)...
Serverless: Validating template...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
..........
Serverless: Stack update finished...
Service Information
service: hello-serverless
stage: dev
region: ap-northeast-2
stack: hello-serverless-dev
api keys:
  None
endpoints:
  GET - https://4mmtbsr9eg.execute-api.ap-northeast-2.amazonaws.com/dev/hello
functions:
  hello: hello-serverless-dev-hello
Serverless: Publish service to Serverless Platform...
Service successfully published! Your service details are available at:
https://platform.serverless.com/services/velopert/hello-serverless

우리가 방금 만든 API 에 요청을 넣어볼까요?

잘 되는군요!

정리

이번 튜토리얼에선, Serverless 의 기본적인 사용법을 알아보았습니다. 이어질 튜토리얼에서는, Serverless 를 활용하여 여러가지 함수를 만들고, npm 패키지를 설치해서 사용하는 방법을 알아보겠습니다.

  • 이재우

    deploy 하면 The AWS Access Key Id needs a subscription for the service 뜨는 이유는 뭘까요..