home > devops > aws > [aws] elb(load balance)에 https 연결하기 (feat. ec2)

[aws] elb(load balance)에 https 연결하기 (feat. ec2)
devops aws https

intro : elb(load balance)에 https 연결하는 방법에 대해서 알아보자.

이전 글 [aws] route53을 통해 도메인 구매하고 연결하기 (feat. ec2) 와 이어집니다.

해당 글은 하기 과정이 선행이 되어 있어야 합니다.

[aws] ec2를 통해 백엔드 api 서버 배포하기 (1)
[aws] ec2를 통해 백엔드 api 서버 배포하기 (2)
[aws] route53을 통해 도메인 구매하고 연결하기 (feat. ec2)

ELB(Elastic Load Balancer)란?

트래픽을 적절하게 분배해주는 장치로, 전문적인 용어로 로드밸런서 라고도 한다. 서버를 2대 이상 가용할시에는 필수적으로 도입한다. 하지만 이번 ELB를 사용하는 이유는 SSL/TLS를 적용하기 위해 ELB를 사용한다.

SSL/TLS 란?

쉽게 설명하자면 http를 https로 바꿔주는 인증서이다. ssl/tls를 이용하여 http가 아닌 https로 통신할수 있게 만들어 준다.

HTTPS를 적용해야 하는 이유

보안적인 이유

데이터를 서버와 주고받을 때 암호화 시켜서 통신을 한다. 암호화 하지 않으면 누가 중간에 데이터를 가로채서 해킹 할 수도 있다.

사용자 이탈

사이트를 들어갔는데, 보안연결이 사용되지 않았습니다. 라는 문구가 나온다면 믿음직스럽지 못한 사이트라고 생각 할 것이다.

ELB 셋팅하기

Step1. 기본 구성

가장 먼저 aws 콘솔에서의 ec2를 검색해서 들어간 후 로드 밸런서를 클릭하면 아래 이미지의 화면이 보인다. 이때 주황색의 로드밸런서 생성을 클릭하자.

image1

(로드밸런서 생성을 클릭하자)

그럼 다음과 같은 화면이 보이는데, 우리는 https연결을 위한 로드밸런서를 생성 하는것이기에 가장 좌측의 https가 보이는 이미지를 클릭한다.

image2

(가장 좌측의 이미지 https가 있는 이미지를 클릭하자)

이제부터 본격적으로 elb의 설정값들을 작성하게 된다. 로드 밸런서의 이름은 나같은 경우는 api-server-elb로 지정해주었다. 편하게 이름을 작성해도 된다. 체계와 로드밸런서 IP 주소 유형은 기본값으로 설정된걸 변경하지 말자.

image3

(로드 밸런서 이름만 지정하고 나머지는 기본값으로 변경X)

네트워크 매핑은 가용영역에 대한 개념을 알아야 하는데, 하나의 리전에서의 세부 영역을 나누어 관리하는 것을 뜻한다. 다만 우리는 HTTPS를 설정하기 위해 로드 밸런서를 생성하고 있는것이기에 전부 다 선택하여 넘어가면 된다.

image4

(https를 설정하기 위해 로드밸런서를 이용하는것임을 잊지 말자)

여기까지의 단계는 홀딩하고 다음 단계를 넘어가자, 아래의 보안그룹 생성은 새창을 열어서 진행하는 것을 추천한다.

Step2. 보안 그룹

위 단계에서의 네트워크 매핑까지의 작성을 홀딩하고, 보안그룹 생성을 위한 새창을 열고 보안그룹 생성 페이지에 접근하자.

우리는 이전에 ec2에서의 보안그룹을 생성해 본적이 있다. 하지만 로드밸런서 elb에서의 보안그룹은 ec2의 보안그룹과는 다르다. 그렇기에 elb의 보안 그룹을 따로 생성하여야 한다.

image5

(ec2의 보안그룹을 클릭하면 다음과 같은 화면이 나온다)

