AWS ALB + Route53을 활용한 HTTPS 적용

aws를 사용해 https를 김치에 싸먹는 방법
김주혁's avatar
Jan 20, 2023
AWS ALB + Route53을 활용한 HTTPS 적용

 
AWS Route 53 + Certificate Manager + Target Group + ELB + Nginx로
서버에 Https 프로토콜을 적용시키는 방법입니다.
 
작업이유
Http 프로토콜을 사용하는 것이 보안적으로 위험하기 때문에, 서버에 Https에 적용하는 것이 필요했습니다.
 

Route53

 
  1. 호스팅 영역 생성
notion image
  • 도메인 이름은 사용하기로 약속된 도메인을 입력합니다
    • example.com
  • 설명은 이 도메인에 대한 설명이 들어가면 됩니다.
  • 퍼블릭 호스팅 영역을 선택합니다.
notion image
영역이 처음 생성되면 모자이크된 3개는 무시하고, NSSOA유형이 생성됩니다. 이중 NS유형의 4개의 값은 가비아나 AWS에서 구매한 도메인과 관려해서 업데이트를 해주셔야 합니다. ⇒ 가비아에서 Route 53 라우팅 하기
 
  1. ACM 인증서 요청
    1.  
      notion image
      인증서 유형은 퍼블릭 인증서 요청을 사용합니다.
       
      notion image
      • 완전히 정규화된 도메인 이름에는 사용하기로 약속된 호스팅 영역으로 생성한 도메인을 입력합니다. ( EX : proctormatic.com)
        • 여기서 중요한 것은 다른 이름 추가로, 도메인을 2가지 입력해야 한다는 것 입니다.
        • 첫 번째는 root 도메인이 될 proctormatic.com
        • 두 번째는 서브 도메인을 모두 포함할 *.proctormatic.com
        • 두 번째 서브 도메인을 포함할 도메인을 와일드카드(*)로 입력하지 않는다면 www와 같은 서브도메인이 리다이렉션되지 않아 https가 적용되지 않는 불상사가 발생할 수 있습니다.
      • 검증 방법은 DNS검증을 사용합니다.
      • 키 알고리즘은 RSA 2048.. 이건 찾아보지 않았지만, 레퍼런스를 살펴보면 보통 RSA 2048을 사용하고 있었습니다.
      이제 인증서를 요청하기 위해 생성합니다.
 
  1. Route 53에서 레코드 생성
    1.  
      notion image
      notion image
      레코드 영역 생성 버튼을 누르면 아마 위와 같이 나올텐데, 현재 저는 레코드를 생성했기 때문에 검증 상태가 성공으로 나옵니다.
       
      만약 proctormatic.co.kr과 *.proctormatic.co.kr이 둘 다 나오지 않는다면 문제가 발생한 것이니 돌아가 다시 2개의 도메인을 추가하여 인증서를 생성해주시기 바랍니다.
       
      DNS 레코드를 생성하고 나서, Route 53으로 돌아가면 레코드가 생성되있는 것을 볼 수 있습니다.
       
      notion image
      유형의 CNAME이 ACM SSL 인증서가 도메인에 적용 됐습니다.
       
 

