본문 바로가기
DEVOPS/Serverless With Golang

[Serverless With Golang] 2. Serverless Framework

by junthetechguy 2024. 7. 3.
 

TABLE OF CONTENTS

 

     

    1. Can I use framework to make serverless architecture? 

    우선 서버리스를 배포하기 위한 Framework가 어떤게 있는지 확인을 해주자.

     

    python 진영에서는 Zappa라는 프레임워크를 사용한다.

    Terraform은 IaC를 하기 위해서 만든 것이고, Serverless 프레임워크를 사용하도록 하자.

    Serverless Framework는 서버리스 서비스(ex, AWS Lambda)와 연결되는 서비스들(가령, AWS EventBridge나 SNS나 API Gateway)을 구성하고, 각 환경에 맞게 작성한 작성한 코드를 쉽게 배포하고 관리하기 위한 프레임워크이다.

    Serverless framework의 plugin으로는 python을 위한 Serverless Python requirements도 있고,

    Datadog과의 연동을 위한 Serverless Plugin Datadog도 있고,

    AWS lambda에서 Warm start를 위해선 지속적으로 컨테이너가 살아 있어야 하는데 살아있는 컨테이너로 지속되기 위해서 계속 스케줄링을 해서 Event를 발생시켜서 Lambda를 동작시키게 해서 Cold start를 하지 않도록 해서 트래픽이 갑자기 들어오거나 어떤 이벤트가 갑작스럽게 발생했을 때 즉각적으로 Function이 실행될 수 있도록 하는 Serverless Plugin Warmup도 존재한다.

     

    2. How to make a simple example using Serverless Framework?

    이제 Serverless framework를 직접 사용해보자.

    Serverless framework도 역시 serverless.com이라는 공식 사이트에 Reference(공식 문서)가 많으므로 참고하도록하자.

     

    aws configure라는 명령어를 이용하면 local 환경에 aws 계정을 사용할 수 있는 환경을 세팅할 수 있게 된다.

    어쨌거나 aws configure를 입력하면 아래 부분을 세팅하라는 부분이 나오게 된다.

     

    이걸 다 입력한 후 aws configure list를 입력하게 되면 이 aws 계정에 대해 사용할 수 있는 access key와 secret key가 설정되어 있는 것을 볼 수 있다.

    serverless create --help를 입력하게 되면 아래와 같이 Serverless framework에서 template으로 제공되는게 졸라게 많은 것을 볼 수 있다. 나는 여기서 aws-go template을 만들도록 한다.

     

    serverless create 명령어를 입력하면 hello와 world repo가 모두 다 생성이 되게 된다.

     

     

    이제 그러면 코드를 보기 위해서 /hello에 있는 main.go로 가보자.

     

     

    http request가 들어오게 되면 func Handler라는 함수가 실행이 되게 되고 message를 담고 있는 body가 response로 user에게 나가게 된다.

    이제 배포를 위해서 Makefile을 작성하도록 하자. Golang으로 빌드하기 위해서는 Makefile을 작성해야만 한다. 이 Makefile에 작성된 build나 deploy와 같은 명령어를 통해서 Go file(.go)를 빌드를 하고 build되어 나온 binary file을 실제로 aws 환경에 deploy까지 할 수 있게 된다.

     

     

    Makefile에는 build clean deploy라는 세가지가 존재하게 되는데 build는 main.go라는 Go file을 build를 통해서 binary file로 만들어주는 명령어이고, clean은 이전에 만들었던 binary file을 지울 때 사용하는 명령어이고, deploy는 clean→build 후에 실제로 배포를 진행하는 명령어이다.

    따라서 일단 go mod init example을 통해서 mod file을 만들어준 다음 go mod tidy 명령어를 통해서 main.go에서 사용하는 library들의 dependency를 찾아서 mapping해주도록 하자. 그 후 make build를 쳐보게 되면 build가 되게 되고, 이제 실제로 example/bin으로 들어가면 hello와 world가 binary file로 들어가 있게 된다. 그 후 make deploy라는 명령어로 배포를 하게 되면 serverless.yaml을 읽어서 그 환경대로 내가 local에 연결해두었던 aws 환경으로 배포를 하게 된다. 이때도 역시 AWS CloudFormation이라는 aws service를 통해서 배포가 실제로 이루어지게 되는 것이다. 이때 배포되는 과정은 코드의 양이나 binary 결과물의 크기에 따라서 속도가 다르게 되는데 만약 코드를 모듈화해서 작게 짜면 그만큼 파일 용량 자체가 작기 때문에 좀 더 빠르게 수행되게 된다.

    지금은 http event로 해서 lambda가 수행되도록 하였으므로 lambda 앞에 api gateway라는 resource가 만들어졌을 거고 그 뒤에서 lambda가 수행되는 구조가 되었다.

     

    위의 deploy 결과물로 나온 enpoint 중에서 hello로 curl 명령어를 날려서 URL을 통한 Lambda Triggering이 제대로 동작하는지 확인해보자(Response가 제대로 나오면 성공)

     

    [Reference]

    1. https://www.serverless.com/plugins/serverless-go-build

     

    Serverless Framework: Plugins

    The Serverless Framework Plugin Registry. Search thousands of Serverless Framework plugins.

    www.serverless.com

    2. https://akku-dev.tistory.com/155

     

    Go + serverless framework로 Lambda 관리하기

    앞서 이야기했지만 Go도 알아야되는 상황이 됐다. 그 이유는 Go로 개발한 Lambda가 있기 때문이다. 아무것도 몰라서 바닥부터 머리를 박아가면서 알게된것들이 많다. Go로 Lambda를 개발할 때 주의할

    akku-dev.tistory.com