본문 바로가기

FrontEnd+

AWS 배포 가이드북 - EC2 편

 

 

들어가면서

아마존의 클라우드 서비스 AWS(Amazon Web Services)는 시장 점유율 32%에 달하는 클라우드 컴퓨팅 분야 1위 IaaS 서비스이다. (2위: Microsoft Azure 19%, 3위 Google Cloud 7%, 출처)

AWS는 현재 시점으로 컴퓨팅, 스토리지, 네트워킹, 데이터베이스, 배포, 머신러닝 등 다양한 분야에서 무려 200개가 넘는 제품과 서비스를 제공하고 있다.

시장 점유율이 높은 만큼, 채용공고를 보다 보면 기술 스택을 이들 중 하나로 소개하거나, 혹은 아예 이를 사용한 경험을 우대사항으로 기록한 공고를 찾아볼 수 있다. github pages나 netlify, vercel 등의 SaaS 서비스로 편하게 배포할 수도 있지만, 편한 만큼 디테일하게 조작하기에는 한계가 있다. 

원티드 - 모두싸인 / 데브시스터즈 채용공고 중

 

이번 AWS 배포 가이드북 시리즈에서는 두 차례에 걸쳐 컴퓨팅 분야의 EC2, 스토리지의 S3, 그리고 컨텐츠 딜리버리의 CloudFront 를 다루어보려고 한다. (본 편에서는 EC2!)

각 방법에서 배포에 필요한 단계를 다루고, AWS의 문서에서 제공하는 참고가 될만한 내용을 함께 곁들여 작성할 것이다.

AWS Docs 목록 (진짜 많다 AWS 멋져요...)

 

 

💬 EC2 소개

EC2(Elastic Compute Cloud)는 사용자가 원하는 대로 컴퓨팅 용량을 조정할 수 있는 웹 서비스이다. 당장은 큰 용량의 서버가 필요없다면 작은 용량의 서비스를 이용하다가, 이후 확장이 필요하면 용량을 늘릴 수 있다. 증설하거나 감축하는데도 몇 분밖에 걸리지 않는다.

CPU, 메모리, 스토리지, 네트워킹 용량 등을 다양한 조합으로 무려 400개가 넘는 유연한 옵션을 제공한다. 사용자는 비즈니스 성격에 따라 옵션을 선택할 수 있다.

AWS에서 자랑(?)하는 기업별 사용후기

 

EC2에서 얘기하는 인스턴스(Instance)는 가상 컴퓨팅 환경을 의미하고, AMI(Amazon Machine Image)는 인스턴스를 쉽게 만들기 위해 서버에 필요한 운영체제와 여러 소프트웨어들이 적절히 구성된 상태로 제공되는 템플릿을 의미한다.

즉, 인스턴스는 AMI의 사본으로, 클라우드에서 실행되는 가상 서버이다. 다음 그림과 같이, 한 AMI로 여러 인스턴스를 찍어낼 수 있다. 인스턴스는 중단/최대 절전모드로 전환/종료/오류 발생 전까지는 계속 실행된다.

출처: AWS Docs

 

 

📝 EC2 튜토리얼

인스턴스 만들기

먼저, 인스턴스를 만들기 위해 AWS 계정으로 로그인해서 AWS 관리 콘솔에 접속하고, 검색창에 'EC2'를 검색해서 EC2 서비스로 이동해보자.

상단 검색창에 EC2 검색

EC2 메인화면에서 [인스턴스 시작] 버튼을 클릭해서 인스턴스 구성을 시작해보자. 

EC2 메인화면 - 인스턴스 시작 클릭

 

1단계: AMI 선택

앞서 얘기한 것과 같이, AMI는 인스턴스를 쉽게 만들기 위해 OS, 소프트웨어 구성 템플릿을 의미한다. 1단계에서는 어떤 필요에 맞는 운영체제, 어떤 소프트웨어 고르게 된다.

OS는 보통 Linux를 많이 쓰는데, Ubuntu도 Linux 계열이다. Ubuntu Server 18.04 버전을 선택한다. 'Ubuntu Server 18.04 LTS (HVM), SSD Volume Type' 옵션을 [선택]하자.

인스턴스 만들기 - 1. AMI 선택

 

2단계 : 인스턴스 유형 선택

이번 단계에서는 인스턴스를 위한 CPU, 메모리, 스토리지, 네트워킹 용량의 구성을 고른다. 범용, 컴퓨팅 최적화, 메모리 최적화, 컴퓨팅 가속화, 스토리지 최적화 등 사용자의 목적에 따라 고를 수 있는 유형이 그룹핑 되어있다.

예를 들어 일반적인 경우 사용하는 '범용'의 경우만 해도 Mac, T4g, T3 등 13가지 유형이 있고, 이 유형은 CPU 대수, 메모리 용량에 따라 다시 nano, micro, small, medium, large, ... 등으로 나누어진다.

출처: AWS Docs

 

