Cloud Computing
클라우드 컴퓨팅은 여러 거대 기업에서 사용하는 데이터 센터의 유휴자원을 대여해 기존 방식으로 구축한 서버의 물리적인 한계와 리소스를 대신할 수 있는 기술이다.
현대의 클라우드 컴퓨팅은 가상화(Virtualization) 기술의 발달에 따라 물리적인 컴퓨터가 아닌 가상 컴퓨터를 대여하며, 이를 통해 컴퓨팅 능력을 유연하게 조절하고 스냅샷(이미지)를 이용해 다른 컴퓨터로 즉시 이주를 할 수 있다는 장점이 있다.
하지만 단점 역시 존재하는데, 운영 환경 자체가 클라우드 제공자에게 종속되므로 클라우스 서비스에 이슈가 발생하면 내가 배포하고 관리하는 환경에도 영향이 미치게 된다. 또한 백엔드 구성 자체를 특정 회사의 기술로만 구성해야하는 경우가 발생하기도 한다.
서비스의 형태
클라우드 서비스는 클라우드 제공자로부터 얼마만큼의 서비스를 제공받느냐에 따라 그 형태가 나뉘게 된다.
- SaaS (Software as a Service)
당장 사용 가능한 소프트웨어를 제공하는 경우.
- PaaS (Platform as a Service)
데이터베이스, 개발 플랫폼까지 제공하는 경우
- IaaS (Infrastructure as a Service)
가상 컴퓨터까지 제공하는 경우.
AWS (Amazon Web Service)
AWS는 아마존닷컴에서 운영하는 클라우드 서비스이다. 컴퓨팅, 스토리지, 데이터베이스 등 웹 어플리케이션을 서비스하기 위한 다양한 서비스를 제공하고 있다.
EC2 (Elastic Compute Cloud)
AWS에서 제공하는 클라우드 컴퓨팅 서비스로, 쉽게 이야기하자면 아마존에서 가상의 컴퓨터를 한 대 빌리는 것과 같다. Elastic(탄력적인)이라는 단어가 붙어있는데, 이는 사용한 만큼 비용을 지불하고 성능, 용량을 자유롭게 조절할 수 있기 때문이다. 구성하는데 필요한 시간이 짧고, AMI라는 템플릿를 통해 용도에 따라 다양한 운영체제에 대한 선택이 가능한 것이 큰 장점이다.
- Instance
한 대의 컴퓨터를 의미하는 단위이며, AWS에서 컴퓨터를 빌리는 것을 인스턴스를 생성한다고 한다.
- AMI(Amazon Machine Image)
소프트웨어 구성이 기재된 템플릿. CPU나 RAM, OS를 비롯해 Runtime 등 다양한 템플릿이 있어 용도에 따라 원하는대로 선택할 수 있으며, 필요에 따라서는 직접 AMI를 구성할 수도 있다. Instance를 생성할 때 AMI를 토대로 구성이 된다.
Instance 생성 및 연결
- EC2 서비스에 접속해 인스턴스 시작 버튼을 눌러 생성을 시작한다.
- 용도에 맞는 AMI를 선택한다. * Ubuntu 인스턴스 생성 시 18버전 권장.
- CPU, RAM, 용량 등 인스턴스 유형을 선택한다.
- 원격 접속을 위해 필요한 SSH Key를 생성하고 키 페어를 다운받거나 기존 키를 선택한다.
- 생성이 완료되면 SSH 프로토콜을 이용해 로컬 터미널에서 인스턴스와 연결이 가능하다. ⇒ 이 때, 인스턴스 생성 시 발급받은 Key를 이용해 인증 과정을 거친다.
보안 그룹(Security Group)
EC2 인스턴스로 들어오거나(Inbound, 인바운드) 나가는(Outbound, 아웃바운드) 트래픽에 대한 규칙이다. 기본 세팅은 SSH 접속을 위한 인바운드 규칙만 작성되어 있으며, 허용되는 경우를 기준으로 작성할 수 있다.
RDS (Relational Database Service)
AWS에서 제공하는 관계형 데이터베이스(RDB) 서비스로, 데이터베이스 유지 보수와 관련된 일을 자동으로 관리해준다. Instance에 DB 엔진을 설치해서 데이터를 관리할 수도 있지만, RDS를 사용하는 경우 초기 설정과 DB에 저장된 데이터를 관리하는 일 외에는 신경쓸 것이 없어 큰 편의성을 가져다준다. 또한 다양한 데이터베이스 엔진 선택지를 제공해 실무 시 회사에 필요한 데이터베이스 엔진을 취사선택해 이용할 수 있다.
S3 (Simple Storage Service)
AWS에서 제공하는 클라우드 스토리지 서비스. 클라우드 스토리지는 뛰어난 접근성을 가지는데, 이는 S3 역시 마찬가지이며 이 외에도 높은 확장성, 강력한 내구성, 높은 가용성을 보장한다. 웹 개발에서의 가장 큰 이점은 버킷을 이용한 정적 웹 사이트 호스팅이 가능하다는 것이다.
- 버킷(Bucket)
말 그대로 파일들이 담기는 바구니이며, 파일을 저장하는 최상위 디렉토리이기도 하다. S3에서 저장되는 모든 파일은 버킷 안에 저장되며 버킷에는 무한한 양의 파일을 저장할 수 있다.
버킷은 버킷이 속한 리전(데이터센터의 지역 구분)에서 고유한 이름을 가져야 하며, 버킷 정책을 생성해 해당 버킷에 대한 다른 유저의 접근 권한을 수정할 수 있다.
- 객체
버킷에 담기는 파일을 객체라 하는데, 그 이유는 저장소에 데이터를 저장할 때 키-값 페어 형식으로 데이터를 저장하기 때문이다. 객체는 파일과 메타데이터로 이루어져 있으며, 메타데이터에는 객체의 생성일, 크기, 유형과 같은 객체에 대한 정보가 담긴다. 모든 객체는 고유한 URL 주소를 가지며, URL 주소는
http://[버킷의 이름].S3.amazonaws.com/[객체의 키]
형태를 띈다.
- 객체
정적 웹 사이트 호스팅 과정
- 정적 웹 페이지 빌드
작성한 Client 어플리케이션을 빌드해 정적 웹 페이지를 만든다.
- 버킷 생성 및 정적 웹 사이트 호스팅 용으로 구성
S3 서비스에 접속해 버킷 만들기를 클릭하여 버킷을 만든다. 버킷의 이름은 해당 리전에서 고유한 이름이어야 한다. 생성 후에는 해당 버킷의 속성으로 이동해 정적 웹 호스팅 기능을 활성화 하고, 인덱스 문서 및 오류 문서를 지정한다.
- 빌드된 정적 웹 페이지 업로드
객체 탭으로 이동해 업로드를 한다. 이 때, 빌드 폴더 자체를 올리지 않도록 주의한다.
- 퍼블릭 액세스 차단 해제 및 정책 생성
권한 탭으로 이동해 퍼블릭 액세스 차단을 해제하고, 해당 버킷의 정책을 설정한다.
Deploy (배포)
Deploy란 개발한 서비스를 사용자들이 이용 가능하게 하는 일련의 과정이다. 회사, 팀마다 추가적인 과정이 있을 수 있지만, 기본적으로 4단계를 거쳐 개발한 서비스를 배포하게 된다.
- Development
각자의 환경에서 코드를 작성하고 테스트하는 과정. 개발 단계이기 때문에 더미 데이터를 이용해 테스트하게 되고, 변경 사항이 있어도 문제되지 않는다.
- Intergration
각자의 환경에서 작성한 코드를 합치는 과정. 다른 코드를 침범해서 오류를 일으키거나 코드 간에 conflict(충돌)가 있지 않은지 확인하는 단계이다.
- Staging
실제 출시 단계인 Production 단계와 가장 유사한 환경에서 테스트를 진행하는 과정. 실제 데이터를 복사해 문제가 있는지 다양한 환경에서 테스트를 진행한다. 또한 개발 인원 뿐만 아니라 서비스와 관련된 모든 관계자들(기획, 디자인 등)에게 확인 및 검증을 거치는 단계이기도 하다.
- Production
개발된 서비스를 출시하는 단계. 사용자가 접속할 수 있는 Production 환경에서 코드를 구동하고 서비스를 제공한다. 실제 데이터를 가지고 서비스가 운영되기 때문에 이슈가 발생하면 안되는 단계이다.
Deploy 시 주의점
여러 명이 함께 프로젝트를 작업한다면, 배포 시에는 개발 할 때의 환경과 실제 배포 시의 환경(path, key 등)은 다르기 때문에 환경의 차이를 이해하고 환경 설정을 코드와 분리하는 것이 중요하다.
작성한 코드가 다른 환경에서 정상 작동할 수 있게 하려면 설정을 환경 변수(env)에 저장해야 한다. 환경 변수는 코드 변경 없이 배포 때마다 쉽게 변경이 가능하고, 코드 저장소(git 등)에 올라갈 가능성도 낮다. 애플리케이션의 모든 설정이 정상적으로 코드 바깥으로 분리되어 있는지 확인할 수 있는 간단한 방법은 어떠한 인증정보도 유출시키지 않고 코드가 지금 당장 오픈 소스가 될 수 있는지 확인하는 것이다.
- 절대 경로 대신 상대 경로를 사용한다.
- 환경에 따라 포트를 분기 할 수 있도록 환경 변수를 설정해준다.
- Docker와 같은 개발 환경 자체를 통일시키는 솔루션을 사용할 수도 있다.
AWS를 이용한 Deploy 전략
AWS가 제공하는 서비스를 이용해 배포를 하기 위해서는 아래의 전략을 취할 수 있다.
- Client는 정적 파일로 Build하여
S3
의 버킷에 업로드하고, 정적 웹 호스팅(웹 서버) 기능을 이용해 사용자가 접근할 수 있도록 한다.
- Client에서 데이터 접근을 위해 요청을 전달하는 Server는
EC2
를 이용해 서버를 백그라운드 프로세스로 실행한다. 이 때, 다양한 기능 지원 및 안정적인 프로세스 관리를 위해 PM2 프로세스 매니저를 이용 할 수 있다.
RDS
를 이용해 Server와 통신하고 데이터를 저장, 제공하는 DB를 배포한다.
- 배포된 서비스의 쉬운 접근을 위해 Route53 서비스로 도메인을 구매해 연결할 수 있다.
Uploaded by N2T