[Deployment] AWS EC2 + ELB를 활용하여 HTTPS 프로토콜 사용하기

MinWoo Park·2021년 5월 3일
0

Deployment

목록 보기
4/4
post-thumbnail

Deployment

AWS EC2와 ELB를 통해 서버 배포를 하였습니다.
진행 과정을 기록하며 정리하는 글을 작성하겠습니다.


EC2 (Elastic Compute Cloud)

EC2는 가상 서버를 제공합니다.
실제 서버를 구축하는 것보다 간편하고 효율적입니다.
가상 서버이기 때문에 터미널 또는 원격 데스크톱 연결로 접속해야 합니다.
저는 터미널로 접속하는 방법으로 진행했습니다.

1. EC2 인스턴스 생성

EC2에서 생성한 가상 서버를 인스턴스라고 합니다.
서버 각각을 객체로 보는 것입니다.

EC2 서비스 첫 화면에서 인스턴스 시작을 클릭합니다.

EC2 서비스 첫 화면

설정 1단계에서는 Amazon Machine Image(AMI)을 선택해야 합니다.

AMI는 인스턴스를 시작하는 데 필요한 소프트웨어 구성(운영 체제, 애플리케이션 서버, 애플리케이션)이 포함된 템플릿입니다.
한마디로 EC2 인스턴스를 생성하기 위한 기본 파일입니다.

EC2 인스턴스는 여러 가지 사양으로 나누어져 있어 비용 절감과 효율성이 좋습니다.

저는 프리 티어 사용 가능한 Ubuntu Server 18.04 LTS (HVM), SSD Volume Type를 선택했습니다.

설정 1단계: Amazon Machine Image(AMI) 선택

설정 2단계에서는 인스턴스 유형을 선택합니다.
이것도 프리 티어 사용 가능으로 선택했습니다.

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

2단계에서 검토 및 시작을 클릭하면 바로 설정 7단계로 넘어갑니다.
설정된 내용들을 확인하고 시작하기를 클릭합니다.

설정 7단계: 인스턴스 시작 검토

EC2 인스턴스를 시작하려면 키 페어를 선택해야 합니다.
인스턴스를 처음 만드는 것이니 새 키 페어를 생성해야 합니다.
여기서 만든 키 페어를 통해 SSH를 연결할 수 있습니다.
이름을 설정하고 키 페어를 다운로드 합니다.
키 페어까지 모두 다운로드 했다면 인스턴스 시작을 클릭합니다.

키 페어 생성

EC2 인스턴스 생성이 완료되었습니다.
EC2 서비스 첫 화면에서 인스턴스를 탭을 클릭해 보면 확인이 가능합니다.

EC2 서비스 사이드 바에서 인스턴스 클릭


2. Elastic IP 할당받기

EC2 인스턴스를 생성하면 기본적으로 공인 IP가 부여됩니다.
하지만, 이 IP 주소는 EC2 인스턴스가 실행되고 있는 동안에만 유효하며 EC2 인스턴스가 중단되면 IP 주소는 반납되는 유동 IP 입니다.

DNS 서버를 통해 도메인에 IP 주소를 연결할 건데 IP 주소가 바뀌면 곤란해집니다.
그래서 Elastic IP를 할당 받아 절대 바뀌지 않는 IP 주소를 사용해야 합니다.

Elastic IP는 무료이긴 하나 할당받고 EC2 인스턴스에 연결해 사용해야만 요금이 부과되지 않습니다.
IP 주소가 매우 부족하기 때문에 낭비가 되지 않도록 유도하는 정책입니다.

EC2 서비스에서 사이드 바를 내려보면 네트워크 및 보안에 Elastic IP(탄력적 IP)가 있습니다.

탄력적 IP 주소 할당을 클릭 후 기본 설정 그대로 할당을 클릭하면 됩니다.

Elastic IP (탄력적 IP) 서비스 화면


3. Elastic IP 연결하기

할당받은 Elastic IP를 클릭하면 탄력적 IP 주소 연결 버튼이 있습니다.
버튼 클릭 후 원하는 인스턴스를 설정하면 됩니다.

탄력적 IP 주소 연결

연결 후 EC2 인스턴스에 들어가서 인스턴스 요약에서 탄력적 IP 주소를 보면 확인이 가능합니다.


4. 보안 그룹 설정

보안 그룹은 EC2 인스턴스에 적용할 수 있는 방화벽 설정입니다.
EC2 - 네트워크 및 보안 - 보안 그룹을 보시면 다음과 같이 인바운드가 보입니다.

보안 그룹 인바운드 규칙

인바운드(Inbound)는 외부에서 EC2 인스턴스로 들어오는 트래픽입니다.
HTTPS 프로토콜을 사용하려면 여기에 추가해 주어야 합니다.
저는 MySQL도 사용하기에 두 개를 추가하였습니다.

인바운드 규칙 추가

13306포트로 되어있는 사용자 지정 TCP는 MySQL 사용 시 포트 번호를 13306으로 지정하여 사용하기 때문에 그런겁니다.
이 부분은 무시하시고 넘어가도 됩니다.


5. EC2 인스턴스에 접속하기

인스턴스 생성 후 설정까지 완료했으니 이제 인스턴스에 접속해 보겠습니다.
보통 Linux 서버에 접속할 때는 SSH(Secure Shell)을 사용합니다.

이제 인스턴스 생성 시 만든 키 페어 파일을 사용할 겁니다.
Linux와 Mac OS 에서는 pem 파일을 바로 사용할 수 있습니다.
chmod(change mode) 명령어로 권한을 변경만 해 주면 됩니다.
chmod 600 <키 페어 이름.pem> 으로 권한을 설정해 줍니다.

