본문 바로가기
AWS

[AWS] Route53, ELB로 EC2의 웹 서비스 하기

by 삼콩 2022. 1. 19.

EC2 인스턴스에 개발된 내용을 올리고 이를 외부에 서비스하고자 한다.

 

순서는 다음과 같이 진행한다.

  1. target group 생성
  2. ALB 생성
  3. Route53 도메인 호스팅 영역 설정
  4. ACM 인증서 발급
  5. HTTPS 리스너 등록

 

가장 간단한 방법으로는 이러한 인스턴스를 public subnet에 생성하고 EIP를 할당하는 방법이 있다. 하지만 이 방법은 다음과 같은 상황에서 어려움이 있다.

  • 운영 서버가 직접적으로 외부에 노출되는 보안 취약점 존재
  • HTTPS 통신시 사설 인증서를 인스턴스에 설치해야하는 번거로움 존재
  • 비용, 구성 등의 이슈로 한 인스턴스에 두가지 이상의 웹 서비스를 제공해야 할 경우, 외부에서는 포트를 구분하여 접근해야 함

이러한 상황을 해결할 수 있는 방법의 하나로 아래의 아키텍처를 들 수 있다. (실제로는 안정성을 위해 인스턴스 이중화를 하기도 한다. 이 아키텍처가 정답은 아니다) 그림을 보면 public subnet에 ALB를 생성하고 private subnet에 인스턴스를 두어 사용자 -> ALB -> 인스턴스의 흐름으로 요청하도록 한다.

  • 운영 서버가 직접적으로 외부에 노출되는 보안 취약점 존재 => 운영 서버가 private에 존재
  • HTTPS 통신시 사설 인증서를 인스턴스에 설치해야하는 번거로움 존재 => ALB에서 HTTPS 인증 수행
  • 비용, 구성 등의 이슈로 한 인스턴스에 두가지 이상의 웹 서비스를 제공해야 할 경우, 외부에서는 포트를 구분하여 접근해야 함 => ALB 규칙과 타겟그룹을 사용하여 외부에서 포트 구분 없이 접근 가능

사용자는 ALB에서 생성된 DNS Name을 통해 각 서비스에 접근하게되는데 그 값이 매우 길기때문에 도메인을 가지고있다면 레코드를 생성하여 보다 접근하기 쉽게 하는것이 좋다. 이번 포스팅에서는 Route53을 활용하여 기존 도메인에대한 호스팅을 AWS에서 수행할 수 있도록 하며, ALB, ACM, EC2를 활용하여 간단한 웹 서비스를 구성한다. (본 포스팅은 인스턴스에 이미 간단한 웹 서비스가 있다는 가정 하에 진행된다.)

 

1. Target group 생성

AWS의 로드밸런서는 리스너와 규칙에 맞게 트래픽을 전달하는데, 이 트래픽이 전달되는 대상을 타겟 그룹이라고 한다. 이 대상은 인스턴스, IP 주소, lambda, Application Load Balancer가 될 수 있으며 처음 설정 후에는 수정할 수 없다. 

  • 대상 유형 선택: 인스턴스
  • 대상 그룹 이름: 이름 입력 (수정 불가능)
  • 프로토콜/포트: EC2 인스턴스의 서비스가 사용하는 프로토콜과 포트 (예. 8080포트를 사용하고있으면 http:8080), 인스턴스의 보안그룹은 이 포트에 대하여 인바운드를 허용하고 있어야 함

  • 상태검사: 로드밸런서가 타겟그룹과 연결된 후 해당 요청으로 서비스가 제공되는지 상태를 검사하는 용도

 

  • 타겟 그룹에 등록할 인스턴스 선택

 

2. Application Load Balancer 생성

ALB는 ELB 중 하나로 HTTP 및 HTTPS 트래픽을 사용하는 애플리케이션을 위한 L7 로드밸런서이다. AWS에서는 L4 로드밸런서로 NLB를 지원하며 ALB와 NLB의 차이는 아래 표와 같다.

구분 ALB NLB
Listner port HTTP, HTTPS TCP, UDP, TCP_UDP, TLS
Network mapping (LB의 IP) AWS 할당 AWS 할당, EIP 할당
보안그룹 O X
SSL/TLS 인증서 O (HTTPS 443) O (TLS 443)
작업 규칙에 따른 forward, redirect, 고정응답 반환 지원 타겟 그룹에대한 forward 만 가능

