AWS 배포 하기 - 2 (Route53 + ELB)

지원·2024년 3월 28일
0
post-custom-banner

도메인 연결 (Route53)

Route53 이란?

  • Route53 은 도메인을 발급하고 관리해주는 서비스
  • 도메인은 www.naver.com , youtube.com 와 같은 문자로 표현된 인터넷 주소
  • 더 전문적으로 표현하면 Route53 은 DNS(Domain Name System)

원래는 IP 주소로 접근을 했지만 IP 주소를 일일이 외우기 너무 어렵기 떄문에 사람들이 기억하기 쉬운 문자로 만들고 싶어했다.

  • 그래서 문자를 IP 주소로 변환해주는 하나의 시스템(서버)을 만들게 됐고 이게 바로 DNS 이다.
  • 즉 우리는 문자로 된 주소를 DNS 서버에게 던지면 DNS 서버에서 문자로 넘어온 주소에 대응하는 IP 주소를 반환해준다.

현업에서의 Route53 활용 여부

  • 프론트 웹 페이지든 백엔드 서버든 일반적으로 IP를 기반으로 통신하지 않고 도메인을 기반으로 통신한다.
  • 여러가지 이유가 존재하지만 그 이유 중 하나는 HTTPS 적용 때문인데, IP 주소에는 HTTPS 적용을 할 수 없다.
  • 도메인 주소가 있어야만 HTTPS 적용을 할 수 있고, 이 떄문에 특정 서비스를 운영할 떄 도메인은 필수적으로 사용하게 된다.

AWS Route53 말고도 가비아 , 후이즈와 같은 다양한 DNS 서버도 있다.

현업에서는 무조건적으로 AWS Route53 을 고집하진 않는데, 그 이유는 각 서비스마다 구매할 수 있는 도메인의 종류가 다르기 때문이다.

  • Route53 에는 없는 것이 가비아에는 있을 수 있기 떄문에 내가 원하는 도메인이 존재하는 곳의 DNS 서버를 활용하면 된다.

Route53 에서 도메인 구매

  • Route53 에 연결할 EC2 를 전에 배웠던 방식으로 생성
  • 생성한 후 AWS Route53 에 들어가서 사용하고 싶은 도메인 검색
  • 검색하고 나서 나오는 금액에 대한 결제를 하면 된다.
  • 구매하게 되면 왼쪽 메뉴에서 호스팅 영역으로 가보면 구매한 도메인의 창이 나온다.

Route53의 도메인을 EC2에 연결하기

  • 구매한 도메인을 jiwon-test.net 이라고 가정해보자.
  • 레코드 유형에서 A 와 CNAME 만 알면 된다.
  • IP 주소를 입력해서 도메인 주소로 바꿀것 이기 떄문에 A 를 선택
  • 값에는 인스턴스의 IP 주소를 넣어주면 된다.
  • 이렇게 하면 구매한 도메인으로 접근하면 그 안에서 값에 입력한 IP 주소로 보내준다는 것이다.
  • 레코드 이름을 api 로 지정하면 api.jiwon-test.net 으로 접근하는 것을 의미한다.
  • 즉 www 처럼 도메인 앞에 붙은 것이라고 생각하면 된다.

무료로 도메인 구매하는 방법

  • 내도메인한국 검색
  • 회원가입 후 로그인
  • 원하는 도메인을 검색후 가능한 도메인을 생성하면 된다.
  • 생성한 후 도메인 관리에서 수정 들아가서 IP연결(A) 에 EC2 IP 를 넣어주면 된다.
  • 그런후 생성한 도메인으로 정상적으로 접속할 수 있다.

HTTPS 연결하기 (ELB)

ELB란?

  • ELB(Elastic Load Balancer) 는 트래픽을 적절하게 분배해주는 장치
  • 서버를 2대 이상 가용할 떄 ELB를 필수적으로 도입하게 된다.
  • ELB 의 부가 기능인 SSL/TLS(HTTPS) 를 적용시키는 방법에 대해 배울 예정

SSL / TLS 란?

  • SSL/TLS 는 HTTP 를 HTTPS 로 바꿔주는 인증서
  • ELB 는 SSL/TLS 의 기능을 제공하고, SSL/TLS 인증서를 활용하면 HTTP 가 아닌 HTTPS 로 통신할 수 있게 만들어준다.

HTTPS 를 사용해야 하는 이유?

  1. 보안적인 이유
  • 데이터를 서버와 주고 받을 때 암호화를 시켜서 통신
  • 만약 암호화하지 않는다면 누군가 중간에서 데이터를 가로채 해킹할 수 있다.
  1. 사용자 이탈
  • HTTPS 를 사용하지 않고 웹 사이트에 들어가면 보안에 취약하다는 경고창이 같이 나오기 떄문에 사용자가 이탈한다.

