aws https 서버 구축하기 EC2, ELB, ACM, Route53
INTRO
EC2에서 운영하고 있는 서버에 https를 적용하기 위해서는 두 가지 방법이 있다.
1) EC2 내부에 SSL인증서를 설치하고 서비스하는 방법 (일반적인 기존 방식)
2) AWS에서 제공하는 인증서 관리 서비스인 ACM(AWS Certificate Manager)을 ACM 통합서비스와 연동하여 적용하는 방법 (참고 : ACM이란? https://docs.aws.amazon.com/ko_kr/acm/latest/userguide/acm-overview.html)
1) 의 방법은 기존 개발방식에서 적용했던 일반적인 방식이다. 유료 인증서나, Let's Encrypt같은 무료 인증서를 적용해서 운영가능하다. 인증서의 경우 까다로운 것이 인증서 유효기간마다 갱신해주야 한다는 것이다. (Let's Encrype의 경우 3개월 주기) 리눅스에서 crontab으로 주기적으로 갱신해주도록 한번 테스트용으로 해놓아봤는데, 갱싱될 때 무슨 이슈가 발생하는지 한번 지켜봐야 한다.
2) 의 방법은 AWS에서 제공하는 인증서 관리 서비스로 갱신에 대한 신경을 개발자가 쓸 필요가 없다. 유효기간은 13개월이며, ACM 통합서비스와 연동해서 쓰면 무료이다. ACM 통합서비스라 함은 AWS의 ELB, CloudFront, API Gateway 등의 서비스이다.
(이 부분에 나 같은 경우 오해가 있었음. ACM 통합서비스를 제외한 서비스에는 그럼 유료 요금을 내고 인증서 적용할 수 있는건가 의문이 들었으나, ACM 통합서비스라고 칭하고 있는 서비스에만 ACM을 연동할 수 있다는 뜻이었다.) ACM 통합서비스 목록은 여기 참고 https://docs.aws.amazon.com/ko_kr/acm/latest/userguide/acm-services.html
2)의 방법으로 구축하기 위해 운영하고 있는 EC2의 웹서버에 https를 적용하기 위해 다음과 같이 진행한다.
(서비스할 도메인이 있고, 그 도메인이 Route53에 등록되어있다는 전재하에 설명 진행)
1) ACM 인증서 발급
2) ELB 생성 및 ACM 인증서 연결, 대상 EC2 연결
3) Route53의 도메인과 ELB의 인스턴스 DNS 연결
4) 추가적인 내용 & 설정
과정
1. ACM 인증서 발급
- Certificate Manager 서비스에서 인증서 요청 클릭 후 발급한 도메인을 기입하고,
※ example.com는 *.example.com로 발급한 인증서에 포함되지 않는다. (참고 https://stackoverflow.com/questions/37520110/aws-acm-wildcard-ssl-certificate-not-working-on-domain)
따라서 두개의 별도 인증서를 발급하거나 "이 인증서에 다른 이름 추가"를 통해 추가해서 발급해야 한다. 두개의 별도 인증서를 ELB에 설정하는 경우 인증서를 여러 번 검증하는 것이 이슈가 될수도 있으니 같은 인증서에 이름을 추가하는 방법이 더 낫겟다.
- 다음 단계 인증서 발급 인증하는 방법에는 DNS인증, 이메일 인증이 있다. AWS의 route53을 이용하는 경우나, 이메일 인증 선택시 이메일 목록에 사용가능한 이메일이 없는 경우에는 DNS 인증을 이용하고, 다른 플랫폼에 도메인을 등록하고 사용 중인 경우에는 이메일 인증으로 하면된다.
- DNS 인증을 예시로 하면 "Route53에서 레코드 생성" 버튼을 누르고 잠시 후에 검토 과정이 성공으로 바뀌면 정상적으로 발급이 된 것이다.
2. ELB 생성 및 ACM 인증서 연결, 대상 EC2 연결
ELB는 EC2 서비스 메뉴에서 찾을 수 있다.
"EC2>로드 밸런싱>로드밸런서>로드밸런서 생성>Application Load Balancer 생성" 으로 생성 절차를 시작한다.
1) 1단계 로드밸런서 구성에서는 '리스너', '가용영역'에 대해 설정해준다.
- 리스너 : 로드밸런서가 받아들이는 포트를 설정한다. http는 기본으로 추가 되어있고, https 443 포트를 리스너 추가해주면 된다.
- 가용영역은 aws에서 제공하는 vpc와 subnet의 대한 개념을 좀 알 필요가 있어서 다른 글에서 부연설명 하겠다.
2) 2단계 보안설정 구성에서 ACM으로 발급한 인증서를 dropdown 메뉴에서 선택해주면 된다. 보안정책은 따로 건들이지 않았음. (나중에 편집 혹은 추가가 가능하다)
3) 3단계 보안 그룹 구성에서는 EC2 보안그룹 구성을 해봤으면 알 것이다. ALB에 인바운드/아웃바운드 허용할 포트들을 설정해주면 된다. (나중에 편집 혹은 추가가 가능하다)
4) 4단계 라우팅 구성은 ALB가 연결되는 '대상그룹'을 설정하는 부분이다. EC2 인스턴스를 연결하는 것이므로 인스턴스를 선택하고 ALB가 EC2와 통신할 프로토콜과 포트번호를 설정한다. (나중에 EC2>로드밸런싱>대상그룹 메뉴에서 편집 혹은 추가가 가능하다)
5) 5단계 대상 등록 : 마지막으로 실질적인 대상을 등록한다. 현재 운영중인 인스턴스 중 선택한 후 등록된 항목에 추가 버튼을 누르면 된다. (4단계에서 선택했던 포트번호가 표시된다. 이 포트 번호를 바꾸고 싶다면 4단계에서 수정해야 한다.)
3. Route53의 도메인과 ELB의 인스턴스 DNS 연결
도메인은 Route53에 등록해두었다는 전제하에 설명한다. 이용할 도메인의 호스팅 영역에 들어가서 레코드 세트를 생성/편집해주면 된다.
유형 : A-IPv4주소
별칭 : YES 선택 후 별칭 대상 입력 창에 포커스를 주면 자동완성에 ELB Application Load Balancer 목록에 이전에 생성한 ALB의 DNS 이름이 있을 것이다. 선택하고 레코드 세트 생성/편집 버튼을 누르면 연결 끝
4. 추가적인 내용 & 설정
1) 80 포트 http의 접속도 443포트로 리디렉션 하도록 설정
EC2>로드밸런싱>로드밸런서에서 해당 로드밸런서를 선택한 후 하단에 '리스너 탭'으로 이동한다.
위 ALB 설정시 추가했던 리스너가 표로 있을 것이다. 여기서 80포트의 규칙 부분의 규칙 보기/편집 버튼을 눌러 설정해줄 수 있다.
- 이동한 규칙 편집/보기 페이지의 상단 편집 버튼을 누른 후 기존 기본 규칙을 삭제
- 작업 추가> 리디렉션 대상 >HTTPS, 443 포트 입력 후 저장 및 업데이트를 하면 된다.
2) 인증서를 수정 및 추가하려는 경우
1번과 같이 리스너 탭에서 443포트 의 SSL 인증서 보기/편집 버튼을 통해 수정 가능하다.
ELB에서는 여러 인증서를 설정할 수 있고, 이 중에서 기본 인증서를 설정해야한다. 여기서 인증서를 추가할 수도 있고, 기본 인증서를 바꿀 수도 있다.
* example.com, *.example.com 두개의 인증서를 사용하고, nginx에서 example.com으로 리디렉트하는 로직이 있는 상태로 기본 인증서는 example.com을 사용했는데, 실제로 www.example.com으로 접속하면 유효하지 않은 인증서를 사용한 요청 이슈가 중간에 발생하는 것을 확인했다. 기본 인증서를 *.example.com으로 수정해 해결은 되었지만, 앞에서 ACM의 인증서 발급시 같은 인증서에 이름을 추가하는 방법으로 생성하는 것이 좋을 것 같다.