본 포스팅은 HTTPS를 위한 인증서를 사용하며, 리스너별 규칙을 사용하여 forward, redirect 등을 사용할 것이므로 ALB를 선택하여 구성한다. 

 

  • 로드밸런서 이름과 체계 선택 (로드밸런서 이름은 수정 불가능 함)
  • 체계: 외부 사용자가 ALB를 통해 접근하므로 인터넷 경계 선택 (내부 통신일 경우 내부 선택)

ALB가 생성될 VPC와 subnet을 선택한다. 앞서, "인터넷 경계"를 체계로 선택하였으므로 ALB를 public subnet에 생성하여야한다. 이 때 ALB는 최소 2개 이상의 서로 다른 가용영역에 위치한 서브넷을 선택해야하며 (ALB는 생성시 각 서브넷에 eni를 생성한다), 해당 서브넷에는 8개 이상의 사용 가능한 IP가 존재해야한다. 

ALB의 "인터넷 경계" 체계는 매핑에서 IPv4 설정을 AWS에서 할당으로만 제한하고있다 (내부는 서브넷의 IPv4 범위에서 사용자가 프라이빗 IP를 지정할 수 있음). 만약 로드밸런서를 EIP로 사용하고자 한다면 NLB를 사용해야한다.

다른 가용영역 (az-a, az-c)의 public subnet 선택

ALB에 적용될 보안 그룹을 선택한다. 

이 보안그룹의 인바운드 규칙은 80 또는 443(HTTPS 사용시)에 대한 모든 IP를 허용하도록 한다. (만약 이를 사용하는 특정 대역대가 존재한다면 소스를 해당 대역대로 변경)

마지막으로 80 포트에 대한 리스너를 등록한다. ALB 생성 시에는 forward에 대한 작업만 가능하다.

 

여기까지 작업하여 ALB를 생성하면 ALB에대한 DNS Name을 받게된다. 이 DNS이름을 브라우저에 입력하면 간단하게 생성하였던 웹 페이지 확인이 가능하다.

 

3. 도메인과 ALB HTTPS 리스너 설정

2에서 생성된 리스너는 사용자의 HTTP 요청에 대한 리스너이다. HTTPS 리스너 생성을 위해서는 다음 두 가지가 필요하며, 본 포스팅에서는 외부에서 구매한 도메인의 호스팅영역을 Route53에 생성하고, ACM에서 사설 인증서를 발급받는다. 

  • 도메인 (Route53 혹은 다른 도메인 제공 업체)
    - 인증서 유효성 확인
    - 도메인과 ALB의 A 레코드 생성
  • 인증서 (ACM: AWS Certificate Manager, 그 외 인증서 발급기관)

 

3.1 Route53 호스팅영역 생성

이 부분은 도메인을 소유하고 있을 경우 테스트 가능하다 (도메인은 AWS, 가비아와 같은 도메인 제공업체에서 구입할 수 있음). Route53은 도메인 호스팅 영역을 제공하는데 호스팅 영역이란 특정 도메인(예: example.com)과 그 하위 도메인(alice.example.com, bob.example.com)의 트래픽을 라우팅하는 방식에 대한 정보를 관리하는 컨테이너이다.

본 포스팅에서는 외부에서 도메인을 이미 구입하였을 경우 Route53 호스팅 영역을 생성하여 AWS에서 관리하는 방법으로 진행한다. AWS에서 도메인을 구입했다면 이미 존재하므로 이 부분은 넘어가도 된다.

  • Route53 > 호스팅 영역 구성
    - 도메인 이름: 소유하고있는 도메인 이름
    - 유형: 퍼블릭 호스팅 영역

호스팅 영역을 생성하고나면 NS 유형의 레코드를 확인할 수 있다. 이 네가지 Name server 값을 도메인을 구매한 곳의 네임서버 설정에 반영한다.

Route53 호스팅 영역 네임서버 정보
도메인 제공 업체의 네임서버 정보에 반영 (ex. 가비아)

 

3.2 Route53과 ALB 연결

