AWS Route 53 + Certificate Manager + Target Group + ELB + Nginx로
서버에 Https 프로토콜을 적용시키는 방법입니다.
작업이유
Http 프로토콜을 사용하는 것이 보안적으로 위험하기 때문에, 서버에 Https에 적용하는 것이 필요했습니다.
Route53
- 호스팅 영역 생성
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252F27a74f95-2555-49a7-bfd2-c23f198188a0%252FUntitled.png%3Ftable%3Dblock%26id%3D9aadac23-006e-4550-9aba-9c5ab490ed9f%26cache%3Dv2&w=3840&q=75)
- 도메인 이름은 사용하기로 약속된 도메인을 입력합니다
- example.com
- 설명은 이 도메인에 대한 설명이 들어가면 됩니다.
- 퍼블릭 호스팅 영역을 선택합니다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252Fcaf37f85-74bc-4386-8072-abaa81f5486e%252Froute53_https1.png%3Ftable%3Dblock%26id%3D5de687f5-acb9-41a9-987c-ea8aeab8574b%26cache%3Dv2&w=3840&q=75)
영역이 처음 생성되면 모자이크된 3개는 무시하고, NS와 SOA유형이 생성됩니다. 이중 NS유형의 4개의 값은 가비아나 AWS에서 구매한 도메인과 관려해서 업데이트를 해주셔야 합니다. ⇒ 가비아에서 Route 53 라우팅 하기
- ACM 인증서 요청
- 완전히 정규화된 도메인 이름에는 사용하기로 약속된 호스팅 영역으로 생성한 도메인을 입력합니다. ( EX : proctormatic.com)
- 첫 번째는 root 도메인이 될 proctormatic.com
- 두 번째는 서브 도메인을 모두 포함할 *.proctormatic.com
- 검증 방법은
DNS검증
을 사용합니다. - 키 알고리즘은 RSA 2048.. 이건 찾아보지 않았지만, 레퍼런스를 살펴보면 보통 RSA 2048을 사용하고 있었습니다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252F6dd74aa4-1974-4f90-ba6b-277b8fc40e9f%252FUntitled.png%3Ftable%3Dblock%26id%3De07d21e6-85f0-4b88-bfdb-d9321c7fbacc%26cache%3Dv2&w=3840&q=75)
인증서 유형은 퍼블릭 인증서 요청을 사용합니다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252F2b1de83a-c5b0-475f-b8ef-895ea9e9fba8%252FUntitled.png%3Ftable%3Dblock%26id%3Df65f5712-cd4a-41ae-937c-b6546e76da36%26cache%3Dv2&w=3840&q=75)
여기서 중요한 것은 다른 이름 추가로, 도메인을 2가지 입력해야 한다는 것 입니다.
두 번째 서브 도메인을 포함할 도메인을
와일드카드(*)
로 입력하지 않는다면 www와 같은 서브도메인이 리다이렉션되지 않아 https가 적용되지 않는 불상사가 발생할 수 있습니다.이제 인증서를 요청하기 위해 생성합니다.
- Route 53에서 레코드 생성
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252F6706b7f1-da81-4ac4-9be2-79a7b012dd5a%252Froute53_https2.png%3Ftable%3Dblock%26id%3Dc2106eb4-abed-4414-8d78-cab7ea67eaf4%26cache%3Dv2&w=3840&q=75)
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252F1f4b5989-0acf-414c-96ac-cb9cf5d38b54%252Froute53_https3.png%3Ftable%3Dblock%26id%3Dfbef30b2-ff28-4331-8aed-2f19e96b1f40%26cache%3Dv2&w=3840&q=75)
레코드 영역 생성 버튼을 누르면 아마 위와 같이 나올텐데, 현재 저는 레코드를 생성했기 때문에 검증 상태가 성공으로 나옵니다.
만약 proctormatic.co.kr과 *.proctormatic.co.kr이 둘 다 나오지 않는다면 문제가 발생한 것이니 돌아가 다시 2개의 도메인을 추가하여 인증서를 생성해주시기 바랍니다.
DNS 레코드를 생성하고 나서, Route 53으로 돌아가면 레코드가 생성되있는 것을 볼 수 있습니다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252F775107c8-a402-4e35-a74a-31986d175ec6%252Froute53_https4.png%3Ftable%3Dblock%26id%3Dd2fd4090-bcaf-411c-a2a8-5e95415766e5%26cache%3Dv2&w=3840&q=75)
유형의 CNAME이 ACM SSL 인증서가 도메인에 적용 됐습니다.
Application Load Balancer(ALB)
- 로드 밸런서(Application Load Balancer) 생성
- 맨 첫번째 화면이 위와 같이 나오는데 balancer name을 입력하고
- Scheme는 Internet-facing으로 합니다. (이유는 모름 다 이렇게함)
- IP address type은 IPv4 (이유 모름 위와 같음)
- VPC는 설정하지 않으면 Default입니다.
- Mappings는 사용할 가용영역을 선택해 줍니다. 한국 리전은 보통 az-a와 az-c를 사용합니다.
EC2에 접속해서, 아래로 내려보면 로드 밸런싱이란 카테고리가 존재합니다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252F438c60ff-2eb1-494a-862f-115ad9380d75%252FUntitled.png%3Ftable%3Dblock%26id%3D5264b771-3e14-4346-a6cc-78439813c03f%26cache%3Dv2&w=3840&q=75)
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252F9e74359c-23f4-4a5c-9bc5-4d7502e06a77%252FUntitled.png%3Ftable%3Dblock%26id%3D32d11c87-a5fa-4d56-a2c6-47b5f3d5ad5f%26cache%3Dv2&w=3840&q=75)
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252F16310c68-4b99-4105-ab32-76413f31e5ed%252FUntitled.png%3Ftable%3Dblock%26id%3Dd84823f4-7af3-473b-a45c-bdd57fff1eaa%26cache%3Dv2&w=3840&q=75)
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252F2c27b869-b2a6-4566-b341-3f9e90fece92%252FUntitled.png%3Ftable%3Dblock%26id%3D62de0b04-9ac7-4d92-8343-2d45e6c1217e%26cache%3Dv2&w=3840&q=75)
그 다음 칸을 보면 Network mapping이 나타나는데,
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252Fbb356922-564c-4922-8d16-27d9383c4469%252FUntitled.png%3Ftable%3Dblock%26id%3D81b887e9-8317-46ad-9c86-c9ca4b792e32%26cache%3Dv2&w=3840&q=75)
보안그룹은 현재 EC2 인스턴스에서 사용하고 있는 보안그룹을 입력해 줍니다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252F1532d2d0-69b2-479a-9df9-4ece3321f524%252FUntitled.png%3Ftable%3Dblock%26id%3D4f542682-6d8a-4adc-97fa-bd36e5df0269%26cache%3Dv2&w=3840&q=75)
Listners and routing에서 Add listner를 클릭하고 HTTPS를 추가해줍니다. 여기서 Add listner tag를 HTTPS로 추가해주지 않는다면, !!!ACM 설정하는 부분이 생기지 않습니다.
Protocol의 토글을 누르면 HTTP와 HTTPS를 선택할 수 있는데 이 중 HTTPS를 선택하고
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252F61909665-cbd9-4198-98c4-8b9e4ef27be3%252FUntitled.png%3Ftable%3Dblock%26id%3Df9de2511-5722-4184-b848-6f758674f8f6%26cache%3Dv2&w=3840&q=75)
이제 여기까지 왔다면, 대상 그룹을 생성해야 합니다. 위쪽의 빨간 박스입니다. 대상그룹은 Listeners and routing의 대상이 될 그룹을 지정합니다.
create target group
을 클릭하고- 대상 그룹(Target Group) 생성
- Target group name을 지정하고
- Protocol은 HTTP : 80으로 선택합니다.
- 그 아래에 Protocol version도 있는데, HTTP1을 보편적으로 사용한다고 합니다.
- Health checks는 사실상 Options인데, 일단은 건드리지 않고 넘어갑니다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252Fb211321d-ad1b-4ae7-a738-71264577af01%252FUntitled.png%3Ftable%3Dblock%26id%3Daf0e722a-d9ff-43e2-b9e9-694ddb2b7cf3%26cache%3Dv2&w=3840&q=75)
EC2 Instance를 사용할 것이기 때문에,
Instances
를 클릭합니다.여기까지 했다면 Next를 클릭합니다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252Fe50a2960-ed99-4505-83f0-0634fdf103da%252Ftarget_https1.png%3Ftable%3Dblock%26id%3D38e0f8b4-ff0e-4d06-b758-d5769459b76f%26cache%3Dv2&w=3840&q=75)
그러면 위와 같이 등록할 수 있는, targets들이 주르륵 나오는데 이중에서 사용할 EC2를 고르고
아래에 Include as pending below를 클릭합니다. 클릭하고 나면 아래에
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252Fdbd9b08d-8fd4-4272-8cbc-c332d7695bdf%252Ftarget_https2.png%3Ftable%3Dblock%26id%3D9c9e5a7f-f9b5-4a94-bfba-7523f0bba3b6%26cache%3Dv2&w=3840&q=75)
내가 입력한 타겟이 등록되고, 등록이 끝났다면 우측 하단에
Create taget group
을 클릭합니다.- 로드 밸런서에 타겟 그룹 적용
- Security policy는 그냥 건드리지 않습니다.
- Default SSL/TLS certificate는 From ACM을 그대로 두시고, 오른쪽의 토글을 입력하면 2번에서 인요청한 ACM 인증서를 입력합니다.
대상그룹이 생성됐다면 위에서 생성한 로드밸런서 Default action의 Forward to에서 대상그룹을 선택합니다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252F9eb37a36-0c19-424c-b85f-24fa523bd823%252Flb_https1.png%3Ftable%3Dblock%26id%3Decc300d9-d1f1-4242-ae3d-2cadd85dfc9c%26cache%3Dv2&w=3840&q=75)
보통 사용하지 않는 대상그룹만 사용할 수 있게 클릭되기 때문에 일단 사용가능한 대상그룹만을 지정해놨습니다. 실제에선 사용할 대상그룹을 선택하시면 됩니다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252Fa4ecfe02-2850-4c40-b60f-25e4e0e1b172%252Flb_https2.png%3Ftable%3Dblock%26id%3D1b945ab8-70b0-477d-96dd-e1f864fd0c34%26cache%3Dv2&w=3840&q=75)
이제 Listeners and routing에서 HTTPS를 선택했을 때 고를 수 있는 옵션인 Secure listener settings를 보면,
여기까지 왔다면, 이제 우측 하단의 Create load balncer를 클릭해 로드 밸런서를 생성합니다.
- 로드 밸런서 Listener Redirect
이제 생성된 로드 밸런서의 리스너를 편집해야 합니다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252Fd3b1270d-d151-4227-96d6-10cdc4339a1f%252Flb_https3.png%3Ftable%3Dblock%26id%3D7b1f2f28-9974-4637-85dd-c413bc985853%26cache%3Dv2&w=3840&q=75)
편집을 클릭하면 위와 같이 뜰 탠데, Remove를 눌러서 제거해주시고
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252Feb481745-f556-4c86-be15-84d986174264%252Flb_https5.png%3Ftable%3Dblock%26id%3D26ca4ec7-94ff-4ce3-bdd4-ef1501354f3c%26cache%3Dv2&w=3840&q=75)
Remove를 누르면 중앙에 나오는 Add Actions버튼을 클릭해 Redirect를 눌러주시고,
HTTPS : 443을 입력해주고 Original host, path, query로 선택해줍니다. Status code는 301입니다.
Route53과 ALB 연결
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252F30ee6e41-a009-4a56-aedc-19a76f1c3827%252Froute53_alb_https1.png%3Ftable%3Dblock%26id%3Da633a648-ef62-4ff5-a283-d95ba542ee3c%26cache%3Dv2&w=3840&q=75)
이제 Route 53으로 돌아와
- 서브도메인없이 그냥 원형을 유지해서 생성하고
- 그 아래의 별칭을 클릭합니다.
- 라우팅 대상은 Application/Clssic Load Balancer에 대한 별칭을 클릭하고
- 내가 만든 Region
- 그리고 내가 생성한 Load Balancer를 선택해 줍니다.
- 그리고 레코드 생성!
위와 같은 방법을 이름만 바꿔서 다시 한 번 똑같이 레코드를 생성해 줍니다. 이름은 서브도메인을 포함해야하기 때문에
*.example.com
레코드 생성까지 끝났다면,![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252Fb896c313-1260-4820-a429-e62c2941fe51%252Froute53_lb_https2.png%3Ftable%3Dblock%26id%3D99941cc7-06ea-4f0a-bc80-acc1ba496ca1%26cache%3Dv2&w=3840&q=75)
이제 이런식으로 나오게 되는데,
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