이 튜토리얼은 이어지는 튜토리얼입니다. 이 포스트를 통해 블로그에 처음 방문하셨다면 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 패키지를 설치해서 사용하는 방법을 알아보겠습니다.