군붕이의 메모장

AWC ACM + ELB(ALB)를 사용하여 EC2에 HTTPS 적용하기 본문

클라우드/AWS

AWC ACM + ELB(ALB)를 사용하여 EC2에 HTTPS 적용하기

초보군붕이 2023. 4. 20. 11:29
반응형

지난번 CloudFront를 사용하면서 클라이언트를 배포하면서 HTTPS를 적용했다.

https://iamiet.tistory.com/entry/AWS%EC%97%90-React-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0-3-CloudFront-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0

 

AWS에 React 배포하기 - 3, CloudFront 배포하기

이전글 : https://iamiet.tistory.com/entry/AWS%EC%97%90-React-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0-2-Route53-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%97%B0%EA%B2%B0-%EB%B0%8F-SSL-%EC%9D%B8%EC%A6%9D%EC%84%9C-%EB%B0%9C%EA%B8%89 AWS에 React 배포하기 - 2, Route5

iamiet.tistory.com

 

HTTPS를 적용한 클라이언트와 통신할경우 서버측에도 HTTPS 적용이 필요하다.

 

 

● Route53에 도메인 등록

우선 서버에서는 api.hdev.site 라는 URL을 사용할 예정이다.

Route53에서 api.hdev.site라는 레코드를 등록해주면 된다.

레코드 생성

마찬가지로 도메인을 구입한 호스팅업체 네임서버에 들어가서 레코드주소를 등록해줘야 한다.

 

가비아 네임서버 목록

hdev.site, api.hdev.site 총 2개의 도메인에 대해 총 8개의 네임서버, 8차까지 등록된다고 생각하면 된다.

 

 

 

● ACM 인증서 재발급

기존 클라이언트에선 hdev.site라는 도메인에 https 적용을 위해서 하나의 도메인에 대해서만 발급했다.

하지만 hdev.site와 api.hdev.site는 서브도메인이 다르기때문에 다른 도메인으로 취급된다.

하나의 ACM으로 위 2개의 도메인에 https 적용할려면 ACM 인증서를 다시 발급받아야 한다.

 

ACM 요청화면

마찬가지로 AWS 서비스 내에서 사용할 예정이므로 퍼블릭인증서로 발급받으면 된다.

도메인 이름에는 사용하고자 하는 2개의 도메인 이름을 적어준다.

 

도메인 레코드 생성

이전과 마찬가지로 도메인 레코드 생성에서 hdev.site와 api.hdev.site 2개의 레코드를 생성해주면 CNAME 레코드가 생성되고 30분정도 기다리고나면 인증이 성공되어 정상적으로 사용이 가능해진다.

 

 

● Target Group 생성하기

Target Group은 EC2에 들어가면 좌측 메뉴바에 하단에서 찾을수 있다. 

대상그룹 위치

 

우선 기본설정에서는 타겟의 타입 설정이 가능하다

Instances, IP Address 등 다양한 타겟이 존재하는데 현재 구성에서는 EC2에서 포워딩해서 서버측 어플리케이션에 HTTPS를 적용할 예정으로 Instances를 선택해준다.

 

그리고 Target group name은 대상그룹의 이름을 설정해준다.

 

프로토콜의 경우 이번 프로젝트의 경우 서버측 EC2에서 5000번 포트에서 동작한다.

HTTPS 5000번으로 요청이 들어오면 HTTP 5000번 포트로 포워딩이 되도록 HTTP : 5000으로 설정해준다.

 

Health checks의 경우 서버가 정상적으로 동작하는지 요청을 보내서 확인하는 기능이다.

나의 어플리케이션의 경우 api.hdev.site:5000/ 으로 요청을 날리면 HTTP 200을 반환하도록 설정을 해놨다.

대상그룹 - 헬스체크

import { Controller, Get } from '@nestjs/common';

@Controller()
export class AppController {
  @Get('/')
  ping() {
    return 'health check success';
  }
}

 

다음을 누르면 Register targets로 이동하게 된다. Available instances에서 유효한 인스턴스를 누르고 아래 Include as pending below를 눌러준다.

대상그룹 - 타겟 생성

 

Review targets를 확인해보면 생성한 타겟을 확인할 수 있다. Create target group을 눌러서 대상그룹을 생성해준다.

 

 

● ELB(ALB) 설정하기

AWS에서는 ACM에서 발급받은 SSL인증서를 통해서 간단하게 HTTPS 설정이 가능하다.

ELB는 Elastic Load Balancer의 약자로 간단하게는 부하분산에 사용되는 서비스이다.

그 중에서도 ALB(Application Load Balancer)를 사용해서 HTTPS를 적용할려고 한다.

 

ALB는 OSI 7계층 중 L7 계층에서 동작하는 서비스이다.

 

우선 로드밸런서는 EC2에 들어가면 좌측 메뉴바에 하단에서 찾을수 있다. 

