[AWS] EC2 HTTPS 및 로드밸런서 적용

2023. 5. 27. 21:01기술 창고/AWS

728x90
SMALL

HTTPS 는 암호화된 HTTP 프로토콜로서 안정화된 데이터 통신을 가능하게 합니다.

따라서 현재 계정을 사용하거나 민감한 정보들을 다루는 모든 웹 들은 전부 HTTPS 프로토콜을 사용하고 있다고 보면 될 것입니다.

기본적인 HTTP 프로토콜에 SSL 이라고 하는 인증서를 발급하여 암호화된 서버를 운영할 수 있도록 해줍니다.

AWS 는 클라우드 서비스를 제공하는 가장 큰 기업이기 때문에 도메인을 발급받고 HTTPS 적용을 한 곳에서 할 수 있어 편리합니다.

 

로드밸런서는 간단히 말하자면 클라이언트의 요청으로 인한 서버의 과부하 혹은 트래픽을 분산시켜줌으로서 속도 면에서나 서버의 가용성, 부하적인 측면에서 도움을 줄 수 있는 기술입니다.

AWS에서 HTTPS 를 적용하게 되면 이 로드밸런서는 거의 필수적으로 동시에 가져가야 합니다.

 

HTTPS / 로드밸런서를 합쳐서 운영되는 과정을 설명해보자면,

 

(1) 클라이언트의 요청(Request)을 보냅니다.

(2) 해당 요청을 로드밸런서가 HTTPS(port 443) 요청인지 일반적인 HTTP(port 80) 요청인지 판단합니다.

(3) 만약 HTTP 요청이면 이 요청을 HTTPS 요청으로 Redirection 합니다. HTTPS 요청이면 Target Group 의 80번 port로 요청을 포워딩합니다.

# Target Group : 로드밸런싱 될 대상들을 말합니다. 예를 들어 같은 서비스를 운영하는 3개의 서버가 있다면 그것들이 Target Group 입니다.

 

 

 

 


SSL 인증서 발급 및 HTTPS 적용

이제 가장 먼저 해야할 HTTPS 적용을 하기 이전에 대략적인 적용 순서를 알아보겠습니다.

(1) ACM(amazon certificate manager) 에서 SSL 인증서 발급 및 호스팅 영역에 레코드 등록 
(2) Target group 생성 
(3) application load balancer 생성 및 security 정책 설정
(4) route53의 domain A 레코드 변경

 

대략적인 순서는 알아보았으니 본격적으로 적용해보도록 하겠습니다.

 

 

 

우선 ACM (AWS Certificate Manager)로 접속하여 인증서 요청을 누릅니다.

 

 

퍼블릭 인증서를 선택합니다.

 

 

인증서를 발급해줄 도메인 이름을 기입해줍니다.

도메인 이름은 EC2 환경을 구성하고 AWS DNS 서비스를 통해 구매한 도메인 명입니다.

가비아와 같은 다른 외부적인 요소들로 생성된 도메인은 해당되지 않습니다.

(참고로 AWS HTTPS 를 사용하기 위해서는 반드시 AWS DNS 서비스를 이용하여 도메인을 적용해야합니다. 가비아 같은 외부적인 서비스를 이용할 경우에는 따로 EC2 서버에 nginx와 certbot 과 같은 인증서를 직접적으로 설치하고 설정해야 합니다.)

 

그 다음 당연히 생성한 도메인으로 검증할 것이기 때문에 DNS 검증을 선택하고 요청합니다.

 

 

요청이 되면 처음에 검증 대기 중인 상태로 나오게 됩니다.

일련의 다른 과정들을 거치고 일정 시간이 지나야 인증서가 완전히 발급되게 됩니다.

 

 

인증서 ID 를 눌러 정확히 현재 요청한 인증서가 어떤 상태인지 확인하고, Route 53에서 레코드 생성을 눌러줍니다.

 

 

AWS DNS 서비스로 구매한 도메인이 있다면 자동적으로 레코드가 만들어져있습니다.

레코드 생성을 눌러줍니다.

(만약, 가비아와 같은 외부 도메인을 사용하게 된다면 위의 필터들을 지워주어야 해당 도메인이 검색됩니다.)

 

 

