[찍먹 Cloud Computing] 0. Orientation
Cloud Computing을 찍먹해 보자. 2021-06-25

Cloud Computing?

안녕하세요? Justkode 입니다. Cloud Computing, 말은 많이 들어봤는데 우리한테 왜 필요 할까요? 예시를 들어 보겠습니다.

재혁이네 헬스장이라고 치죠.

여기 재혁이가 운영하는 헬스장이 있습니다. 재혁이가 헬스장을 운영하다보니, 연초에 사람들이 많이 몰리게 돼서, 헬스 기구들이 모자라 버리는 사태가 발생해 버렸습니다. 그래서 재혁이는 생각했어요. "아... 이거 헬스 기구를 더 사야하나...?" 그래서, 재혁이는 가지고 있는 돈을 탈탈 털어서 새로운 헬스 기구들을 사 들이기로 결정했습니다!

"그래, 이 사람들은 나중에도 올테니까..."

하지만, 에구머니나, 연초에 헬스장을 등록한 사람들은 다 작심삼일로 헬스장을 다니다가 절반 이상이 그만두게 되었어요. 결국 재혁이가 산 헬스 기구들은 애물단지가 되어버렸답니다. 재혁이는 어떻게 했었어야 했을까요?

우리는 예상할 수 있었습니다. '연초에 오는 사람들은 어차피 잠깐 헬스장에 있다가 말 사람들이 절반이다.' 라는 사실을 말이죠. 그렇기 때문에 재혁이는 연초를 위해서 헬스 기구들을 대여하는 것이 맞았습니다. 굳이 나중에 쓰지도 않을 테니, 애초에 빌렸으면 관리도 할 필요가 없었죠.

서버도 대여가 가능하다?

서버도 마찬가지입니다. 특정 시간에 2배의 트래픽이 발생 한다고, 우리가 2배로 서버 양을 늘려서 운영 할 필요가 있을까요? 아닙니다. 우리는 특정 시간에 트래픽이 늘어 날 것을 예측하여, 그때만 잠깐! 컴퓨팅 자원을 빌리는 것이 제일 효율적입니다. 이는 재정적으로 우리에게 부담만 될 뿐입니다. 실제 사업 모델에서는 컴퓨팅 자원 등의 비용을 효율적으로 관리 하여야 합니다. 그렇기 때문에, 우리 개발자 입장에서는 클라우드 컴퓨팅에 관련하여 무지 하면 안되는 것이지요.

개인적으로 생각 하기에는, 클라우드 컴퓨팅에서 가장 중요한 자세는 탐욕(?)의 자세입니다. 어떻게 해야 사용자가 피해를 보지 않으면서 어떻게 최대한 요금을 아낄 수 있는지에 대해 생각하여야 한다는 것이지요. 언제 서버를 빌리고, 언제 서버를 사는 것이 중요한지, 어떻게 로드 밸런싱을 하여 사용자가 불편을 느끼지 않게 하여 사용자의 서비스 이탈률을 줄일 수 있는지, 비즈니스 마인드로 생각하여야 한다는 것이지요.

클라우드 컴퓨팅(영어: cloud computing)은 사용자의 직접적인 활발한 관리 없이 특히, 데이터 스토리지(클라우드 스토리지)와 컴퓨팅 파워와 같은 컴퓨터 시스템 리소스를 필요 시 바로 제공(on-demand availability)하는 것을 말한다. 일반적으로는 인터넷 기반 컴퓨팅의 일종으로 정보를 자신의 컴퓨터가 아닌 클라우드에 연결된 다른 컴퓨터로 처리하는 기술을 의미한다.

출처: 위키백과

Service Model

클라우드 컴퓨팅의 서비스 모델은 다음과 같습니다.