먼저 EC2 인스턴스 화면에서 연결 탭을 클릭하면 접속하는 예시가 나옵니다.
이를 복사하여 접속하여도 되고 매번 하기 번거롭다면 파일을 따로 만들어 둬도 좋습니다.

터미널에서 ssh -i "<키 페이 이름>.pem" ubuntu@<ec2> 를 입력하거나 이를 복사하고 ssh_config 이름으로 파일을 만듭니다.
그리고 이 파일에 붙여 넣기를 합니다.
그럼 일일이 입력하지 않고 해당 파일을 실행하면 ec2 인스턴스에 접속이 가능합니다.

6. EC2 인스턴스에 패키지 설치하기

EC2 인스턴스에 접속을 하면 마치 컴퓨터를 처음 구입했을 때의 상태와 같습니다.
현재 git만 깔려있습니다.

서버를 운영하기 위해 필요한 패키지를 설치해야 합니다.

먼저 sudo apt update를 해 줍니다.

$ sudo apt update

다음으로 npm 또는 yarn을 설치해 줍니다.

$ sudo apt install npm
$ sudo apt install yarn

저는 node.js로 서버를 운영하기에 node를 설치하겠습니다.

$ sudo apt install nodejs

nodejs 프로세스를 관리하기 위한 도구로는 pm2를 설치하겠습니다.

$ sudo npm install -g pm2

노드가 sudo없이 포트 80에 바인딩하도록 허용하기 위해서 다음과 같은 명령어를 입력합니다.

$ sudo setcap 'cap_net_bind_service=+ep' which node


7. 서버 파일 git clone 하기

이제 서버로 실행할 파일을 git에서 clone 받아와야 합니다.
터미널에 git clone <클론할 주소>를 입력합니다.
깃허브 설정이 안되있다면 자신의 계정을 넣어줘야 합니다.

clone 후 npm install과 gitignore파일에 작성된 파일은 클론되지 않으니 따로 만들어 주어야 합니다.
저는 .env 파일을 만들어 주었습니다.

$ vim .env

로컬 .env 파일에서 복사 후 붙여넣기를 합니다.

여기까지 진행하시면 ec2를 통해 서버 배포가 완료됩니다.
하지만 현재 http 프로토콜이므로 ELB를 사용하여 https로 만들어 주겠습니다.


ELB (Elastic Load Balancing)

ELB는 부하 분산과 고가용성(High Availability)을 제공하는 서비스입니다.
한 곳에 집중되는 HTTP, TCP, SSL 트래픽을 여러 EC2 인스턴스로 분산합니다.
그리고 서버가 정상적으로 가동 중인지 확인(Health Check)하여 일부 EC2 인스턴스가 중단되더라도 트래픽을 정상 EC2 인스턴스로만 보냅니다.

1. ELB 생성하기

EC2 서비스에서 로드밸런싱 - 로드밸런서에서 Load Balancer 생성을 클릭합니다.

EC2 - 로드밸런싱 -로드밸런서

Load Balancer 유형 선택에서는 HTTP, HTTPS를 선택합니다.

Load Balancer 유형 선택

1단계로는 Load Balancer 구성을 작성합니다.
이름을 입력하고 리스너를 추가합니다.
리스너는 로드밸런서가 받아들이는 포트를 설정합니다.
https 443 포트를 추가하면 됩니다.

가용 영역은 모두 선택합니다.

나머지는 기본 값으로 두고 다음: 보안 설정 구성으로 넘어갑니다.

1단계: Load Balancer 구성

2단계는 보안 설정 구성입니다.
freenom으로 무료 도메인 후 ACM을 통해 발급 받은 인증서를 사용합니다.

2단계: 보안 설정 구성

3단계는 보안 그룹 구성입니다.
기존 보안 그룹을 사용해도 됩니다.

3단계: 보안 그룹 구성

4단계 라우팅 구성에서는 이름만 작성하고 기본 값 그대로 사용합니다.

4단계: 라우팅 구성

5단계에서는 대상 인스턴스를 등록합니다.
하단에서 인스턴스를 클릭하고 추가 버튼을 클릭하면 됩니다.

5단계: 대상 등록

6단계에서 검토 후 생성을 클릭합니다.


2. 리스너 추가

EC2 - 로드 밸런싱 - 로드밸런서에 방금 생성한 로드밸런서가 보일겁니다.
하단에는 리스너 탭에 있습니다.
현재 HTTP: 80만 존재한다면 HTTPS: 443을 추가해야 합니다.

리스너 추가 버튼을 클릭 후 프로토콜과 포트 번호를 작성합니다.
기본 작업은 리디렉션 대상으로 작성합니다.

리스너 탭

리스너 추가 버튼 클릭 시 화면


3. 서버 도메인과 ELB 연결

ELB를 생성했다면 서버 도메인과 연결을 해야 합니다.
Route 53에서 A레코드를 생성합니다.
별칭을 클릭한 후 Application/Classic Load Balancer에 대한 별칭을 선택합니다.
그리고 ELB을 생성한 리전을 선택하면 됩니다.

Route 53 레코드 생성

이제 EC2에서 배포하는 서버는 HTTPS로 작동합니다.


Reference :
이재홍, 『아마존 웹 서비스를 다루는 기술』 길벗 (2014), p42, p390
노드가 sudo없이 포트 80에 바인딩하도록 허용

profile
물음표를 느낌표로 바꾸는 순간을 사랑하는 개발자입니다.

0개의 댓글