정상적으로 레코드 생성이 완료되었음을 알리는 문구가 나오고 현재 아직 인증서가 검증 대기 중이라고 나옵니다.

 

 

다시 새로고침을 해보면 상태가 성공됨으로 바뀌면서 인증서 발급이 완료되었습니다.

만약 새로고침을 해도 아직 검증 대기 중이라면 일정 시간 기다렸다가 다시 해보면 될 것입니다.

 

 

이제 EC2 에 접속해서 로드밸런서 항목의 로드밸런서 생성을 눌러줍니다.

 

 

개발한 어플리케이션에 적용할 것이기 때문에 Application Load Balancer 를 선택해줍니다.

 

 

로드밸런서 이름을 기입해주고, Scheme 을 Internet-facing 으로 선택해줍니다.

Internet-facing은 EC2 와 같은 노드를 통하여 로드밸런서를 사용하겠다는 뜻입니다.

EC2 환경을 사용하고 있기 때문에 Internet-facing을 선택합니다.

 

Internal 의 경우에는 직접적인 ip 주소를 통하여 사용하겠다는 뜻이라고 합니다.

 

 

Network Mapping 항목에서 기본적인 VPC를 선택해주고 mappings 에는 2개 이상의 아무 zone을 선택해줍니다.

 

 

보안 그룹을 선택해줍니다.

기본적으로 EC2 환경을 설정했을 때 보안 그룹을 설정했을 것입니다.

해당되는 EC2 의 보안 그룹을 선택해줍니다.

 

이제 리스너와 라우팅을 설정해줍니다.

기본적으로 라우팅할 80포트의 HTTP, 443포트의 HTTPS 이 두가지를 설정해주도록 합니다.

Forward to 부분에 로드밸런싱할 대상 그룹을 지정해줍니다.

만약 대상 그룹이 없다면 밑에 Create target group 을 클릭하여 만들어주도록 합니다.

 

# 추가적으로 위의 사진처럼 저는 처음에 443 포트에 HTTPS 프로토콜을 지정해주어야 했으나 HTTP 프로토콜로 잘못 지정하였습니다.

이후에 다시 HTTPS 설정값으로 변경하는 과정을 보여드리도록 하겠습니다.

 

 

Create Targer Group 을 눌러 대상 그룹을 만들러 들어옵시다.

현재 사용하고 있는 것이 EC2 인스턴스이니 target type 은 Instances 로 지정하고 Target Group 이름을 지정해주고 다음 단계로 넘어갑니다.

다른 설정값은 만질 필요없습니다.

 

 

사용가능한 인스턴스가 목록에 나오고 해당 인스턴스를 체크한 다음 포트 번호 80을 기입하고 Include as pending below를 눌러 pending 해줍니다.

다시 포트 번호 443을 기입하고 다시 pending 해주고 Create Target Group을 눌러 마무리 해줍니다.

 

 

Target Group이 만들어졌습니다!

 

 

다시 로드밸런서 생성 설정 페이지로 돌아와서 Forward To 에 방금 만든 Target Group을 넣어줍니다.

만약 목록에 뜨지 않는다면 오른쪽의 새로고침 버튼을 눌러주면 됩니다.

 

이제 로드밸런서 생성 버튼을 눌러 마무리 해줍니다.

 

 

성공적으로 로드밸런서가 생성이 되었습니다.

 

 

이제 앞서 말씀드렸던 프로토콜이 잘못 설정된 부분을 수정하겠습니다.

로드밸런서를 선택하고 Listener 항목을 선택합니다.

 

HTTP:443 Protocol:Port 를 눌러줍니다.

 

 

들어와서 Edit 버튼을 눌러줍니다.

 

 

HTTP를 HTTPS 로 변경해주고 Target Group 이 정상적으로 되어있는지 확인해줍니다.

다르게 되어있다면 Target Group도 다시 바꿔줍니다.

 

 

HTTPS 로 변경하게 되면 HTTPS 가 적용될 인증서가 적용된 도메인을 넣는 항목이 나오게 되는데 여기에 인증서를 발급받고 사용할 도메인을 설정하여 넣어주고 Save changes 버튼을 눌러 변경해줍니다.

 

 