이 중 비용이 기본 수준의 성능을 내면서 비용이 저렴한 범용 인스턴스 유형인 T2를 선택할 것이다. T2.micro는 프리티어로도 사용이 가능하다. 우아한테크코스 계정에서 허용하고 있는 T2.medium 을 선택해보자. (감사합니다...!)

그리고 [다음: 인스턴스 세부 정보 구성]을 선택하자.

인스턴스 만들기 - 2. 인스턴스 유형 선택


3단계: 인스턴스 세부정보 구성

인스턴스의 세부정보 구성에서는 특정 애플리케이션의 요구 사항에 맞춰 다양한 방법으로 인스턴스를 구성할 수 있다. 인스턴스의 소프트웨어 관리, 사용자 계정 관리, 시간 설정, CPU 옵션 최적화, 동적 DNS 설정, 인스턴스 메타데이터 설정 등 다양한 정보를 설정할 수 있는 단계다.

필요한 네트워크(TECHCOURSE), 서브넷(TRAINING), 퍼블릭 IP 자동 할당(활성화) 정도만 설정해준다.

'네트워크' 항목에서는 인스턴스를 어떤 VPC(Virtual Private Cloud)로 시작할지 지정한다. 그리고 '서브넷'을 선택해서 서브넷의 가용 영역을 지정한다. 내가 선택한 TRAINING 은 현재 108개의 IP 주소가 사용 가능하다. 마지막으로 '퍼블릭 IP 자동 할당'을 활성화로 설정한다. 이 설정을 활성화해두면, Amazon의 퍼블릭 IP 주소 pool에서 퍼블릭 IP주소를 요청한다.

[다음: 스토리지 추가]를 선택하자.

인스턴스 만들기 - 3. 인스턴스 세부정보 구성


4단계: 스토리지 추가

기본으로 8GiB로 설정되어있다. 필요할 때 조정할 수 있기 때문에 우선 skip.

[다음: 태그 추가]를 선택하자.

인스턴스 만들기 - 4. 스토리지 추가


5단계: 태그 추가

EC2 리소스에 메타데이터를 추가할 수 있다. 같은 AWS계정에서 다른 사람이 만든 서버와 쉽게 구분하기 설정해두는 것이 좋다. 이후 대시보드에서 검색할 때도 자주 쓰이니 검색하기 편한 태그를 붙여주는 것이 좋다. 

팀에서 정한 네이밍 컨벤션이 있다면 그에 따라 태그를 추가해주자. 우아한테크코스의 네이밍 컨벤션은 { Name: EC2-[github id] } (예시:EC2-woowahanCU-web )이다.

태그 추가를 마치면 [다음: 보안 그룹 구성]을 선택하자.

인스턴스 만들기 - 5. 태그 추가


6단계: 보안 그룹 구성

새 보안 그룹을 생성하거나 기존에 팀에서 사용하고 있는 보안 그룹을 선택한다. 웹 서버 배포를 위해 새 보안 그룹을 생성한다면 HTTP를 위한 80 포트 HTTPS를 위한 443 포트, SSH 접속을 위한 22포트를 열어준다. (0.0.0.0/0, ::/0) 기존 보안 그룹을 선택하면 이미 설정된 하단 규칙을 확인할 수 있다. 

인스턴스 만들기 - 6. 보안 그룹 구성


7단계: 검토

지금까지 설정한 내용을 검토할 수 있다.

인스턴스 만들기 - 7. 검토

[시작하기]를 클릭하면 다음과 같이 키 페어를 선택/생성할 수 있는 창이 뜬다. 키 페어는 인스턴스 로그인 정보를 보호를 위한 것으로, 간단하게 얘기해서, AWS는 퍼블릭 키를 저장하고 사용자는 개인 키를 안전한 장소에 보관하는 방식이다. 이 키로만 인스턴스에 들어올 수 있다.

지금 발급받는 pem 키는 단 한 번만 발급되고 재사용하는 키다. 실수로 어디 업로드하지 않도록 주의해야 한다. 또, 분실하면 서버에 접속할 수 없으니 디렉토리를 따로 만들어서 잘 보관하는 것이 좋다.

인스턴스 만들기 - 키 페어 생성

이렇게 인스턴스를 init 했다. 각 단계를 살펴보느라 조금 걸렸지만, 1분 만에도 뚝딱 주문해낼 수 있을 만큼 간편한 서비스이다.

인스턴스 생성 완료 🎉

주의사항

자신의 생성한 인스턴스가 아니면 건드리지 않는다. 또, 서버를 사용하지 않을 때는 stop한다. 

 

인스턴스 접속하기

방금 생성한 인스턴스의 세부 정보에서 퍼블릭 IP 주소를 복사한다.

생성된 인스턴스 확인

터미널을 켜서 다음과 순서대로 명령어를 실행하자.

cd [pem 키 위치]
chmod 400 [pem 키]
ssh -i [pem 키] ubuntu@[SERVER_PUBLIC_IP]

우선 cd (change directory) 명령어로 pem 키가 있는 디렉토리로 이동한다.