출처: Redhat 사이트

  • IaaS (Infrastructure As A Service): Infracstructure 레벨의 클라우드 서비스를 제공하는 것입니다. 가상화, 서버, 스토리지, 네트워킹을 클라우드 서비스 회사에서 담당하고, 사용자가 O/S, 미들웨어, 런타임, 데이터, 어플리케이션을 제공하면, 이에 맞게 사용자가 서비스를 이용 할 수 있습니다. 즉, Virtual Machine을 서버 형태로 제공해 주는 것이라고 생각하시면 편합니다. 사용자 입장에선 손이 많이 갈 수 있지만, 확장성 측면에서 제일 자유로운 모델 입니다. 예시로는 Linux, Window, iOS 등의 Container를 제공하는 AWS EC2가 있습니다.
  • PaaS (Platform As A Service): Platform 레벨의 클라우드 서비스를 제공하는 것입니다. IaaS 서비스에 서 제공하는 것 + O/S, 미들웨어, 런타임을 클라우드 서비스 회사에서 담당하고, 사용자가 데이터와 어플리케이션을 제공하면, 이에 맞게 사용자가 서비스를 이용 할 수 있습니다. 사용자가 간단한 코드 정도만 제공한다면, 매우 빠르게 사용자가 원하는 서비스를 사용할 수 있는 것이 장점이지만, 특정 플랫폼에 종속 되어, 다른 플랫폼으로 이용하는 것이 어렵다는게 단점으로 작용 합니다. 예시로는 Heroku, Google App Engine 등이 있습니다.
  • SaaS (Software As A Service): Software 레벨의 클라우드 서비스를 제공하는 것입니다. 이는 모든 것을 클라우드 서비스 회사에서 SW 형태로 제공한다는 것이 장점입니다. 그저 사용자는 웹 또는 어플리케이션으로 접속하여 사용하기만 하면 됩니다. 하지만, 커스터마이징이 아예 불가능 하다는 점이 단점으로 작용합니다. 예시로는 iCloud, Google Drive등이 있습니다.

우리는 클라우드 서비스를 사용하려고 할 때, 우리가 어떤게 필요한지 정확하게 파악하고, 어떤 클라우드 컴퓨팅의 서비스 모델을 사용할 지 정해야 합니다. 예를 들어, SaaS에서 이미 제공을 하고 있는 기능이며, 굳이 깊은 기능이 필요 하지 않은데 IaaS를 무작정 사용 하면 안 됩니다. 우리가 직접 개발을 하면 되지만, 우리가 개발을 하는 것도 비용입니다. 역으로, 많은 커스터마이징을 필요로 하는데 SaaS를 이용하는 건 안됩니다. 서비스를 만드는데 제약이 생길 수 있기 때문입니다. 이런 식으로, 우리가 어떤 기능을 제공 할 건지에 따라 서비스 모델을 신중히 선택 하여야 합니다.

Container?

SW 산업에서 이야기 하는 Container는 무엇일까요? 일단 저희에게 와닿는 이야기 부터 한 번 해볼까요? "왜 우리집 컴퓨터에선 돌아가는데, 서버에 올리니까 자꾸 터지지?" 여러분도 경험 하신 적이 있을 것입니다. 로컬 개발 환경에서 돌아가던 것들이, 실서버 환경에서는 돌아가지 않는 것이지요. 왜 그러는 걸까요?

그 이유는, 우리 집 컴퓨터와, 실서버의 개발 환경이 다르기 때문입니다. 아무리 동일한 환경을 구성 한다고 해도, OS가 다르고, 깔린 프로그램이 다르고, 환경 변수의 충돌, 네트워크, 설치 방법 등, 여러 면에서 다르기 때문에, 100% 동일한 환경에서는 이론상 실행하게 만들 수는 있지만, 그렇게 하기에는 쉽지 않죠.

그렇기에 컨테이너 방식으로 프로세스를 격리하여 실행하는 방식이 대두 되기 시작 했습니다. 커널을 공유함으로써 가상화에 많은 자원을 사용하지 않으며, 비슷한 종속성을 가진 컨테이너 끼리는 이미지 자원을 공유하여 최적화 합니다. 또한, 동일한 환경에서 프로세스가 실행 될 수 있도록 하면서 충돌이 일어나지 않도록 프로세스를 구성합니다.

출처: Docker 홈페이지

