본문으로 바로가기

Serverless 시작해보기

category Cloud Platform/AWS 2018.04.23 12:33

안녕하세요. 오늘은 Serverless에 대해 알아보고, AWS에 Serverless를 쉽게 배포하는 방법에 대해 알아보겠습니다.


Serverless

서버리스는 제가 요즘 자주 사용하고 있는 아키텍처 중에 하나입니다. 서버리스는 단어 그대로는 '서버가 없다' 라는 의미이지만 정말 서버가 없이 동작하는 것은 아니고, 우리가 실제 서비스를 하기 위해 가상머신이나 운영체제 환경을 구성하여 처리하지 않아도 서비스할 수 있음을 이야기합니다.


우리가 기존에 서비스를 운영하기 위해서는 아래와 같은 절차를 거쳐야 했습니다.


1. 서비스할 서버 준비

2. 운영체제 설치

3. 네트워크 환경 구축

4. 인프라 관리


전산실을 생각하시면 쉬울 것 같습니다. 서버를 운영하기 위해서는 기본적으로 한 대의 서버로 시작하여 해당 서버에 운영체제를 설치하고 인프라를 구축합니다. 인프라를 구축하는 데는 방화벽 등의 보안 장비도 포함됩니다. 이 부분이 커지게 되면 시스템 엔지니어를 고용해야 할 정도의 인력이 필요해지게 되겠죠..


이러한 부분을 가상화하여 직접 구축하는 비용을 덜 소모해줄 수 있도록 해주는 대표적인 서비스가 바로 IaaS입니다.


IaaS(Infrastructure as a Service)

IaaS는 시스템에서 필요한 모든 인프라 자원을 가상화하여 쉽게 서비스 해주는 것을 이야기 합니다. 대표적으로 Amazon Web Service의 EC2가 바로 이러한 서비스를 제공하며 더 이상 서버 자원, 네트워크, 보안 장비 등을 직접 구축할 비용을 줄여주는 것이죠. 


여기서 좀 더 간소화 된 것을 PaaS라 합니다.


PaaS(Platform as a Service)

IaaS는 우리가 인프라를 구축하는 환경에서 하드웨어 작업을 가상화 시켜주는 역할이었다면 PaaS는 그보다 더 간소화 되어 최적화된 런타임까지를 제공해줍니다. 따라서 애플리케이션(Flask, Django, Spring 등)만 배포하면 바로 서비스할 수 있죠. 그렇다면 로드 밸런싱과 같은 분산 환경은 어떻게? 그것도 모두 자동으로 제공해줍니다.



BaaS(Backend as a Service) / FaaS(Function as a Service)

제가 얘기하려고 하는 Serverless는 바로 여기에 속합니다. 요즘은 모바일, 웹 애플리케이션을 개발할 때 백엔드 서버 개발을 하곤 합니다. 물론 개발이 필요하지 않은 경우도 있습니다. 하지만 요즘 런칭되는 앱들은 대부분 서버와의 통신을 사용해 데이터를 주고 받고 결과를 도출하는 등의 앱의 구조가 대다수라고 볼 정도로 대중화 되어 있죠.


PaaS랑 큰 차이는 바로 서버 애플리케이션(Flask, Spring 등)이 없이도 서버 코드를 실행한다는 점입니다. 정말 이게 가능한 일인가요? 필자인 저도 놀랬지만 가능합니다. 



AWS를 이용한 Serverless 

서버를 개발하기 위해서는 그에 상응하는 운영 환경이 필요합니다. 위에서 설명 드린 것처럼 서버와 운영체제 설치는 필수이지만 이는 컨테이너 내지 가상 환경(KVM) 등으로 가상화 할 수 있는 솔루션이 존재합니다.


그런데 서버 애플리케이션이 없이 어떻게 백엔드 서버가 만들어질 수 있을까요? 지금 그 방법에 대해 알아보겠습니다.


먼저 우리가 백엔드 서버를 개발하기 위해서는 그를 처리할 서버 프로그램 코드가 필요합니다. 물론 이것은 당연한 것이지요. 그런데 여기서 서버의 역할을 하려면 엔드 포인트가 필요한데 보통 서버 프레임워크에서 이 엔드 포인트를 지정해줍니다. 


예를 들자면 HTTP 프로토콜을 사용한 백엔드 서버를 구축한다고 가정했을 때, 해당 코드가 POST 메소드를 사용해 라우팅할 것인지, GET 메소드를 사용해 라우팅할 것인지를 지정해줘야 한다는 것이죠. 


이를 위해 AWS에서는 두 가지 서비스를 사용합니다. 바로 코드를 작성할 수 있는 AWS Lambda와 엔드 포인트를 지정해주는 API Gateway 입니다.



Lambda를 사용한 코드 작성