그리고 chmod (change mode) 명령어로 pem 키의 권한을 수정해준다. 이 명령어를 생략하면 다음과 같이 bad permission 에러가 발생한다. chmod 400 은 파일의 '소유자'만이 그것도 'read'만 할 수 있게 파일을 꽁꽁 보호하겠다는 명령어이다. 

bad permission 에러

chmod 400 실행 후 ls -l 명령어로 파일 소유자의 r (read) 권한만 남아있는 것을 확인할 수 있다.

chmod 실행 후

그리고 다시 ssh (secure shell)로 접속 시도하면...! 아까 만들어둔 인스턴스에 성공적으로 들어왔다.

접속을 끊고 싶다면 exit을 입력하고 엔터를 누르자.

종-료

인스턴스 초기 설정

아래와 같이 순서대로 명령어를 실행하고 node 등을 설치한다. EC2는 기본적으로 build-essential curl는 이미 설치되어 있어서 apt-get install 해주지 않아도 된다. (체프 감사해요!)

sudo apt-get update

# nvm(노드 버전 관리자)을 설치
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash

# nvm을 활성화
. ~/.nvm/nvm.sh

# Node.js의 최신 버전을 설치
nvm install node

# 올바르게 설치되고 실행되는지 테스트 (Running Node.js VERSION 라고 뜸.)
node -e "console.log('Running Node.js ' + process.version)"

# pm2 설치
npm install pm2 -g

EC2에 node 설치

Vim 에디터를 사용한다면 더 편하게 사용하기 위해 아래 설정을 추가해두자.

# vim 설정파일로 가서
vi ~/.vimrc

# 아래 복사 붙여넣기
syntax on
set nu
set ruler
set mouse=a
set tabstop=2
set shiftwidth=2
set showmatch

 

아래는 알아두면 쓸모 있을 것 같은 터미널 명령어

# 파일시스템별 가용공간 확인
df -h

# 각 디렉토리별로 디스크 사용량 확인
sudo du -shc /*

# git 명령어 위치 확인
which git

# 프로세스 조회
ps -ef | grep nginx

 

백그라운드 실행

프로세스 매니저 pm2를 이용할 차례이다. pm2는 node를 백그라운드로 실행할 수 있게 해주는 패키지이다. -- 이후에 전달된 모든 옵션은 앱에 인수로 전달된다. ssh 접속을 종료하더라도 app은 계속 실행될 수 있도록 해준다. (참고)

npm install pm2 -g
pm2 start npm --name MY_APP --watch -- start

# 리버스 프록시 설정
sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000

 

아래는 알아두면 쓸모 있을 것 같은 pm2 명령어

# 서비스 중단
pm2 start index.js

# 서비스 중단
pm2 stop index.js
pm2 stop [process_id]

# 서비스 재시작
pm2 restart index.js
pm2 restart [process_id]

# 서비스 삭제
pm2 delete index.js
pm2 delete [process_id]

# 메타데이터 확인
pm2 show index.js

# 앱 목록
pm2 [list|ls|l|status]

# 대시보드 확인
pm2 monit

# 로그 확인
pm2 log

 

+ 용어 정리

deploy

deploy는 프로그램을 서버 등에 설치해서 작동 가능하도록 만드는 일이다. 프론트 코드를 서버에 띄우지 않으면 작동하지 않는다. 

Continuous Deployment

흔히 CI/CD로 더 많이 불리는 CD(Continuous Deployment)는 변경된 코드를 repository에 푸시하면, 고객이 사용할 수 있는 프로덕션 환경까지 자동으로 deploy되는 것을 의미한다. (참고)

출처: redhat - DevOps

IaaS / PaaS / SaaS

IaaS, PaaS, SaaS는 클라우드 컴퓨팅 서비스의 유형을 관리 수준에 따라 구분한 것이다.

IaaS(Infrastructure-as-a-Service)는 3가지 유형 중 가장 flexible 한 방식이다. 사용자가 필요한 구성요소만 구매하여 사용한 만큼 비용을 지불하고, 필요에 따라 확장 또는 축소할 수 있다. 디테일하게 제어할 수 있는 만큼, 사용자에게 이를 잘 관리할 수 있는 능력이 필요하다. AWS, Microsoft Azure, Google Cloud 와 같은 프로바이더가 있다.

PaaS(Platform-as-a-Service)는 사용자에게 하드웨어에 소프트웨어까지 통합한 솔루션을 제공하는 방식으로, 사용자는 더 이상 인프라를 유지보수에 신경 쓰지 않아도 된다. AWS Elastic Beanstalk, Heroku 등의 프로바이더가 있다.

SaaS(Software-as-a-Service)는 완전한 제품을 제공하는 가장 포괄적인 형태의 서비스로, 모든 애플리케이션을 프로바이더가 관리한다. Netlify, Vercel, Dropbox, Google Apps 등의 프로바이더가 있다.

출처: IBM 무료강의 - Cloud Core