로드밸런서 위치

 

로드밸런서에 들어가서 우측에서 Create Load Balancer를 누르면 아래와 같이 화면이 나오는데, ALB를 사용해서 설정할 예정이므로 ALB에서 Create를 눌러준다.

 

로드밸런서 타입 설정

 

우선 기본 설정 화면이다. Load Balancer name은 로드밸런서의 이름이다. 원하는대로 지정해주면 된다.

 

Scheme에는 2가지 선택이 가능하다.

  • Internet-facing : 외부에서 유입되는 트래픽을 처리
  • Internal : 사설 구역에서 유입되는 트래픽을 처리

사설 구역이 아닌 외부에서 들어오는 트래픽을 처리하기 위해서 Internet-facing을 체크해준다.

 

IP address type은 IP 주소의 타입을 설정한다. Dualstack의 경우 IPv4, IPv6을 모두 사용한다.

우선 나의 프로젝트에서는 IPv4만 사용해서 진행할 예정이므로 IPv4를 설정해줬다.

ALB - 기본설정

 

네트워크 매핑 설정 화면이다. 별도의 VPC를 생성한게 아니라면 기본 VPC를 사용해준다.

 

그리고 Mappings의 경우 가용영역을 설정해준다. 기본적으로 트래픽이 분산되기에 EC2가 여러대 있으면 해당 영역에 분산이 가능하다.

 

기존 EC2에는 ap-northeast-2c 영역에 존재한다. AWS에서는 최소 2개 이상의 가용영역을 설정하는것을 추천한다.

ALB - 네트워크 매핑

 

 

보안그룹같은 경우도 마찬가지로 별도로 생성한게 없으면 기본값으로 설정해준다.

보안그룹에서는 서버에서 사용할 인바운드 포트를 오픈해줘야하니 참고하면 좋다.

ALB - 보안그룹

 

리스너와 라우팅을 설정하는 부분이다. 

 

HTTPS 5000번 포트로 요청이 들어오게되면 HTTP 5000번 포트로 포워딩 되도록 설정해준다.

기존에 만들 타겟그룹을 설정해주면 된다.

ALB - 리스너, 라우팅

 

 

보안된 리스너를 설정하는 부분이다.

기존 ACM에서 발급한 SSL 인증서를 선택해주면 된다.

ALB - 보안된 리스너

 

 

● ELB(ALB) Listener Rules 설정

생성된 로드밸런서를 들어가면 하단 Listener에서 생성한 Listener 목록 확인이 가능하다.

ALB - 리스너 목록

 

 

등록된 리스너를 들어가면 Rules에서 Manage Rules를 눌러서 규칙 설정이 가능하다.

ALB - 리스너 규칙 설정

 

상단에 추가버튼을 누르고 IF, THEN에 해당하는 항목을 추가하면 된다.

 

IF에는 호스트헤더로 api.hdev.site로 접근하는경우 라는 규칙을 지정해준다.

THEN에는 IF라는 규칙에 정의된 리스너로 접근이 되면 전달대상으로 기존에 생성했던 타겟그룹을 설정해준다.

 

이로서 https://api.hdev.site:5000로 접근하면 EC2의 HTTP 5000번 포트로 접근되도록 리스너의 규칙을 설정해줬다.

ALB - 리스너 규칙 생성

 

 

● 대상 그룹 체크사항

대상그룹에 들어가면 하단에서 Registerd Targets에서 등록한 인스턴스 확인이 가능하다.

대상그룹

 

만약 Health status에 Unhealthy 또는 Unused가 발생할 경우 HTTP 502 에러가 발생하니 잘못된 설정을 하지않도록 주의해야 한다.

 

 

● Route53에 ALB 레코드 매핑

CloudFront와 동일하게 ALB를 생성하고나면 URL이 발급되는데 이를 Route53 레코드에 매핑해서 구입한 사설 도메인으로 접속이 가능하도록 설정해줘야 한다.

Route53 레코드 생성

 

api.hdev.site 호스팅영역에 레코드를 생성해주는데 별칭으로 등록하면 된다.

A/CLB에 대한 별칭을 설정해주고, 해당 로드밸런서가 생성된 region을 선택해준다.

그러면 아래 항목이 표시되는데 해당하는 로드밸런서를 누르고 레코드를 생성해주면 된다.

 

등록된 레코드가 DNS서버에 전파될때까지 약 1~2분정도 걸리니 조금 기달렸다가 테스트를 해보면 된다.

 

 

● HTTPS 적용됬는지 확인하기

이제 실제 적용한 https://api.hdev.site:5000에 접속해보면 https가 잘 적용됬는지 확인할 수 있다.

 

HTTPS 적용결과
인증서 상세정보

 

https가 잘 적용된 모습이다.

 

 

● 구성도

AWS Infra 구성도

 

반응형