[AWS] EC2 인스턴스에 HTTPS 및 로드밸런서 적용하기

yunSeok·2023년 12월 2일
2

사이드 프로젝트

목록 보기
10/14
post-thumbnail

AWS에서는 AWS Certificate Manager(ACM)을 사용해 HTTP 프로토콜에 SSL, TLS 라고 하는 인증서로 암호화된 HTTPS 프로토콜을 적용할 수 있도록 해줍니다.

📌 SSL과 TLS의 주요 차이점은?

  • 메시지 인증
    • SSL은 메시지 인증 코드(MAC)를 사용하여 데이터의 무결성을 보장합니다. MAC 생성에 MD5 알고리즘(오래됨..)을 사용합니다.
    • TLS는 HMAC(Hash-based Message Authentication Code)을 사용합니다.
  • 암호화 알고리즘
    • SSL은 RSA, DES, 3DES와 같은 이전 암호화 알고리즘을 지원합니다.
    • TLS는 AES, RSA, ChaCha20과 같은 최신 암호화 알고리즘을 지원합니다.

📌 HTTPS 적용시 왜 로드밸런서를 사용할까?

1. 단일 IP 주소로 여러 HTTPS(port 443) 트래픽을 처리할 수 있습니다.
HTTPS 트래픽을 처리하려면 EC2 인스턴스에 고정 IP 주소를 할당하고 해당 IP 주소에 포트 443을 열어야 합니다. 하지만 이렇게 하면 단일 IP 주소에만 HTTPS 트래픽을 처리할 수 있습니다. 로드밸런서를 사용하면 단일 IP 주소로 여러 EC2 인스턴스에 대한 HTTPS 트래픽을 처리할 수 있습니다.

2. 인증서 관리를 단순화할 수 있습니다.
EC2 인스턴스에 HTTPS 인증서를 설치하고 관리하려면 각 인스턴스에 인증서를 생성하고 설치해야 합니다. 하지만 로드밸런서를 사용하면 로드밸런서에 인증서를 생성하고 설치하면 됩니다.

3. 로드 밸런싱을 제공할 수 있습니다.
로드밸런서는 여러 EC2 인스턴스에 트래픽을 분산시켜 웹 애플리케이션의 성능과 가용성을 향상시킬 수 있습니다. HTTPS 트래픽도 로드밸런싱을 통해 분산시킬 수 있습니다.


📌 로드밸런서 구성요소

그림 출처 : AWS Application Load Balancer란 무엇입니까?

각 리스너에는 기본 규칙(HTTP, HTTPS)이 포함되어 있고 하나의 리스너에는 요청을 다른 대상 그룹으로 라우팅하는 다른 규칙이 포함되어 있습니다.

📌 작동방식 (본문 발췌)

  1. 클라이언트(예: 웹 브라우저)가 애플리케이션에 요청을 보냅니다.
  2. 로드 밸런서의 리스너가 구성된 프로토콜(예: HTTP, HTTPS)과 포트(예: 80, 443)에 맞는 요청을 수신합니다.
  3. HTTPS 리스너로 설정된 경우, 로드 밸런서는 SSL/TLS 종료 (로드 밸런서가 클라이언트와의 보안 연결을 처리하고, 암호화된 트래픽을 복호화하여 백엔드 서버로 일반 HTTP 트래픽으로 전달하는 과정) 를 수행합니다. 클라이언트와의 암호화된 연결을 처리하고, 백엔드 서버로 전달하기 전에 요청을 복호화합니다.
  4. 리스너는 미리 정의된 규칙에 따라 수신된 요청을 평가합니다.
  5. 평가 결과에 따라 로드 밸런서는 요청을 어느 대상 그룹으로 보낼지 결정합니다.
  6. 선택된 대상 그룹 내에서 로드 밸런서는 특정 알고리즘(예: 라운드 로빈, 최소 연결 수)을 사용하여 요청을 처리할 특정 서버를 선택합니다.
  7. 로드 밸런서는 주기적으로 대상 그룹의 서버들에 대해 헬스 체크를 수행합니다. 비정상적인 서버로 판단되면 해당 서버로의 트래픽 전송을 중단합니다.
  8. 로드 밸런서는 선택된 백엔드 서버로 요청을 전달합니다. (필요한 경우 X-Forwarded-For 헤더와 같은 추가 정보를 포함시킵니다.)
  9. 로드 밸런서는 이 응답을 받아 클라이언트에게 전달합니다.

정리

로드밸런서가 HTTPS(port 443) 요청인지 HTTP(port 80) 요청인지 확인합니다. HTTP 요청이면 이 요청을 HTTPS 요청으로 Redirection 하고, HTTPS 요청이면 Target group 80번 port로 요청을 포워딩합니다.


순서

  1. Route 53 도메인 생성
  2. ACM에서 SSL 인증서 발급
  3. 로드 밸런서 생성
  4. 호스팅 영역 설정

AWS 접속
https://aws.amazon.com/ko/free/

1. Route 53 도메인 생성

도메인 생성

HTTPS를 적용할 도메인이 필요한데요, 가비아에서도 쉽게 도메인을 구매할 수 있지만 저는 가비아에서 등록해본 적이 있기때문에 이번에는 AWS Route 53에서 등록해보려 합니다!!

혹시 가비아를 사용하면 참고해주세요..!!
가비아를 이용한 도매인 생성

Route 53 검색하고 클릭해주세요.


아래 도메인 등록칸이 있는데 등록하고싶은 도메인을
www.를 제외하고 검색해주세요.


아래 사용하실 도메인을 선택해주세요

1년동의 금액이긴한데.. 너무 비싸다고 생각되시면 가비아에서 도메인 생성하는걸 추천드리겠습니다!!


