Dev&Ops/DevOps

[Infra] Serverless란?(2)

zeroneCoder 2022. 2. 18. 00:59

안녕하세요! zerone-code입니다.

 

오늘은 AWS나 Azure, GCP 등 Cloud Infra를 다루는데 꼭 이해하고 넘어가야 할 개념인 Serverless에 대해 2번째로 다뤄보고자 합니다.

 

오늘은 지난 글에서 소개해드린 Framework for Serverless 중 하나인 Serverless Framework를 소개해드리고, AWS Lambda를 이용한 간단한 예제를 보여드리고자 합니다.

 

2022.02.08 - [Dev&Ops/DevOps] - [Infra] Serverless란?(1)

 

[Infra] Serverless란?(1)

안녕하세요! zerone-code입니다. 오늘은 AWS나 Azure, GCP 등 Cloud Infra를 다루는데 꼭 이해하고 넘어가야 할 개념인 Serverless에 대해 다뤄보고자 합니다. 2022.01.29 - [Dev&Ops/DevOps] - [Automation] AW..

zerone-code.tistory.com

 

이번 글에서 설명드릴 개념이 완벽히 이해가 되셨으면 좋겠습니다.


1. Introduction to Serverless Framework

각 Cloud Vendor마다 각자의 Serverless 서비스를 제공해주고 있습니다. AWS의 Lambda, Azure의 Functions, GCP의 Cloud Functions을 사용해서 Serverless 서비스를 구성하여 사용할 수 있습니다.

 

이 과정에서 Serverless 서비스와 연결되는 서비스(AWS의 EventBridge나 SNS 등)를 구성하고 각 환경에 맞게 작성한 코드를 쉽게 배포하고 관리하기 위해서 프레임워크가 필요한데 이때 사용되는 것이 바로 Serverless Framework입니다.

 

Serverless Framework는 go, js, ruby, C# 등 다양한 언어와 다양한 CSP를 지원해주고 있습니다.

 

저는 AWS Lambda를 작성할 때 Serverless Framework를 사용하여 작성하고, 언어는 주로 golang을 이용해 작성하는 편입니다.

 

Serverlesss Framework는 Serverless 서비스를 배포할 때만 사용되는 것이 아니라 Serverless로 작성된 함수의 Monitoring이나 CI/CD도 지원해주는 막강한 기능을 가지고 있습니다.(유료인 걸로 보입니다.)

뿐만 아니라 각 CSP에 따른 다양한 예제도 제공해주고 있으니 공식 사이트 예제로 들어가서 확인해보면 좋을 것 같습니다.

 

Serverless Examples: Real-World Serverless Apps

Our serverless application repository features examples of real-world serverless architectures on AWS Lambda, like REST APIs, streaming data architectures, DynamoDB structures & more.

www.serverless.com

 

2. Key Knowledges of Serverless Framework

Serverless Framework를 사용하기 위해서는 먼저 Serverless Framework의 설정에 들어가는 핵심 요소를 알 필요가 있습니다.

 

이번 글에서는 여러 CSP 중 AWS의 Lambda를 구성하는 예제로 설명해보고자 합니다.

 

아래와 같이 크게 6가지 요소로 Serverless Framework의 설정 요소를 정리할 수 있습니다.

 

service : 여러 functions이나 resource를 하나로 묶어둔 개념입니다.

provider : 구성되는 serverless 대한 환경에 대한 설정입니다. 어떤 stage인지, 어떤 언어와 runtime을 사용하는지, 어떤 iam role을 사용 하즌지 등을 적어서 사용할 수 있습니다.

plugin : serverless 기능을 확장할 때 많이 사용되는 기능입니다. 대표적으로 datadog과 연동을 하는 경우, 'Serverless Plugin Datadog' 이라는 plugin을 사용할 수 있습니다.

package : serverless가 배포될 때는 zip의 형태로 build가 됩니다. 이 때 어떤 것들이 포함될지 결정하는 요소입니다. 빌드 결과물에 대해 함께 패키징을 할지(include), 아니면 제외할지(exclude)를 pattern을 통해 정할 수 있습니다.

functions : Lambda가 동작할 때, 실제로 동작하는 binary나 method를 지정하게 됩니다. 이 때 어떤 event로 trigger가 될지도 적어줍니다.(cronjob이나 http request 등)

resource : Lambda가 동작할 때 trigger가 되거나 함께 사용하는 AWS 서비스들을 의미합니다. AWS CloudFormation 형태로 정의하는 리소스는 모두 사용 가능합니다.

3. Prerequisite Using Serverless Framework

Serverless Install using npm

먼저 npm을 이용해서 serverless 를 설치해줍니다. 실습하는 환경은 macOS기준으로 진행하기 때문에 사용하시는 환경별로 약간의 차이는 있을 수 있습니다.

 

 

AWS Credential configuration

aws console을 통해 access key id와 secret access key를 발급받을 수 있습니다.

 

이를 바로 환경변수로 등록하거나 aws-cli를 이용해 개발환경에서 aws account를 이용해 접근할 수 있도록 설정해줍니다.

 

예제로 하는 AWS 계정에는 모든 리소스에 접근 가능한 role이 부여되있습니다.

각 필요한 리소스로 접근할 수 있도록 권한을 부여하셔도 상관 없습니다.

 