보안 그룹 생성을 클릭하면 다음 이미지의 화면이 나오게 되고, 이때 보안그룹명을 지정해준다. 식별할수 있도록 나같은 경우는 api-server-security-group으로 작성하였다. (이미지에는 없지만 설명 부분에도 보안그룹명과 같은 값을 입력해 줘야 한다.)

image6

(보안 그룹 명을 지정해 주자, 설명부분에도 같은 값을 입력해 주어야 한다.)

인바운드 규칙으로 http, https의 접근을 허용해준다. (Anywhere-IPv4)

image7

(인바운드 규칙에, http와 https의 요청이 들어오는것에 대한 허용을 지정해준다.)

아웃 바운드 규칙은 건들지 않고, 위 내용을 기반으로 한 보안그룹 생성을 진행한다.

image8

(보안 그룹 생성을 눌러준다.)

위 단계에서 보안그룹을 정상적으로 생성하였다면, 기본 구성 에서의 보안그룹을 우리가 새롭게 생성한 api-server-security-group를 선택할 수 있다.

image9

(보안 그룹에 우리가 만든 보안그룹을 적용한다.)

Step3. 리스너 및 라우팅 / 헬스 체크

elb에 들어온 요청을 어떤 ec2 인스턴스에 요청을 전달할 것인지 설정해야하는데, 그 내용을 바로 리스너 및 라우팅 에서 설정해 주어야 한다. 이때 ec2 어떠한 ec2 인스턴스에 요청을 전달해야할지 대상 그룹을 생성하여야 한다. 아래 이미지에서 대상 그룹 생성 버튼을 클릭하자.

image10

(대상 그룹 생성을 클릭하자.)

대상 그룹 생성 페이지에 들어가서 우리는 인스턴스를 선택하고 이름을 지정해준다. 나같은 경우 api-server-target-group로 설정하였다.

image11

(대상 그룹 이름을 지정하자)

프로토콜 포트 부분에는 로드밸런스에서 받은 요청을 어떤 프로토콜의 포트로 요청을 전달할 것인지 설정하는 부분이다. ec2 인스턴스에 http로 80번 포트로 요청을 전달하자.

image12

(HTTP프로토콜 80번 포트로 전달)

상태검사는 elb 즉 로드밸런서가 여러 ec2에게 트래픽을 전달할 때, 몇초간격으로 ec2 인스턴스의 상태를 확인하고 문제가 없는 ec2 인스턴스에게 트래픽을 전달한다. 만약 요청을 보냈을때 응답이 없다면 elb는 해당 ec2가 문제가 있다고 판단하고 요청을 보내지 않는다. 우리는 지금 elb가 ec2에게 상태를 확인할 수 있는 api의 주소값을 입력하는 것이다. 나는 health라는 api를 ec2에 생성할 것이므로, health라고 이름을 지정하였다. 그 뒤 다음을 누른다.

image13

(상태검사의 개념은 짚고 넘어가자.)

다음 버튼을 누르면 다음의 화면이 나오는데, 실행중인 ec2 인스턴스를 클릭하고 아래의 보류중인 것으로 포함 버튼을 클릭하자.

image14

(실행중인 ec2 인스턴스를 클릭하고, 아래에 보류중인 것으로 포함 버튼을 클릭하자.)

그 뒤에 대상 보기 부분에서 선택한 ec2가 이동 된 것을 확인 후 대상 그룹 생성을 완료하자.

image15

(대상 그룹 생성 완료)

위 방법을 통해 대상 그룹을 생성하였다면, 원래의 리스너 및 라우터를 설정하는 부분에서 위에서 생성한 대상그룹명인 api-server-target-group을 선택해주자.

image16

(대상 그룹 선택 완료)

그 뒤에 나머지 부가적인 설정은 건드리지 않고 로드밸런서 생성 버튼을 클릭하여 완료한다.

image17

(대상 그룹 선택 완료)

로드밸런서 생성 완료를 대시보드에서 확인 후 로드밸런서 이름을 클릭하자.