Application Load Balancer(ALB)

 
  1. 로드 밸런서(Application Load Balancer) 생성
    1.  
      EC2에 접속해서, 아래로 내려보면 로드 밸런싱이란 카테고리가 존재합니다.
      notion image
      notion image
      notion image
      • 맨 첫번째 화면이 위와 같이 나오는데 balancer name을 입력하고
      • Scheme는 Internet-facing으로 합니다. (이유는 모름 다 이렇게함)
      • IP address type은 IPv4 (이유 모름 위와 같음)
      notion image
      그 다음 칸을 보면 Network mapping이 나타나는데,
      • VPC는 설정하지 않으면 Default입니다.
      • Mappings는 사용할 가용영역을 선택해 줍니다. 한국 리전은 보통 az-a와 az-c를 사용합니다.
       
      notion image
      보안그룹은 현재 EC2 인스턴스에서 사용하고 있는 보안그룹을 입력해 줍니다.
      notion image
      Listners and routing에서 Add listner를 클릭하고 HTTPS를 추가해줍니다. 여기서 Add listner tag를 HTTPS로 추가해주지 않는다면, !!!ACM 설정하는 부분이 생기지 않습니다.
       
      Protocol의 토글을 누르면 HTTP와 HTTPS를 선택할 수 있는데 이 중 HTTPS를 선택하고
      notion image
      이제 여기까지 왔다면, 대상 그룹을 생성해야 합니다. 위쪽의 빨간 박스입니다. 대상그룹은 Listeners and routing의 대상이 될 그룹을 지정합니다. create target group을 클릭하고
       
  1. 대상 그룹(Target Group) 생성
    1.  
      notion image
       
      EC2 Instance를 사용할 것이기 때문에, Instances를 클릭합니다.
      • Target group name을 지정하고
      • Protocol은 HTTP : 80으로 선택합니다.
      • 그 아래에 Protocol version도 있는데, HTTP1을 보편적으로 사용한다고 합니다.
      • Health checks는 사실상 Options인데, 일단은 건드리지 않고 넘어갑니다.
      여기까지 했다면 Next를 클릭합니다.
       
      notion image
      그러면 위와 같이 등록할 수 있는, targets들이 주르륵 나오는데 이중에서 사용할 EC2를 고르고
      아래에 Include as pending below를 클릭합니다. 클릭하고 나면 아래에
       
      notion image
       
      내가 입력한 타겟이 등록되고, 등록이 끝났다면 우측 하단에 Create taget group 을 클릭합니다.
 
  1. 로드 밸런서에 타겟 그룹 적용
    1.  
      대상그룹이 생성됐다면 위에서 생성한 로드밸런서 Default action의 Forward to에서 대상그룹을 선택합니다.
      notion image
      보통 사용하지 않는 대상그룹만 사용할 수 있게 클릭되기 때문에 일단 사용가능한 대상그룹만을 지정해놨습니다. 실제에선 사용할 대상그룹을 선택하시면 됩니다.
      notion image
      이제 Listeners and routing에서 HTTPS를 선택했을 때 고를 수 있는 옵션인 Secure listener settings를 보면,
      • Security policy는 그냥 건드리지 않습니다.
      • Default SSL/TLS certificate는 From ACM을 그대로 두시고, 오른쪽의 토글을 입력하면 2번에서 인요청한 ACM 인증서를 입력합니다.
      여기까지 왔다면, 이제 우측 하단의 Create load balncer를 클릭해 로드 밸런서를 생성합니다.
 
  1. 로드 밸런서 Listener Redirect
    1.  
      이제 생성된 로드 밸런서의 리스너를 편집해야 합니다.
      notion image
      편집을 클릭하면 위와 같이 뜰 탠데, Remove를 눌러서 제거해주시고
      notion image
      Remove를 누르면 중앙에 나오는 Add Actions버튼을 클릭해 Redirect를 눌러주시고, HTTPS : 443을 입력해주고 Original host, path, query로 선택해줍니다. Status code는 301입니다.
 

Route53과 ALB 연결

 
notion image
이제 Route 53으로 돌아와
  • 서브도메인없이 그냥 원형을 유지해서 생성하고
  • 그 아래의 별칭을 클릭합니다.
  • 라우팅 대상은 Application/Clssic Load Balancer에 대한 별칭을 클릭하고
  • 내가 만든 Region
  • 그리고 내가 생성한 Load Balancer를 선택해 줍니다.
  • 그리고 레코드 생성!
위와 같은 방법을 이름만 바꿔서 다시 한 번 똑같이 레코드를 생성해 줍니다. 이름은 서브도메인을 포함해야하기 때문에 *.example.com 레코드 생성까지 끝났다면,
notion image
 
이제 이런식으로 나오게 되는데,
  • A는 내가 생성한 로드밸런서와 연결되있는 레코드이고,
  • NS와 SOA는 호스팅 영역 처음 생성시 생성되는 레코드이고,
  • CNAME은 SSL 인증서 생성시 연결되면서 생기는 레코드입니다.
이제 모든 위 과정을 거쳐서 연결된 도메인으로 접속하면~ https가 적용된 사이트를 확인할 수 있습니다.
 

Bonus. Nginx Redirect

server { listen 80; server_name example.com; if ($http_x_forwarded_proto != 'https') { return 301 https://$host$request_uri; } location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header HOST $http_host; proxy_set_header X-NginX-Proxy true; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # port setting , 서버의 port와 동일한 port로 pass 시켜야 합니다. proxy_pass http://localhost:3001; proxy_redirect off; proxy_connect_timeout 300s; proxy_read_timeout 600s; proxy_send_timeout 600s; proxy_buffers 8 16k; } }
 
위처럼 listen과 server_name 그리고 location안의 proxy 양식을 모두 입력하면, 혹시나 생길 수 있는 미연의 https 리다이렉션 에러를 방지할 수 있다.
 
NginX 설정 - /usr/local/nginx/conf/nginx.conf
sudo nano /etc/nginx/nginx.conf
sudo service nginx restart
Share article

vlogue