현업에서는?

  • 대부분의 웹 사이트에서 HTTPS 를 적용시킨다.
  • HTTPS 인증을 받은 웹 사이트가 백엔드 서버와 통신하려면 백엔드 서버의 주소도 HTTPS 인증을 받아야 한다.
  • 따라서 백엔드 서버와 통신할 때도 IP 주소로 통신하는게 아니라, HTTPS 인증을 받은 도메인 주소로 통신을 한다.

주소 도메인을 구성할 때 사용하는 방법

ELB 를 활용한 아키텍처

  • ELB 를 사용하기 전에는 사용자가 직접 EC2 의 IP 주소 또는 도메인 주소에 직접 요청을 보내는 구조
  • ELB 를 추가적으로 도입하게 되면, 사용자들이 EC2 에 직접적으로 요청 보내는게 아니라 ELB 를 향해 요청을 보내도록 구성한다.
  • EC2 달았던 도메인도 ELB 에 달고, HTTPS 도 ELB 의 도메인에 적용시킬 예정이다.

ELB Setting 기본 구성

  • AWS EC2 왼쪽 메뉴에서 로드밸런서 서비스로 간다.
  • 생성을 누르고 Application Load Balancer 를 선택
  • 인터넷 경계와 내부라는 옵션이 있는데 내부 옵션은 Private IP 를 활용할 때 사용하는데, 이러한 개념을 활용하지 않기 때문에 인터넷 경계를 선택하면 된다.
  • 우리가 만든 EC2 인스턴스는 IPv4 로 이루어져있기 때문에 IPv4 를 선택하면 된다.
  • 네트워크 매핑을 설정해줘야하는데, 로드 밸런서가 어떤 가용 영역으로만 트래픽을 보낼 건지 제한하는 기능인데, 일단은 가용 영역에 제한을 두지 않고 모든 영역에 트래픽을 보내게 설정하면 된다. (모든 가용 영역에 다 체크)

ELB Setting 보안그룹

  • EC2 의 보안그룹과 ELB 의 보안그룹은 별개이다.
  • 그래서 ELB 를 위한 보안 그룹을 만들어보자.
  • 인바운드 규칙에 HTTP , HTTPS 를 가지는 보안 그룹을 생성하고 ELB Setting 할 때 지금 만든 보안그룹을 넣어주면 된다.

ELB Setting 리스너 및 라우팅 / 헬스 체크

  • 리스너 및 라우팅 설정은 ELB 로 들어온 요청을 어떤 EC2 인스턴스에 전달할 건지를 설정하는 부분이다.
  • ELB 가 사용자로부터 트래픽을 받아서 대상 그룹에게 어떤 방식으로 전달을 할지를 설정해야 한다.
    -> ELB 로 들어온 요청을 "어떤곳" 에 전달을 해야하는데 그 "어떤곳" 을 대상 그룹이라고 표현하고, ELB 로 들어온 요청을 어디로 보낼지 대상 그룹을 만들어야 한다.
  • 대상 그룹 생성에서 인스턴스 , HTTP , IPv4 , HTTP1 을 골라주면 된다.
    -> HTTP , 80번 포트 , IPv4 주소로 통신을 한다는 것을 뜻하고 현업에서도 많이 쓰이는 셋팅 방법이다.
  • 상태 검사 설정하기는 중요한 기능이기 때문에 정확하게 짚고 넘어가보자.

상태검사

  • 실제로 ELB 로 들어온 요청을 대상 그룹에 있는 여러 EC2 인스턴스로 전달하는 역할을 가지는데, 만약 특정 EC2 인스턴스 내에 있는 서버가 예상치 못한 에러로 고장났다고 가정해보자.
  • 그러면 ELB 입장에서는 고장난 서버에 요청을 전달하는게 비효율적이기 떄문에 ELB 는 주기적으로 대상 그룹에 속해있는 각각의 EC2 인스턴스에 요청을 보내고, 그 요청에 대한 응답이 잘 날라온다면 서버가 정상적으로 잘 작동되고 있다는 것을 판단한다.
  • 만약 요청을 보냈는데 응답이 오지 않는다면 서버가 고장났다고 판단해서 ELB 가 고장났다고 판단하는 EC2 로는 트래픽을 보내지 않는다.
  • GET /health 으로 요청을 보내게끔 설정하고, 정상적인 헬스 체크 기능을 위해 EC2 인스턴스에서 작동하고 있는 서버에 Health Check 용 API 를 만들어야 한다. (만들 예정)

다시 돌아와서 이렇게 생성한 대상 그룹을 지정해주고 로드 밸런서를 생성하면 된다.

  • 정리하면 ELB 에 HTTP 를 활용해 80번 포트로 들어온 요청을 설정한 대상 그룹으로 전달하겠다는 것