AWS의 콘솔 화면에서 서비스를 누르게 되면 컴퓨팅 항목에서 Lambda 항목을 보실 수 있습니다.


함수 생성을 클릭하게 되면 코드를 작성하기 전, 파일 이름과 런타임 환경을 설정해야 합니다. 


저는 Python 3.6을 사용해서 작성해보겠습니다. 모두 입력하셨으면 함수 생성 버튼을 클릭합니다.


그러면 이렇게 코드를 작성할 수 있는 공간이 주어집니다. 코드를 웹에서 바로 작성할 수도 있지만 작성하다 보면 자신이 만든 라이브러리나 모듈을 사용하고 싶을 때가 생길 것입니다. 그럴 때는 ZIP으로 업로드를 할 수 있는 방법도 존재합니다.


그럼 간단하게 저의 블로그의 오늘 방문자 수가 몇명인지를 출력하는 코드를 작성해 보겠습니다.


이렇게 코드가 작성되었으면 이제 Lambda에 업로드를 하시면 됩니다.

(로컬에서 코드를 작성 후 업로드하실 때는 반드시 ZIP으로 압축하셔서 업로드하셔야 합니다.)


업로드는 위와 같이 하시면 되며 업로드 후에 반드시 저장 버튼을 클릭하셔야 코드가 적용됩니다.


자 이제 코드를 올렸으니 정상적으로 코드가 동작하는지 확인해보도록 하겠습니다. 테스트 버튼을 클릭하면 테스트 코드를 작성할 수 있는데, 저는 사용자 입력없이 단순히 접속하면 바로 알려주는 코드이므로 아무런 값을 넣고 테스트 하였습니다.


이렇게 테스트에 성공하면 코드가 정상적으로 동작하는 것입니다.


API Gateway를 사용한 엔드 포인트 생성

이제 코드가 완성되었으니 엔드 포인트를 주도록 해보죠. 저는 간단히 GET 메소드를 주면 바로 제 블로그 방문자 수가 접속되도록 한 번 해보겠습니다.


API Gateway에 접속하여 API 생성 버튼을 클릭하면 위 화면이 나오게 됩니다. 여기서 여러분들이 원하시는 API 이름을 입력해주신 후, API 생성 버튼을 눌러줍니다.


그럼 이제 여기서 여러분들이 원하는 리소스와 메소드를 생성할 수 있습니다. 헉.. 이럴 수가;


그럼 정말로 GET 메소드를 만들어주고 아까 작성한 코드의 함수 이름을 입력하고 저장을 누르시면 만들어집니다.

(권한 관련 메시지가 나오면 확인을 클릭해줍니다.)


이제 남은 것은 배포만 하면 됩니다.


배포는 URI를 설정하는 것이므로 주소에 들어갈 원하는 이름을 입력하시고 배포를 누르시면 됩니다.


최종적으로 배포가 완료되면 이렇게 서버리스한 저의 블로그 방문자 수 카운팅이 만들어졌습니다.



마치며...

여기까지 서버리스를 시작해보는 간단한 실습을 해봤습니다. 확실히 장점이라고 생각되었던 것은 직접 인프라를 구축하지 않아도 쉽게 서버를 개발할 수 있다는 점입니다. 예전의 이런 서버를 개발하려 했다면 네트워크 구축부터 도메인 구입부터 하여금 여러가지 비용 소모가 들게 됩니다. 하지만 이러한 서비스가 활성화 됨으로써 러닝 커브가 많이 줄었고, 개인 사용자도 쉽게 인프라의 구축 없이도 개인 서비스를 할 수 있다는 점이 매우 눈에 띕니다.


반면에 단점이 있다면  코드 디버깅이 쉽지 않다는 것입니다. 보다시피 코드를 웹에서 바로 작성하거나 아니면 완성된 코드를 올려서 직접 테스트하여야 합니다. 이 포스트에서 다룬 코드는 지극히 간단하기 때문에 테스트가 용이했지만 서비스가 크거나 코드 크기가 큰 경우에는 문제가 있는 부분을 찾기 위해서 디버깅 과정이 필요합니다. 하지만 그런 환경을 제공하지도 않기 때문에 디버깅이 쉽지 않습니다.


그리고 한 가지 더 단점이 있다면 지금 서버리스는 여러 번 마우스를 클릭하고 왔다갔다 해야하는 불편함이 있습니다. 기존의 방법으로 서비스를 개발할 때는 서버 프레임워크에서 모든 것을 설정 파일에 담아놓고 한 번에 배포하는 것이었지만 이와 같이 코드를 올리고 거기에 또 리소스를 따로 더 추가하기에는 여러 가지로 손이 많이 들어갑니다. 이 부분에 대해서는 차기 포스트에서 좀 더 쉽게 Serverless를 배포할 수 있는 방법으로 적어보도록 하겠습니다.


comments powered by Disqus

티스토리 툴바