그리고 혹시나 EC2 보안 그룹의 인바운드 규칙에 443 포트 설정이 되어있지 않다면 해주도록 합니다.

 

 

HTTPS로 변경이 완료되었으면 프로토콜이 변경되었음을 확인할 수 있고, Default SSL cert 항목에 인증서가 발급된 도메인까지 지정되어있음을 볼 수 있습니다.

 

이제 중요한 규칙을 정해주어야 합니다.

HTTPS:443 의 Rules 항목을 눌러줍니다.

 

 

Manage rules를 눌러 규칙을 추가해줄 설정 단계로 넘어갑니다.

 

 

+ 버튼을 눌러 규칙을 추가해주고, IF 규칙에 호스트는 {도메인 명}, THEN 규칙에는 다음으로 전달 {생성된 Target Group} 규칙들을 설정해줍니다.

 

클라이언트의 요청을 받을 도메인은 당연히 EC2 도메인이며, 해당 요청이 로드밸런싱될 대상 그룹은 아까 만들어준 대상 그룹입니다.

 

 

다시 로드밸런서로 돌아와서 이번에는 HTTP:80 의 규칙을 정해주도록 합니다.

rules 를 눌러줍니다.

 

 

동일하게 Manage rules를 눌러 규칙 설정 단계로 넘어갑니다.

 

 

+ 버튼을 눌러 규칙을 추가해주고, IF 규칙에 호스트는 {도메인 명}, THEN 규칙에는 리디렉션 대상 규칙들을 설정해줍니다.

 

앞서 말했던 것처럼 HTTP로 요청이 들어오게 되면 HTTPS 로 리디렉션되어 들어가게 될 것 이기 때문에 해당 규칙을 설정해주는 것입니다.

 

 

이제 마지막으로 적용된 EC2 의 호스팅 영역 설정을 수정해주어야 합니다.

해당 설정을 하는 이유는, 기존 설정된 레코드 A는 도메인 이름에 해당하는 ec2 인스턴스, 즉 서버의 IP를 가지고 있습니다.

서버가 실행 중인 ec2 앞에 로드밸런서가 있고 모든 요청은 이 로드 밸런서를 통해서 서버로 포워딩 되도록 할 것이므로 도메인 이름으로 접속을 하면 ec2 인스턴스가 아닌 로드 밸런서로 요청이 가도록 레코드 A를 변경하는 것입니다.

 

(1) Route 53의 호스팅 영역으로 들어와서 해당되는 도메인을 선택한 뒤, 유형이 A인 항목을 선택하고 레코드 편집을 눌러줍니다.

(2) 여기서 별칭을 On 해주게 되면 트래픽 라우팅 대상을 설정하는 항목이 나오게 됩니다.

(3) 엔드포인트 부분에는 앞서 처음 로드밸런서를 생성할 때 Application Load Balancer 를 선택했으므로, Application/Classic Load Balancer에 대한 별칭을 선택해줍니다.

(3) 리전에는 서울 지역을 선택해줍니다. 리전은 사용하고 있는 AWS 리전에 따라 각자 다 다릅니다.

(4) 마지막으로 라우팅 대상 도메인의 로드밸런서를 설정하면 되는데 처음에 설정하게 되면 dualstack 이라는 키워드가 붙어있습니다. 이것을 반드시 제거해주어야 합니다.

(5) 저장하면 완료입니다.

 

이제 HTTPS 인증서 발급 및 적용 그리고 로드밸런서 적용까지 완료했습니다.

마지막으로 HTTPS 요청이 정상적으로 수행되는지 확인해보고 마무리 하도록 하겠습니다.

 

 

HTTPS 요청이 정상적으로 수행되었습니다!

 

처음에 가비아로 도메인을 발급받고 EC2에 적용 후 nginx 와 certbot으로 인증서를 직접 발급 받는 작업을 했었는데 정상적으로 발급이 되지 않아 날려먹은 시간이 많았는데 감격스럽습니다 ㅠㅠ

728x90
반응형
LIST