📌 요청이 진행중일텐데요, 도메인 생성시 개인정보 작성할때 입력한 이메일로 확인 이메일이 전송됩니다. 꼭 링크눌러서 확인해주세요!!!

이메일을 누른 시점부터 5분안에 아마 등록될겁니다!!

여기까지 설정한 후,
다음은 생성한 도메인에 HTTPS를 적용하도록 하겠습니다.


2. ACM에서 SSL 인증서 발급

ACM(amazon certificate manager)

Certificate Manager 검색


인증서 요청 클릭


퍼블릭 인증서 요청 선택해주세요.


생성한 도메인이름 입력 -> DNS 검증 -> 요청 클릭


인증서가 요청중일텐데요 인증서 ID를 클릭해주세요.


Route 53에서 레코드 생성 클릭!


Route 53에서 도메인을 생성했다면 자동으로 생성됩니다.
레코드 생성 눌러주세요.


몇 분 기다려주시면 발급이 완료되는걸 확인할 수 있습니다.


3. 로드 밸런서 생성

대상 그룹 생성

로드 밸런서 생성을 위한 대상 그룹 설정을 먼저 진행해주도록 하겠습니다.

EC2 클릭해서 들어가면 왼쪽 메뉴 로드밸런싱에 대상 그룹누르고
대상 그룹 생성 눌러주세요.


  • 대상유형 선택 : EC2 인스턴스 사용 중이기 때문에 인스턴스선택
  • 대상 그룹 이름 : 원하는 이름을 작성해도 됩니다.
  • 프로토콜, 포트에는 반드시 직접 사용하시는 포트번호를 작성해주세요!! 8080 포트를 사용하신다면 8080으로 작성해주세요!!!

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


바로 나오는 인스턴스 목록에서 방금 생성한 인스턴스를 체크하고 아래 보류 중인 것으로 포함 클릭해주세요!!
(8080포트를 사용중이라면 8080으로 나옵니다.)

아래 대상에 바로 등록된것을 확인할 수 있습니다.

그룹 등록은 마쳤고 로드 밸런서 생성을 바로 해보겠습니다.


로드 밸런서 생성

로드 밸런서 생성 클릭!


Application Load Balancer 선택해주세요.


원하는 로드밸런서 이름을 작성하고,
체계는 인터넷 경계로 선택해주세요.
(인터넷 경계는 노드포트로 접근하여 라우팅 한다는 의미입니다.
EC2 노드에 접근하여 사용하기 때문에 선택해주겠습니다.)


아래 매핑 목록에서 선택하는 건
EC2 인스턴스에 들어가서 가용영역에 작성되어 있는 것을 선택해주시면 됩니다.

추가로 아무거나 하나 더 선택해주세요. 2개를 선택해야합니다.


보안 그룹은 자신의 인스턴스가 사용중인 보안 그룹으로 설정해주세요!!


프로토콜은 HTTP, HTTPS 두 가지 생성해줍니다.
(HTTP 프로토콜은 사용중인 포트번호 작성해주세요. 8080 사용중이라면 8080 작성!!!)
아래 인증서에서 아까 생성한 인증서를 선택해주세요.

로드 밸런서 생성 눌러주세요.


4. 호스팅 영역 설정

로드 밸런서 생성은 마무리 되었고 Route 53 다시 들어가서
방금 생성한 로드 밸런서를 래코드 생성해주도록 하겠습니다.


별칭을 체크하고 아래 트래픽 라우팅 대상에
로드 밸런서에 대한 별칭,
리전은 서울,
마지막에는 생성한 로드 밸런서를 체크해주세요.

아래 다른 레코드 추가를 눌러서 레코드 이름에 www 작성해서 하나 더 만들어주세요!


다 마무리 되었습니다.

로드 밸런싱 대상 그룹에 들어가서 상태가 정상인지 확인해주세요.
만약 비정상이라면 포트번호 문제일 수 있기 때문에

  1. 사용중인 포트번호를 작성했는지
  2. 포트번호가 인스턴스 보안그룹에 설정되어있는지

확인해주시면 됩니다.


만약 상태도 정상이고 다 마무리했다면
URL에
https:// (생성한 도메인 주소) 입력하면

잘 작동되는 것을 확인할 수 있습니다.

HTTPS도 잘 적용되었네요. 😃😃



❗️❗️ 적용에 시간이 걸릴 수도 있어요. 10~20분정도 .. 30분정도까지도 걸렸던 케이스가 있어요. 천천히해보세요!


5. HTTP -> HTTPS 리다이텍트하기

리스너 및 규칙의 HTTP 포트 체크 -> 리스너 관리 -> 리스너 편집

라우팅 액션을 URL로 리디렉션 체크 선택 -> URI 부분 선택 -> 프로토콜을 HTTPS로하고 포트는 443으로 작성

📌 중요한게 HTTP 프로토콜 포트번호를 반드시 보안그룹에 있는 HTTP 포트번호와 일치해야한다.

만약 보안그룹에 HTTP:80 이고 TCP:8080 으로 설정되어 있다고 했을때 HTTP:8080으로 설정하면 안됩니다!!


참고 사이트
https://docs.aws.amazon.com/ko_kr/elasticloadbalancing/latest/application/introduction.html

2개의 댓글

comment-user-thumbnail
2024년 8월 8일

안녕하세요. 글 잘 읽었습니다!!
질문이 있는데
4. 호스팅 영역 설정에서

오류 발생
지정된 이름의 레코드가 이미 있습니다.
(InvalidChangeBatch 400: Tried to create resource record set [name='server.store.', type='A'] but it already exists)

러고 새로 레코드를 만들면 에러가 나는데 이미 A랑 server.store 으로 같은 이름으로 매핑했었는데 어떻게 에러가 안나고 생성했는지 알 수 있을까요?
감사합니다.

1개의 답글