Search

AWS EC2 SSL (Route53 + ACM + ALB)

카테고리
Dev-Ops
태그
AWS
게시일
2023/11/24
수정일
2024/02/27 04:08
시리즈
AWS-Study
1 more property

1. 개요

프로젝트를 하면서 운영계 배포 과정 중 SSL 연동 부분에 대한 고민이 들었습니다. AWS 외의 다른 VPS를 사용할 때에는 주로 letsencrypt, certbot을 자주 이용하였습니다. 이번 프로젝트를 런칭하는 과정에서 AWS를 통해 서비스하기 때문에 certbot 등을 이용하지 않고 Route53과 여러 서비를 연동하여 배포해보는 경험을 해보고 싶었습니다. 배포 과정에서 사용하는 서비스 목록은 다음과 같습니다.
Route53
ACM(AWS Certificate Manager)
ALB(Application Load Balancer)

Route53

Amazon Route 53는 가용성과 확장성이 뛰어난 DNS(도메인 이름 시스템) 웹 서비스입니다. Route 53을 사용하여 세 가지 주요 기능, 즉 도메인 등록, DNS 라우팅, 상태 확인을 조합하여 실행할 수 있습니다.

ACM(AWS Certificate Manager)

AWS Certificate Manager(ACM)는 AWS 웹 사이트와 애플리케이션을 보호하는 퍼블릭 및 프라이빗 SSL/TLS X.509 인증서와 키를 만들고, 저장하고, 갱신하는 복잡성을 처리합니다. ACM에서 직접 발급하거나 서드 파티 인증서를 ACM 관리 시스템으로 가져오는 방법으로 통합 AWS 서비스에 대한 인증서를 제공할 수 있습니다.

ALB(Application Load Balancer)

Application Load Balancer는 개방형 시스템 간 상호 연결(OSI) 모델의 일곱 번째 계층인 애플리케이션 계층에서 작동합니다. 로드 밸런서는 요청을 받으면 우선 순위에 따라 리스너 규칙을 평가하여 적용할 규칙을 결정한 다음, 규칙 작업의 대상 그룹에서 대상을 선택합니다. 애플리케이션 트래픽의 콘텐츠를 기반으로 다른 대상 그룹에 요청을 라우팅하도록 리스너 규칙을 구성할 수 있습니다.

2. 도메인 구매

도메인의 경우 AWS 내에서 혹은 외부 서비스를 이용하여 결제가 가능합니다. SSL 설정하기 앞서 먼저 도메인을 구매해야 합니다.

AWS Route53 - register domains

Domain companies

저는 주로 hosting.krgabia.com 을 이용하여 도메인을 구매하고 관리하고 있습니다.

3. Route53 설정

위 과정에서 구매한 도메인을 Route53에서 호스팅하기 위한 과정입니다.

Route53 → Hosted zones

Route53으로 들어가서 Hosted zones(호스팅 영역) 탭에 들어갑니다.
아래의 탭에서 Create hosted zone을 선택합니다.
위와 같이 설정해주게 되면 Records 값이 나타나게 되는데, 이때 NS Type의 Record를 확인하게 되면 네임서버 세팅을 위한 Value/Traffic 라우팅 대상 4개의 값을 확인할 수 있습니다.

Name server settings

해당 값을 이용하여 네임서버를 수정해주도록 합니다.
대략 30분 정도가 지나게 되면 nslookup으로 네임서버가 변경된 것을 확인할 수 있습니다.

4. ACM(AWS Certificate Manager) 설정

도메인을 AWS의 Nameserver에 연동되었다면, 인증서를 생성해야 합니다.
이후 완전히 정규화된 도메인 이름을 작성하고, Key algorithm을 선택합니다.
세팅을 완료하게 되면 아래와 같이 Pending validation(검증 대기 중)형태로 됩니다. 아래와 같이 인증서 요청을 마무리하였으면 다시 Route 53으로 들어가 추가로 세팅을 해주어야 합니다.

Route 53 - hosted zones CNAME 연결

AWS Certificate Manager > Certificates 로 들어가 Certificate ID를 선택합니다.
이후 Create record in Route 53 을 클릭하여 Pending validation 된 Route 53의 DNS 레코드를 선택합니다.

ACM - Certificates 확인

설정 완료 후 아래와 같이 인증서 상태가 Issued(발행) 상태가 되면, 외부에서 도메인 연결이 가능한 상태로 됩니다.

Application Load Balancer 생성

ACM 설정이 완료되었다면 Record 추가 시 Alias에서 추가해주기 위해 Load Balancer를 생성해주어야 합니다. 이를 위해 EC2 > Load balancers 로 들어가 생성해주도록 합니다.
이때 Application Load Balancer를 선택해줍니다.
기본 세팅부터 차근차근 선택해줍니다.
Security Group은 나중에 수정해주도록 하고, Default로 설정합니다. 이후 Listners를 추가해주어야 하는데 다음과 같이 Add listener > HTTPS 선택 > Create target group을 선택하여 타겟 그룹도 생성해줍니다.

Create Target Group

먼저 기본 설정으로 Instances 를 선택해줍니다.
이후 이름을 정해주고 전달할 곳의 포트와 VPC를 설정해줍니다. 이는 로드밸런서가 HTTPS로 받았을 때 해당 EC2 Instance의 어떤 프로토콜로 전달해줄지 결정하는 작업입니다.
마지막으로 Target instance만 선택해서 Taget group 생성을 마무리해줍니다.
이제 다시 ALB 생성 탭으로 돌아와 listener를 선택하고, Certificate Source를 선택해줍니다. Certificate(인증서)는 ACM을 통해 연결해주기 때문에 ACM을 선택해줍니다.

5. Record 생성 & SSL 연결 확인

ACM과 Route53을 통해 인증서 세팅이 완료되었으면, 이제 SSL 연결 후 https로 잘 전달되는지 확인이 필요합니다. 간단히 Nginx 세팅과 Python http.server를 통해 확인해보면 다음과 같이 가능합니다.

Record 생성

Security Group 생성 및 설정

Application Load Balancer security group & Set

EC2 Instance Security Group(Inbound) & Set

SSL 연결 확인

현재 세팅은 다음과 같습니다. 도메인으로 연결할 때 Route53을 통과하여 AWS Certificate Manager를 통해 ALB로 들어오게 됩니다. 예를 들면, https://api.0x10.kr 를 입력하여 들어올 수 있습니다. 이때 ALB는 HTTP, HTTPS 포트만 받게되고, 이렇게 받은 요청을 EC2 Instance로 전달합니다. 이때 EC2 Instance는 ALB를 통해 전달된 http 요청을 받아 내부에서 처리 후 응답하게 됩니다.

HTTPS 접근

SSH로 접속하여 다음과 같이 임시 파일을 생성해두고, python 모듈로 http server를 실행해줍니다.
python3 -m http.server 80
Plain Text
복사

HTTP로 접속시

먄약 예시로 http://[domain_address] 로 접근하게 되면 HTTP접근이 불가능한 것을 확인할 수 있습니다. 이는 ALB security group에서 HTTP 포트를 열어주지 않았기 때문입니다. 만약 포트를 오픈하게 되면 외부에서 HTTP로도 접근이 가능합니다. 때문에 다음과 같은 작업을 추가로 해주고 HTTP 포트를 열어보도록 합시다.
위 작업을 마무리 하고 ALB에 설저된 Security Group에 HTTP 0.0.0.0/0을 추가해주도록 하면 HTTP에서 자동으로 HTTPS로 리다이렉트 됨을 알 수 있습니다.

Reference