Route53 호스팅 영역에서 A레코드를 생성하여 특정 도메인 요청시(ex. http://service.sbpark.xyz) ALB에 해당 요청을 전달하도록 한다.

  • 레코드 이름: 도메인의 하위 도메인 설정
  • 트래픽 라우팅 대상: ALB 선택 (ALB의 DNS Name)

 

이와같이 설정하면 브라우저에 도메인 주소(ex. http://service.sbpark.xyz)를 입력하였을 때 타겟그룹의 서비스가 잘 반환된다.

4. ACM 인증서 발급 및 검증

본 포스팅에서는 ACM 인증서를 발급받아 사용한다. AWS에서는 인증서에대해 무료 발급이 가능하다. 다만, AWS 내에서만 사용 가능함을 알아둬야한다 (생성된 ACM 인증서 다운로드 불가). 인증서를 저장하고 on-premise 서버 혹은 인스턴스 등에 설치하고자 할 경우, 다른 인증서 발급 기관에서 생성하여야 한다.  

  • 도메인 이름: SSL/TLS 인증서로 보호하려는 사이트의 정규 도메인 이름을 입력
  • 검증 방법: DNS 검증, 이메일 검증을 지원 (도메인에 대한 DNS 구성을 수정할 수 있다면 DNS 검증 사용. 본 포스팅에서도 route53 호스팅 영역이 존재하므로 DNS 검증 선택)

 

ACM을 생성하면 아래와 같이 검증 대기 중 상태를 확인할 수 있다. 

  • Route53에서 레코드 생성: route53 호스팅 영역을 사용 중일 경우 선택
  • CSV로 내보내기: 외부에서 직접 도메인에 대한 DNS 설정 수정할 경우 선택

Route53에서 레코드 생성을 선택한 경우 다음과 같은 화면을 볼 수 있으며 "레코드 생성"을 클릭한다.

잠시 기다리면 아래와같이 성공 상태를 확인할 수 있으며 Route53에서도 인증서 인증에 대한 CNAME 이름과 CNAME 값이 입력되어 있음을 확인할 수 있다.

ACM 인증서의 성공 상태 확인
Route53 호스팅 영역에 인증서의 CNAME 이름, 값이 등록되었음

 

5. ALB에 HTTPS 443 리스너 등록

ALB에서 HTTPS 443에 대한 리스너를 추가한다. 기본 작업은 고정 응답 반환으로 설정하고, 세부적인 규칙은 생성 후 추가하도록한다.

이와같이 고정 응답 반환을 설정하여 규칙에 맞지 않는 잘못된 접근에 대한 기본 페이지를 제공할 수 있다.

  • 보안정책: 요구되는 TLS 프로토콜에 맞게 보안 정책을 변경한다.
  • 기본 SSL 인증서: 발급받은 ACM 인증서 선택 (리스너 생성 후 SSL 인증서는 추가로 등록 가능하다)

여기까지 진행하면 아래와 같은 리스너 확인이 가능하다. 이제 HTTPS:443에 대한 규칙 보기/편집을 클릭하여 규칙을 등록한다.

다음과 같이 세개의 규칙을 등록하였다. 규칙 옆의 숫자는 우선순위로 1번과 2번의 우선순위가 변경될 시 https://service.sbpark.xyz?admin=true 요청을 service-8080 타겟 그룹으로 전달하게되므로 유의하여 사용해야한다.

  1. https://service.sbpark.xyz?admin=true 요청 -> test-8180 타겟 그룹으로 전달
  2. https://service.sbpark.xyz 요청 -> service-8080 타겟 그룹으로 전달
  3. https://service.sbpark.xyz/test/ 요청 -> test-8180 타겟 그룹으로 전달 (경로 규칙의 경우 서비스 내에 해당 경로 패턴이 존재해야 함)

 

https 요청시에는 브라우저 주소창 옆에 자물쇠 모양이 있음을 알 수 있다.

 

3.5 HTTP -> HTTPS Redirect

HTTP 요청이 올 경우 HTTPS로 Redirect 하여 사용자와 서버 간 HTTPS 통신만 사용할 수 있도록 한다.

HTTP:80에 대한 규칙 보기/편집을 클릭하여 다음과 같이 편집한다.

 

이제 http://service.sbpark.xyz 로 요청하여도 https://service.sbpark.xyz 로 redirect 된 결과가 보여짐을 확인할 수 있다.

 

 

 

[참고]

https://docs.aws.amazon.com/ko_kr/elasticloadbalancing/latest/application/create-https-listener.html#describe-ssl-policies

https://docs.aws.amazon.com/ko_kr/elasticloadbalancing/latest/application/listener-update-rules.html
https://docs.awALs.amazon.com/ko_kr/elasticloadbalancing/latest/network/load-balancer-target-groups.html#target-type

댓글