하지만, 여기서 의문이 하나 들 수도 있습니다. "따지고 보면, 그래도 컨테이너 방식으로 실행 하는 것이, 아예 쌩 서버에서 실행 하는 것보다 느리지 않나?"

이에 대한 답은, "일단, 맞다." 입니다. 일단은 말입니다. 하지만, 컨테이너 방식을 차용 함으로써 많은 이점을 누릴 수 있습니다. 첫 번째로 로드 밸런싱에 용이하다는 점이 장점입니다. 서비스를 운영하는 데에 있어, 특정 기능에 사람들이 몰리면 어떻게 하면 될까요? 그냥 해당 기능을 담당하는 마이크로서비스의 컨테이너의 수를 늘리면 됩니다! 컨테이너는 켜고 끄는 것이 빠르고 간편하기 때문에, 이에 대한 이점을 가지고 있습니다. 또한, 특정 컨테이너에 트래픽이 몰리면, 네트워크 트래픽을 로드 밸런싱 하여, 동일 기능을 하는 컨테이너에 옮길 수도 있습니다.

두 번째는 Self Healing 입니다. 특정 컨테이너에 에러가 발생했을 때는 어떻게 해야 할까요? 서버를 껐다 키는 것도 방법이겠지만, 이제는 그저 컨테이너를 교체 하면 됩니다. 특정 요청에 응답하지 않으면, 노드가 건강하지 않다고 판단하는 방식으로 진행합니다. 이러한 일련의 과정을 클라이언트에 보여 주지 않는 기능도 제공합니다.

세 번째는 Health Check를 통한 비정상적인 실행 방지 입니다. 서버 컨테이너와 DB 컨테이너 같이 종속성을 가지고 있는 경우에는, DB 컨테이너가 켜져야, 서버 컨테이너가 작동 하는 것처럼, 서비스 운영에 있어서도 안정감을 가져 올 수 있습니다.

그 이외에도 마이크로서비스 운영, 이식성, 일관성 등 여러가지 장점이 존재합니다.

Contents

1. Orientation
Cloud Computing이 왜 우리에게 필요한지를 알아보는 시간, Docker 설치 및 AWS Educate 회원가입을 실습으로 진행한다.

2. AWS IAM & EC2
보안을 위한 IAM 설정과 EC2 Instance의 생성, 설정 및 실행을 해보는 시간.이와 함께 다양한 EC2 Instance 유형에 대해 이해해 본다.

3. AWS S3
Python, Node.js의 S3 API를 사용하여, 백앤드 서버에서 받은 이미지를 S3에 저장하는 일을 수행해 본다.

4. AWS RDS, DynamoDB
AWS의 관계형 데이터베이스인 RDS와 NoSQL 데이터베이스인 DynamoDB를 사용해 보며, 이를 서버와 연동하는 실습을 진행한다.

5. AWS Lambda & API Gateway
AWS Lambda를 통해 Serverless API를 구현해 보고, API Gateway를 통해 이를 모니터링 하고, 관리 하는 방법에 대해 배워 봅니다.

6. Docker Image, Container, Dockerfile
Docker를 써야하는 이유와, Docker Image, Container에 대해 이해하며, Docker CLI를 사용 해 보는 시간을 가져 봅니다. 또한 Dockerfile 작성법을 알아보고 해당 Dockerfile을 이용해 간편하게 Docker Image를 Build해 보는 시간을 가져 봅니다.

7. Kubernetes Tutorial 1
Kubernetes를 이용하여, 클러스터를 생성해 보고, 로드 밸런싱과 모니터링을 해 본다.

8. Kubernetes Tutorial 2
1과 이어진다.

마치며

컨테이너클라우드 컴퓨팅은 밀접한 연관을 가지고 있습니다. 컨테이너를 통한 어플리케이션의 분리가 완전해야, 클라우드 컴퓨팅의 효율을 최대화 할 수 있기 때문이죠. 우리는 이 둘에 대한 이해를 바탕으로 효율적이고, 안정성 있는 서비스를 만드는 것을 목표로 해야 합니다. 다음 시간에는 AWS EC2 & IAM의 사용법에 대해서 알아보도록 하겠습니다. 감사합니다.