AWS EC2 퍼블릭 IP에 도메인 연결 및 HTTPS 설정

AFDB·2024년 9월 13일

EC2 인스턴스 퍼블릭 IP 주소 -> 탄력적 IP주소로 변경

  1. EC2 인스턴스의 퍼블릭 IPv4 주소는 인스턴스 정지, 시작 등 상황에 따라 바뀔 수 있다.
  2. 때문에, 탄력적 IP주소를 할당받아 고정시킨다.(1개까지는 무료라고 한다.)

탄력적 IP주소와 나의 도메인을 연결시킨다.

AWS Route 53 - 호스팅 영역 생성

도메인 이름을 설정하고 생성한다.

기본으로 두 개의 레코드가 생성되어있고, 레코드 생성을 클릭해서

안에 탄력적 IP주소 삽입

그리고 NS 유형에 생성된 4개의 값을 복사해서 호스팅 케이알로 이동한다.

그리고 네임서버 부분을 NS 유형의 값으로 변경해준다.

다음으로 ACM 인증서 발급

완전히 정규화된 도메인 이름 입력하고

처음엔 검증대기중으로 완료가 안된다. Route 53에서 레코드 생성 눌러준다.

조회된 DNS 레코드 선택하고 레코드 생성 클릭하면

발급 중 으로 바뀐다.
✔️ 여기서 완전히 정규화된 도메인 이름 이랑 Routh 53에 입력되어있는 도메인명이 같아야한다. 5분 정도 기다리면 성공으로 바뀐다.

대상그룹(target group) 생성

  1. 인스턴스로 생성하고
  2. 대상그룹 이름 설정하고, 포트번호 80
  3. 아래 보류 중으로 포함
  4. 대상 그룹 생성

이제 로드밸런서 생성

로드 밸런서의 역할:

  1. HTTPS (443) 요청 받기 (SSL 인증서 처리)
  2. HTTP (80) 요청을 HTTPS로 리디렉션(우회)

Nginx 역할:

  1. HTTP (80) 포트에서 ALB가 보낸 요청만 받기
  2. /api/v1 같은 요청을 backend_blue 컨테이너로 넘기기
  3. /health 요청에 200 OK 응답하기 등

EC2 인스턴스에서 좌측 카테고리 하단 로드밸런서 클릭 후, 생성

Application Load Balancer 생성

이름 정해주고,

가용 영역은 EC2 스턴스와 동일한 가용 영역이 포함된 것으로 2개 이상 선택한다.(인스턴스 정보에서 확인한다.)

보안그룹도 마찬가지로 인스턴스와 동일하게 설정

리스너 설정에서 HTTP와 HTTPS의 보안 그룹으로 아까 생성했던 보안그룹을 넣어준다.

만들어진 로드밸런서를 Route 53에서 생성했던 호스팅 영역에 연결시킨다.

A 유형의 레코드를 선택하고 레코드 편집 - 별칭 - 트래픽 라우팅 대상에서 캡쳐와 같이 선택하고 방금 생성했던 로드밸런서를 선택하고 저장한다.

로드밸런서에서 http 요청을 https로 리디렉션

위에서 설정했던 HTTP:80 리스너 - 편집으로 들어간다.

HTTP로 들어온 요청을 HTTPS 로 보낼 수 있게 위와 같이 설정한다.

등록된 대상 수정

대상 그룹(soramTargetGroup)에는 오직 Nginx가 응답하는 포트(80)만 등록해야 한다.
❌ 기존에는 HTTPS 443 대상을 추가했었는데, 그러면 Unhealthy 나옴.
로드밸런서가 HTTPS(443) 요청을 받아 암호화를 해독한 뒤, EC2 서버에는 일반 HTTP(80) 트래픽을 보낸다. (이것을 'SSL/TLS 종료'라고 함)
따라서, 대상 그룹은 EC2의 80 포트만 바라보고 있어야함.

그리고 health-check (상태 검사) 설정을 변경하지 않았다면, 기본 설정인 /로 되어 있을텐데, 이것을 /health 로 수정

Nginx 에서도 HTTP리디렉션 및 health-check 설정 추가


# HTTP로 접근하는 모든 요청을 HTTPS로 리디렉션
server {
    listen 80;
    server_name 탄력적IP주소;
   # 헬스 체크를 위한 경로
    location /health {
        access_log off;
        return 200 'OK';
        add_header Content-Type text/plain;
    }
   # 리디렉션 설정
    location / {
        return 301 https://도메인주소$request_uri;
    }
}
# 없어도 됨
# server {
#    listen 443;
#    server_name https://도메인주소;
#    root /var/www/html;

    # 헬스 체크를 위한 경로
#    location /health {
#        access_log off;
#        return 200 'OK';
#        add_header Content-Type text/plain;
#    }
    ... 생략

❓ 대상 그룹에서 80포트를 없애고 이거에 맞춰서 80 포트를 읽는 server블록을 없애니 오류가 계속 발생
✅ ALB가 모든 트래픽(HTTPS 포함)을 EC2의 80 포트로 보내주기 때문에, Nginx는 80 포트에서 모든 요청을 받을 준비를 해야 한다.
✅ 그래서 80포트를 IP주소와 함께 유지

최종적인 흐름

ALB(HTTPS:443, HTTP:80) → 대상 그룹(EC2:80) → Nginx(Listen 80) → 백엔드(backend_blue:3001)

0개의 댓글