4. Write AWS Lambda Function Code

이제 위에서 Serverless를 설치하고, AWS Configuration을 다해줬다면 실제로 동작하는 Lambda 코드를 Serverless Framework를 활용해 작성해볼 차례입니다.

 

먼저 Serverless에서 지원해주는 언어목록이 어떤 것이 있는지 살펴봅시다.

 

아래 명령어처럼 sls create --help라는 명령어를 치게 되면 --template/-t 옵션에 사용할 수 있는 template(언어 지원 형식)이 많은 것을 살펴볼 수 있습니다. 

 

이 중 aws-go라는 template으로 예제를 진행해보겠습니다.

아래 명령어처럼 serverless framework를 활용해 aws-go라는 template로 example라는 폴더를 생성했습니다.

 

실제로 생성을 하게 되면 기본적으로 hello와 world라는 예제 폴더가 구성되있는데, 저는 그중 hello만 사용하기 위해 world라는 폴더를 지웠습니다.

 

그 결과 1개의 hello 폴더와 serverless.yml, Makefile이 있는 것을 확인할 수 있습니다.(hello안에 main.go파일까지 있어서  3개의 파일입니다.)

기본적으로 구성되는 serverless.yml을 한번 살펴보도록 하겠습니다.

 

많은 주석이 달려있을텐데요, 저는 주석들을 제거하고 필요한 부분만 가져와봤습니다.

 

보시면 service라는 이름이 제일 위에 적혀있습니다. example이라는 service 단위가 됩니다. 

그리고 그 아래로 provider에는 runtime과 어떤 cloud provider를 사용하는지, 그리고 제외할 package pattern, 어떤 function을 배포하고 event는 어떻게 받을지가 순서대로 명시되있는 것을 확인할 수 있습니다.

 

더 많은 내용은 주석을 확인해보시면 좋을 것 같습니다.

 

이 설정으로 lambda가 구성되게 됩니다. 지금 구성으로는 1개의 APIGateway가 event가 되어 lambda를 호출해주는 구조가 됩니다.

그 다음으로 실제로 동작하는 function 코드를 보도록 하겠습니다. 

 

어떤 요청이 APIGateway를 통해 들어오면 message를 담아서 response 하도록 되있습니다.

이렇게 작성한 함수를 배포해보도록 하겠습니다.

 

Makefile을 이용해서 배포를 진행해도 좋고, sls 명령어를 이용해서 배포해도 상관없습니다.

 

하지만 Makefile이 있으니 이를 이용해 배포해보도록 하겠습니다.

 

먼저 golang을 빌드하기 전에 golang은 library를 go.mod를 통해 관리합니다. 따라서 이를 생성해주고 sync를 맞춰줘야 합니다.

 

그리고 make deploy 를 하면 빌드와 함께 배포가 되게 됩니다.

최종적으로 배포된 HttpApiUrl이 나오고 성공적으로 배포되었다는 메시지가 나옵니다.

 

그렇다면 실제로 GET 요청을 날려보도록 하겠습니다.

코드에 작성한 대로 GET 요청을 보내게 되면 response로 지정한 message가 오는 것을 확인할 수 있습니다.

 

지금까지 serverless framework를 활용하여 AWS Lambda와 APIGateway를 활용한 예제였습니다.

5. Additional Tool

lumigo-cli

Repository : https://github.com/lumigo-io/lumigo-CLI

 

GitHub - lumigo-io/lumigo-CLI: Open source CLI tool to help you develop and manage serverless applications.

Open source CLI tool to help you develop and manage serverless applications. - GitHub - lumigo-io/lumigo-CLI: Open source CLI tool to help you develop and manage serverless applications.

github.com

 

최근에 찾아본 cli tool입니다. 이 tool을 소개한 이유는 serverless 개념에서 가장 중요하다고 생각되는 cold start를 측정하는 기능과 모든 region의 lambda cost를 분석해주는 기능, 메모리 사이즈에 따른 성능 분석 등 Lambda 외에도 AWS에 관련된 많은 기능이 있어서 소개해드리고자 합니다.

 

이를 사용하기 위해서는 aws configure가 지정되어 있어야 하고, npm 사용이 가능한 환경이어야 합니다.

 

AWS의 Serverless 기능을 제공해주는 lambda와 관련된 명령어는 다음과 같이 있습니다. 각 명령어에 대한 설명은 위의 repository로 가셔서 살펴보시면 좋을 거 같습니다.

하지만 살펴보시는 것보다 실제 자신의 환경에 적용해서 보는 것이 더 좋은 방법이라는 생각이 듭니다!

 

다음 주제로는 serverless를 활용한 잘 사용안하는 RDS 관리라는 주제로 찾아오도록 하겠습니다.

 

궁금한 부분은 댓글로 남겨주시면 아는 만큼 성심성의껏 답변해드리도록 하겠습니다.

잘 읽으셨다면 많은 공감과 구독 부탁드립니다!

Reference

https://www.serverless.com/plugins

 

Serverless Framework: Plugin Repository

The Serverless Framework features over 1,000 community-authored plugins, including Offline, Custom Domains, AWS Lambda Warmer, Static Sites On S3, AWS AppSync GraphQL, Webpack & More...

www.serverless.com