image18

(로드밸런서 생성 완료)

로드밸런서가 우리의 ec2 인스턴스에 요청을 전달하는지 확인하기 위해 다음과 같이 dns 이름을 복사해서 url로 이동해보자.

image19

(DNS 이름 복사해서 URL 주소창에 입력하자)

다음과 같이 접속된다면 로드 밸런서를 정상적으로 생성하였음을 알 수 있다.

image20

(DNS 이름 복사해서 URL 주소창에 입력하자)

Step4. ELB에 도메인 연결하기

이전에는 도메인을 ec2에 연결했었는데, 위 과정을 통해 로드밸런스에 요청을 보내면 로드밸런서가 자동으로 ec2 에게 요청을 전달하는것을 볼 수 있다. 그렇기에 ec2에 도메인을 연결하는것이 아닌, 로드밸런서에게 도메인을 연결을 하는 과정을 진행한다. 가장 먼저 도메인 연결을 하기 위헤 route53의 호스팅 영역으로 이동한다.

image21

(이전글들에서는 todayvisible로 도메인을 연결했으나, 이번에는 visiblego로 연결한다.)

이전 route53 도메인 관련 작업을 진행할때처럼 동일하게 호스팅 영역의 이름을 클릭하고 레코드 생성을 한다. 레코드 생성페이지에 입력할 값이 많은데 레코드 이름같은 경우 난 www를 붙여서 접근하고싶어서 붙여주었다. 레코드 유형은 그대로 A 타입으로 변경하지않고, 별칭을 반드시 선택해준다. 이전 ec2에 연결할때는 그저 ip주소값만 입력하면 끝이었는데 이번에는 로드밸런서에 연결하는것이라 트래픽 라우팅 영역에 Load Balancer을 선택하고, 리전값은 아시아 태평양 서울 그 아래 로드 밸런서 선택은 우리가 만든 로드밸런서를 선택해준다. (기존에 만든 로드밸런서가 없다면 자동으로 하나만 선택된다.) 이후 레코드 생성 버튼을 클릭하여 마무리 한다.

image22

(레코드 생성버튼까지 눌러주자)

정상적으로 레코드가 생성되었다면 다음과같이 도메인으로 접근시에 이러한 화면을 마주할 수 있다.

image23

(도메인으로 요청시 로드밸런서로 요청전달 후 ec2 요청 전달 성공!)

Step5. HTTPS 적용을 위해 인증서 발급받기

HTTPS의 적용을 위한 기초 단계는 모두 끝이났다. 본격적으로 HTTPS의 적용을 진행해보자. 가장먼저 Certificate Manager을 검색한다 그럼 아래 이미지의 화면이 나오는데, 여기서 인증서 요청 버튼을 클릭하자.

image24

(인증서 요청 버튼 클릭)

퍼블릭 인증서 유형을 선택하고 다음 버튼을 클릭하자.

image25

(퍼블릭 인증서 유형 선택)

도메인 이름만 내가 HTTP로 적용하고자하는 도메인 이름을 작성하고 나머지는 변경하지 않고 요청 버튼을 클릭한다.

image26

(인증서 요청이 완료된 모습이다.)

인증서 요청은 완료되었지만 아직 발급이 완료가 된 것은 아니다. 이 도메인의 주인이 내가 맞다는것을 증명하는 과정을 거쳐야 비로소 인증이 완료가 된다. CNAME 이라는 값을 우리의 호스팅영역의 레코드에 추가를 해줘야한다. 물론 이 CNAME의 이름과 값은 아래 이미지처럼 제공해준다. 편리하게 추가할수 있도록 aws에서는 Route53에서 레코드 추가 버튼을 제공해준다. 버튼을 클릭해보자.

image27

(Route53에서 레코드 생성 버튼 클릭.)

image28

(Route53에서 레코드 생성 버튼 클릭.)

image29

(레코드 생성버튼을 클릭하자.)