상태 검사를 위한 GET /health API 를 생성하고 다시 서버를 업데이트 시켜준다.

그런후에 로드 밸런서 주소를 통해 서버로 접속해보자.

  • 생성된 로드 밸런스에 가보면 DNS 이름이 있는데 이 주소로 접속하면 된다.
  • 그 주소에 /health 로도 요청해보면 정상적으로 실행되는 것을 확인할 수 있다.
  • ELB 는 IP 주소가 아닌 도메인 주소를 가지고 접속을 할 수 있다.

정리하면 사용자의 요청을 ELB 가 받고 ELB 에서 EC2 인스턴스에 접속할 수 있도록 한 것이다.

  • 현재는 EC2 인스턴스 주소의 도메인과 연결을 했는데, 다음에는 ELB 에 도메인을 연결해보자.

ELB 에 도메인 연결하기

  • 바로 전에 말헀듯이 현재는 EC2 인스턴스 주소의 도메인과 연결을 했는데, 사용자는 EC2 에 직접적으로 보내는게 아니라 ELB 를 거쳐서 보낸다.
  • 그렇기 떄문에 ELB 에 도메인을 연결해줘야 한다.
  • Route53 에 가서 호스팅 영역에 가서 구매한 도메인을 들어가보면 전에 우리가 EC2 에 도메인을 연결했던 것이 있다.
  • 그것을 삭제하고 다시 레코드 생성을 누르고 레코드 이름 , 레코드 유형은 그대로 설정하고 별칭을 활성화 시킨다음에 트래픽 라우팅 대상에서 Application/Classic Load Balancer 에 대한 별칭을 선택하고, 지역은 아시아 태평양(서울) 을 선택한다.
  • 그렇게 하면 우리가 만들었던 로드 밸런서의 주소가 나오고 그 후 레코드 생성을 누르면 된다.
  • 생성이 됐다면 그 구매한 도메인으로 접속할 시 정상적으로 작동한다.

즉 ELB 에 도메인을 연결한 것이다.

HTTPS 적용을 위해 인증서 발급하기

  • AWS Certificate Manager 서비스로 들어가서 인증서 요청 버튼 누르기
  • 퍼블릭 인증서 요청을 선택하고 도메인 이름에는 우리가 사용하려고 하는 도메인 이름을 넣어주면 된다.
  • 그 이후 기본적으로 선택되어 있는 값을 사용하면 된다.
    생성하자마자 바로 되는 것이 아니라 도메인에 가보면 검증 대기 중 이라는 상태를 가진다.
  • 그 이유는 아무 인증 없이 인증서를 발급해주면 안 되기 때문에 CNAME 이라는 유형으로 이름과 값을 보내게 된다면 그때 인증을 해주겠다는 것이다. (내가 소유한 도메인이 맞는지 검증하는 단계)
  • 그래서 Reoute 53 에서 레코드 생성 버튼을 누르고 바로 레코드 생성을 누르게 되면 등록할 수 있다.
  • 약간의 시간이 지난후 정상적으로 발급이 성공된다.

ELB 에 HTTPS 설정하기

  • EC2 로 들어가서 로드 밸런서를 클릭한 후 우리가 생성했던 로드 밸런서로 들어간다.
  • 거기서 내려보면 리스너 및 규칙이 있고 리스너 추가 버튼을 누르고 HTTPS 의 리스너를 추가한다. (전에는 HTTP 만 추가 했었다)
    -> ELB 로 요청이 들어오는데 HTTPS 의 프로토콜을 활용한 요청이 들어온다면 그 요청에 대해서 대상 그룹에게 트래픽을 전달해주겠다는 것이다.
  • 대상 그룹은 우리가 전에 만들었던 대상 그룹을 선택하고 보안 정책 부분에서 다른 값은 기본 값을 사용하고 그 중에서 인증서는 우리가 바로 위에서 만든 인증서를 선택해주면 된다.
  • 그런후 추가를 누르고 https://도메인명 으로 접속해보면 정상적으로 동작한다.

HTTP 는 위에서 설명한 단점이 있기 떄문에 HTTP 로 요청이 들어오더라도 HTTPS 자동으로 전환하도록 해보자.

  • 우선 로드 밸런서 세부 정보에서 리스너 및 규칙에서 HTTP:80 의 규칙을 삭제한다.
  • 다시 리스너 추가를 할 때 리스너 구성에서 프로토콜은 HTTP 포트는 80 을 설정하고 기본 작업에서 라우팅 액션을 URL 로 리디렉션을 선택한다.
  • URL로 리디렉션에서 URI 부분을 선택하고 프로토콜은 HTTPS 포트는 443 으로 설정해준다.
  • 이렇게 설정하면 HTTP:80 으로 요청이 들어온 것에 대해서는 바로 대상 그룹으로 트래픽을 보내는것이 아니라 HTTPS:443 로 다시 리디렉션을 하겠다는 것이다.
    -> 즉 HTTP 로 요청을 하더라도 HTTPS 로 접속할 수 있게 한다.

