1.2 서버리스 프레임워크

서버리스 프레임워크Serverless Framework에 대한 설명은 공식 홈페이지의 문구에 잘 나타납니다.




“서버리스는 서버 없는 아키텍처를 배치하고 운영하기 위한 툴킷입니다. 인프라가 아닌 애플리케이션에 집중합니다(Serverless is your toolkit for deploying and operating serverless architectures. Focus on your application, not your infrastructure)."


서버리스 프레임워크는 서버리스 아키텍처를 운영하기 위한 오픈소스 도구Tool라고 생각하면 쉽습니다. 그러면 서버리스 프레임워크를 사용하기 위한 환경은 어떻게 될까요? Node.js가 설치된 환경에서 사용 가능합니다. 서버리스 프레임워크는 오픈소스이기에 누구나 프로젝트에 참여할 수 있습니다. 서버리스 프레임워크 깃허브의 issue와 pull request를 통해 프로젝트에 기여할 수 있습니다.


서버리스 프레임워크 살펴보기

먼저 서버리스 프레임워크 관련 명령어를 알아봅니다.

$ npm i -g serverless
# 명령어들을 확인해봅니다.
$ serverless --help

Commands
* You can run commands with "serverless" or the shortcut "sls"
* Pass "--verbose" to this command to get in-depth plugin info
* Pass "--no-color" to disable CLI colors
* Pass "--help" after any <command> for contextual help

Framework
* Documentation: https://serverless.com/framework/docs/

config ........................ Configure Serverless
config credentials ............ Configures a new provider profile for the Serverless Framework
create ........................ Create new Serverless service
deploy ........................ Deploy a Serverless service
deploy function ............... Deploy a single function from the service
deploy list ................... List deployed version of your Serverless Service
deploy list functions ......... List all the deployed functions and their versions
info .......................... Display information about the service
install ....................... Install a Serverless service from GitHub or a plugin from the Serverless registry
invoke ........................ Invoke a deployed function
invoke local .................. Invoke function locally
logs .......................... Output the logs of a deployed function
metrics ....................... Show metrics for a specific function
package ....................... Packages a Serverless service
plugin ........................ Plugin management for Serverless
plugin install ................ Install and add a plugin to your service
plugin uninstall .............. Uninstall and remove a plugin from your service
plugin list ................... Lists all available plugins
plugin search ................. Search for plugins
print ......................... Print your compiled and resolved config file
remove ........................ Remove Serverless service and all resources
rollback ...................... Rollback the Serverless service to a specific deployment
rollback function ............. Rollback the function to the previous version
slstats ....................... Enable or disable stats

Platform (Beta)
* The Serverless Platform is currently in experimental beta. Follow the docs below to get started.
* Documentation: https://serverless.com/platform/docs/

emit .......................... Emits an event to a running Event Gateway
login ......................... Login or sign up for the Serverless Platform
logout ........................ Logout from the Serverless Platform
run ........................... Runs the Event Gateway and the Emulator

Plugins
AwsConfigCredentials, Config, Create, Deploy, Emit, Info, Install, Invoke, Login, Logout, Logs, Metrics, Package, Plugin, PluginInstall, PluginList, PluginSearch, PluginUninstall, Print, Remove, Rollback, Run, SlStats


이중 자주 사용하는 명령어는 다음과 같습니다.

  • create : 프로젝트를 생성한다.

  • deploy : 프로젝트를 배포한다.

  • package : 배포될 패키지의 구조를 확인한다.

  • invoke : 특정 핸들러Handler를 동작시킬 때 사용

  • remove : 배포된 리소스를 제거한다.


서버리스 명령어를 로컬 환경에서 간단히 실습해봅시다. 이중 deploy 명령어는 추후에 사용하겠습니다.

# serverless service 생성 힌트 받기
$ serverless create --help
Plugin: Create
create ........................ Create new Serverless service
   --template / -t .................... Template for the service. Available templates: "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", "fn-nodejs", "fn-go", "google-nodejs", "kubeless-python", "kubeless-nodejs", "openwhisk-java-maven", "openwhisk-nodejs", "openwhisk-php", "openwhisk-python", "openwhisk-swift", "spotinst-nodejs", "spotinst-python", "spotinst-ruby", "spotinst-java8", "webtasks-nodejs", "plugin" and "hello-world"
   --template-url / -u ................ Template URL for the service. Supports: GitHub, BitBucket
   --template-path .................... Template local path for the service.
   --path / -p ........................ The path where the service should be created (e.g. --path my-service)
   --name / -n ........................ Name for the service. Overwrites the default name of the created service. ## "

# node를 사용하므로 템플릿을 "aws-nodejs" 로 "sample-app" 생성하기
$ serverless create -t "aws-nodejs" -p sample-app

# sample-app에서 명령어 연습하기
$ cd sample-app
~/sample-app $ serverless package
Serverless: Packaging service...
Serverless: Excluding development dependencies...

# 여기까지 진행했다면 .serverless 디렉터리를 확인할 수 있습니다.
~/sample-app $ cd .serverless

# 생성된 파일 구조는 다음과 같습니다.
~/sample-app/.serverless $ ls
cloudformation-template-create-stack.json
cloudformation-template-update-stack.json
sample-app.zip
serverless-state.json


앞의 실습에서 생성한 파일명만으로도 생성된 파일이 어떻게 동작하는지는 충분히 짐작할 수 있습니다.

deploy 명령어를 실행하면 Serverless Framework가 내부적으로 AWS 클라우드포메이션cloudformation을 사용하여 배포합니다. 클라우드포메이션에 스택stack이 있지 않을 경우 스택을 생성하고, 이전에 생성한 스택이 있으면 업데이트하여 원하는 코드를 람다에 배포합니다.

Serverless-state.json 파일에는 해당 버전의 서버리스 애플리케이션serverless application 정보가 담겨 있습니다.


# 다시 앱의 루트 디렉터리로 돌와와서 invoke를 해보겠습니다.
~/sample-app/.serverless $ cd ..
~/sample-app $ serverless invoke local --function hello
{
   "statusCode": 200,
   "body": "{\"message\":\"Go Serverless v1.0! Your function executed successfully!\",\"input\":\"\"}"
}