정상적으로 CNAMe을 레코드에 추가를 완료하면 다음과 같이 상태가 성공으로 변경된다.

image30

(성공으로 상태가 변경되었다.)

Step6. ELB에 HTTPS 설정하기

드디어 이글의 최종적인 목표인 HTTPS를 적용하는 단계에 도달했다. 우리가 HTTPS를 적용해야 하는 부분은 로드밸런서이다. 도메인도 로드밸런서에 적용했고, HTTPS도 로드밸런서에 적용한다. 모든 요청은 로드밸런서를 통해 트래픽을 ec2에 분배해준다. 자 이제 ec2 대시보드 안에 로드밸런서로 이동하여 리스너를 추가하자.

image31

(일단 로드밸런서로 이동)

그 후 리스너 추가 버튼을 클릭하고 다음과 같은 화면에서 프로토콜에 HTTPS를 선택, 라우팅 액션을 대상 그룹으로 전달, 대상그룹은 르드밸런서를 생성하면서 만들어 두었던 ec2 그룹을 선택한다.

image32

(HTTPS 프로토콜은 반드시 선택한다.)

이후 보안 리스너 설정에서는 이전에 발급받은 도메인 인증서(ACM)를 선택해주는 것만 하면 끝이다. 마지막으로 추가버튼을 눌러주자.

image33

(ACM의 약자는 AWS Certificate Manager 이다.)

리스너 추가를 완료한다면 드디어 HTTPS를 통한 접근이 가능하다.

image34

(여기까지의 과정이 정말 길고 길었다.)

Step7. 리디렉션을 통해 HTTP요청을 HTTPS로 변경하기

근데 좀 아쉬운 부분이 있다. 아직까지 로드밸런서에 HTTP프로토콜의 80포트의 리스너 규칙이 존재하기에 HTTP를 통한 접근이 아직 가능하다. 우리는 이 부분을 리디렉션을 통해 HTTP의 요청을 HTTPS의 요청으로 변경해 줄 것이다. 다음의 과정을 따라가보자.

가장먼저 기존에 등록하였었던 리스너 규칙인 HTTP의 규칙을 삭제한다.

image35

(기존의 HTTP의 리스너 규칙을 삭제한다.)

그 뒤에 다시 리스너 추가 버튼을 클릭하고 다음과 같이 라우팅 액션을 URL로 리디렉션을 선택하고 프로토콜과 포트를 HTTPS, 443을 선택 후 다른 부분은 변경하지 않고 추가버튼을 클릭한다. 그럼 HTTP로 접근하여도 자동으로 HTTPS로 리디렉션이 처리가 된다.

image36

(HTTPS로 리디렉션을 하자.)

image34

(HTTP로 접근하여도 동일하게 HTTPS로 리디렉션이 되어 접근된다.)

ELB 종료하기

HTTPS를 적용하기위해 생성한 ELB(로드밸런서)는 비용이 나가는 기능이다. 사용을 완료하였다면 안전하게 종료해보자. 다음과 같이 ec2의 로드밸런서를 클릭하고 현재 작동중인 로드밸런서를 선택하여 삭제를 진행한다.

image35

(로드밸런서 삭제버튼 클릭)

다음으로

이렇게 하여 ELB 셋팅하기가 모두 마무리 되었다. 이번 글은 사실 EC2 배포, 탄력적 IP설정, Route53 도메인 연결, ELB 생성 및 EC2 대상 그룹설정, ACM을 통한 도메인 인증, ELB의 리디렉션 등등 많은 작업을 하나로 압축하여 진행하다보니 글이 길어졌다. 덕분에 진행하면서 많은 우여곡절이 있었고 도메인을 구매하고 호스팅영역을 절대 삭제해서는 안된다는 점도 알았다. 덕분에 todayvisible 주소를 이제 못쓸거같다.

다음으로는 데이터베이스 연결하기 (RDS)를 진행할 예정이다.

다음글 : [aws] rds(database) 생성하고 접속하기 (feat. mysql)