실제로 http:// 로 접속하더라도 https:// 로 자동으로 바뀌는 것을 확인할 수 있다.

HTTPS 연결 시 ELB vs Nginx , Certbot

  • 현업에서는 ELB 를 활용해서 HTTPS 적용을 더 많이 시킨다.
  • HTTPS 설정도 쉽고, HTTPS 인증서의 만료기간 갱신도 자동으로 해주기 때문이다.
  • 하지만 가장 큰 단점은 "비용" 인데, Nginx+Certbot 을 활용하면 HTTPS 에 관련된 비용이 일절 들지 않는다.
  • 하지만 ELB 를 사용하는 것 자체로써 비용이 나가기 떄문에 비용에 부담이 되는 상황이라면 Nginx+Certbot 을 하나의 EC2 에 설치해서 사용하면 된다.

Nginx , Certbot 을 활용해 HTTPS 연결하기

  1. EC2 생성
  • 인바운드 보안 그룹 규칙에 SSH , HTTP , HTTPS , 사용자 지정 TCP 추가
  • Express 서버를 3000번에 띄우려고 하기 때문에 사용자 지정 TCP 에 3000 포트로 지정해주면 된다.
  1. 탄력적 IP 할당 후 만들었던 인스턴스에 탄력적 IP 주소 연결
  2. EC2 인스턴스에 접속 후 Node.js 설치 , git clone , 라이브러리 설치(npm) , .env 파일 생성 , app.js 파일에 들어가서 port 를 3000으로 수정 , pm2 설치 후 서버 기동
  • 접속할 때 IP주소:3000 으로 접속
  1. Route53 에서 호스팅 영역에서 있는 도메인 링크에 들어간 후 레코드 생성
  • 레코드 유형 (A) , 값에는 IP 주소 넣고 레코드 생성 누르면 도메인 주소로 들어가면 IP 주소로 바로 접속이 된다.
  • 이제 접속할 떄 도메인주소:3000 으로 접속하면 된다.
  • 만약 :3000 을 생략하면 기본 포트인 80 으로 접속하게 되는데, 현재 3000 으로 서버를 띄웠기 떄문에 도메인 주소만 입력하면 접속되지 않는다.
  1. EC2 에 Nginx 설치
  • sudo apt update
  • sudo apt install nginx
  • sudo service nginx status (Nginx 상태 확인)
  • IP주소/도메인주소로 접속해보면 Welcome to nginx 문구가 나오면 정상적으로 설치 된 것
  1. Certbot 설치
  • Certbot 의 역할은 HTTPS 인증서 발급을 해준다.
  • sudo snap install --classic certbot
  • sudo ln -s /snap/bin/certbot /usr/bin/certbot
  1. HTTPS 인증서 발급
  • Certbot 은 설치를 했고 이제 인증서를 발급 받아보자.
  • sudo certbot --nginx -d "발급 받았던 도메인 주소" (api.jiwon-test.co.kr)
  • 입력하고 나면 이메일 주소를 넣어주면 된다. (계속 y 누르기)
  • 일정 시간 지나면 정상적으로 발급이 된다.

도메인 주소로 접근해보면 HTTPS 가 제대로 동작하는 것을 확인할 수 있다.

80번 포트에는 Nginx 가 동작하고 있는데, 현재 우리는 백엔드 서버를 3000번 포트로 올렸기 떄문에 3000번 포트에 HTTPS 가 동작해야한다.

현재로는 도메인주소:30000 으로 접근하면 HTTPS 가 적용되지 않는 것을 확인할 수 있다.

  • 현재는 80번 포트에만 HTTPS 가 적용되고 있다.

해결하기 위한 방법은 EC2 인스턴스에서 수정을 해줘야한다.

  • cd /etc/nginx
  • cd sites-available
  • vi default (만약 이상하게 나온다면 새로고침 후 다시 접근)
  • 밑으로 내려가다가 server_name 에 우리가 만들었던 도메인 주소가 나오면 location 에서 try_files 부분을 주석처리 후 아래와 같이 수정한다.
  • proxy_pass http://localhost:3000/;
  • server_name (우리가 설정한 도메인) 으로 요청이 들어온다면 proxy_pass 로 트래픽을 전달해주겠다는 것
  • 저장 후 Nginx 재접속
  • sudo service nginx restart
  • 다시 접속해보면 백엔드 서버에도 HTTPS 를 적용시킬 수 있다.
profile
덕업일치
post-custom-banner

0개의 댓글