본문으로 바로가기
글에 첨부된 이미지중 글씨가 작게보이는 이미지도 있습니다. 그럴때는 이미지를 클릭해서 확대해주세요.

시작하기 전에

이번 글에서는 AWS 클라우드 컴퓨팅 플랫폼에서 SSL 인증서를 생성하고 이를 적용하는 방법에 대해서 기술하고자 한다. 글을 읽기전에 미리 알리지만 이 글에서는 이미 네임서버가 연결된 도메인과 보안그룹이 적용되 운영중인 EC2 인스턴스가 있다는 가정하에 있다는것을 염두하면 좋을것 같다.

 

해당 AWS 환경은 필자가 먼저 구축하고 사용중인 Apache 웹서버를 기준으로 작성되었으며 해당 환경에서 이렇게 설정했을때 정상적으로 작동했다라는것을 써놓은것에 불가하다. 각각의 환경마다 적합한 설정은 모두 다르기때문에 모든 환경에서 내가 사용한 설정대로 적용했을때  반드시 정상적으로 작동하지 않을수 있다는점을 알린다.

목차

  1. SSL 인증서 발급
  2. 로드밸런서 등록, 대상 그룹 적용
  3. Route53 도메인, 로드벨런서 적용
  4. Http에서 Https로 전달

1. SSL 인증서 발급

먼저 인증서 발급을 위해 Certificate Manager으로 이동한다 위에서도 언급했지만 이 단계를 시작하기 전에 먼저 자기소유의 도메인이 있어야하며 Route53의 네임서버가 모두 적용되어있어만 한다. 이 페이지는 생성된 인증서를 확인할 수 있는 페이지다. 좌측 상단의 인증서 생성 버튼을 클릭한다.

공인 인증서 요청을 선택하고 인증서 요청을 클릭한다

그러면 총 다섯단계로 이루어진 과정이 나오는데 도메인 이름 추가 단계에서는 메인도메인과 서브도메인을 추가할 수 있다. 처음에는 한개의 입력창만 있을텐데 여기에 도메인 전문을 입력해준다. 편의상 example.com이라고 정의하겠다. 그다음 이 인증서의 다른이름 추가를 클릭한다. 그러면 기존 입력창 하단에 입력창이 하나 더 생기는데 여기에는 *.example.com이라고 입력한다. 여기서 별표가 굉장히 중요한데 이렇게 입력하면 www.example.com,  admin.example.com등의 서브 도메인을 전부 사용할 수 있게 된다. 이후 다음을 클릭한다.

DNS 인증을 선택하고 다음을 클릭한다

태그는 인증서의 용도를 이름을 보고 파악하는 용도로 사용된다. 태그이름을 Name(첫글자 대문자)로 입력해주고 값에는 원하는 이름을 입력해준다. 이때 한글보다는 영어를 사용하는편이 좋고 공백대신 하이픈을 사용하는게 더 낫다. 이후 다음을 클릭한다

검토 단계에서는 지금까지 선택한 사항들을 확인할 수 있다. 모두 입력한대로면 확인 및 요청을 클릭한다

그러면 이미지와 같은 화면이 나오는데 도메인 이름 추가 단계에서 입력한 도메인을 DNS 인증이 성공했는지 보여주는 단계이다. 도메인 인증이 모두 성공했으면 완료를 클릭한다.

그러면 처음의 화면으로 돌아오게 되는데 목록 상단의 빨간색 블록표시된게 현재 생성된 SSL 인증서이다.

2. 로드밸런서 등록, 대상 그룹 적용

EC2의 로드 밸런싱에서 로드밸런서 페이지로 이동해준다. 이 페이지에서 로드밸런서를 만들어줄 수 있는데 로드 밸런싱에 대해 간단히 설명하자면 원래는 하나의 도메인으로 들어오는 트래픽을 하나의 인스턴스가 아닌 여러 인스턴스에 나누어주는 용도로 사용한다. 아무리 성능이 높게 책정된 인스턴스라고 해도 단일 컴퓨팅만으로는 모든 트래픽을 처리할 수 없는 상황이 생기게 되는데 이때 똑같은 환경의 인스턴스를 하나 더 만들어 웹사이트의 서버를 두개로 나누고 서버에 접근하는 사용자들을 이 두개의 인스턴스에 나누어 연결시켜 서버 부하를 줄이는것이 로드 밸런싱이다.

 

그러나 우리의 목표는 SSL가 적용된 Https 웹사이트를 구축하는 것이니 이는 제하고 진행하도록 하겠다. 로드 밸런싱의 기능은 로드밸런서와 대상 그룹이 있는데 로드밸런서 생성과정에서 아까 생성한 SSL 인증서를 요구한다. 상단의 Load Balancer 생성을 클릭하도록 하겠다

우리가 구축하고자 하는것은 Https 웹사이트이기 때문에 첫번째에 있는 Application Load Balancer를 사용하도록 해주겠다. 해당 유형으로 생성을 클릭한다

해당 단계에서는 기본적인 구성과 리스너, 가용영역을 선택할 수 있다.

  • 기본 구성의 경우 이름만 원하는대로 입력하고 다른건 건들지 않는다.
  • 리스너의 경우 HTTP(80)이 기본으로 설정되어있는데 하단의 리스너 추가를 클릭, HTTPS를 선택하고 포트에 443을 입력한다.
  • 가용영역은 vpc는 하나만 있다면 아마 ec2와 같은 vpc로 이미 선택되어있을것이다. 이제 가용영역을 선택해야 하는데 이때 중요한것이 ec2 인스턴스의 가용영역이 포함되도록 모두 선택해야만 한다. 필자가 조언을 얻었던 글들의 경우 두개만 선택하는 경우도 있었는데 이 경우 라우팅이 제대로 작동되지 않았다. 실험해본 결과 모든 가용영역을 선택하더라도 문제는 없으니 전부 선택해주어도 된다.

보안 설정 구성 단계에서는 생성한 SSL 인증서를 선택할 수 있게된다. 만들어놓은 인증서를 선택하고 다른건 건드리지 않고 다음을 클릭한다

보안 그룹 구성 단계에서는 로드밸런서에 적용될 보안그룹을 선택할 수 있게 되는데 이건 ec2 인스턴스에 적용된 보안그룹과 같은 보안그룹을 선택한다.

라우팅 구성 단계에서는 아까 보았던 대상 그룹을 생성할 수 있게된다. 이름은 원하는 값을 사용하고 대상 유형을 인스턴스로 선택한다. 이 경우 로드 밸런싱과 HTTPS을 적용하기를 원하는 인스턴스를 자유롭게 추가하고 편집할 수 있게된다. 다른건 건들지 않고 다음을 클릭한다.

이전 단계에서 인스턴스를 선택했다면 대상 등록 단계가 나올텐데 여기서 웹서버로 사용하고자 하는 인스턴스를 선택하고 포트를 80으로 입력, 등록된 항목에 추가를 클릭한다. 이렇게 하면 해당 인스턴스의 80번 포트를 사용할 수 있게되는데 꼭 80번 포트일 필요는 없다. 지금은 Apache를 사용하고자 하기때문에 Apache의 기본 포트인 80을 사용한것이지 사용하고자 하는 프로그램이 다른 포트를 사용할 경우 해당 포트를 추가해주면 된다. 다음을 클릭해준다.

모든 과정을 끝냈다면 Load Balancer 생성완료라는 알림이 나온다. 닫기를 누르고 대상 그룹 페이지로 이동한다.

아까 생성해준 로드 밸런서가 적용된 대상그룹이 만들어진 모습을 볼 수 있다. 포트또한 설정해준 80으로 되어있고 이제 로드 밸런서를 Route53에서 적용시켜주기만 하면 80번 포트를 HTTPS로 호스팅해줄수 있게 되는것이다.

대상그룹에 들어가보면 선택한 ec2 인스턴스가 대상으로 등록되어있는 모습을 볼수있고 오른쪽의 대상 등록 버튼을 클릭해서 포트를 추가할수도 있다. 그런데 현재 등록된 인스턴스의 상태가 unhealthy로 나오는것을 볼 수 있다. 비록 unhealthy라고 나오더라도 도메인에 연결하는 것은 정상적으로 된다. 상태 세부정보가 Health checks failed라고 나오는데 아마 대상 그룹에서 시행하는 체크가 제대로 시행되지 않은것으로 보인다. 이 상태 세부정보 메시지가 Health check failed가 아닌 오류코드를 포함한 메시지일 경우 오류가 발생하는것으로 알고 있다. 필자는 이 부분을 아직 해결하지 못했으며 나중에 해결하게 된다면 추가로 수정글을 쓸 예정이다(정상적으로 나오는 상태의 경우 healthy로 알고있다)

 

대상 등록으로 또다른 인스턴스의 80번 포트를 연결해주게 되면 로드 밸런싱에서 자동으로 트래픽 부하를 조절해주게 되어 여러 인스턴스를 번갈아가며 접속하게 된다.

3. Route53 도메인, 로드벨런서 적용

AWS에서 Route53페이지에서 좌측 메뉴의 호스팅 영역으로 들어가면 도메인을 등록했을때 생성된 호스팅 영역이 있을것이다 이를 클릭해준다.

그러면 네임서버를 등록할때 사용해줬던 레코드들 있을것이다. 현재 필자가 열람한것은 서비스중인 도메인의 레코드이기 때문에 여러개의 도메인이 등록되어있지만 이는 전부 유형 A를 사용하고 있다. 설명에 앞서 중단의 레코드 생성을 클릭하도록 하겠다.

그러면 빠른 레코드 생성을 진행할 수 있게 된다. 여기서 레코드 이름을 보면 그냥 도메인을 입력하는것이 아닌 서브 도메인을 입력할수 있도록 창이 이루어져 있는데(*.example.com 라고 써져있다고 가정한다) 여기에 www를 입력할 경우 example.com만 입력해도 웹사이트로 이동할 수 있도록 된다. 외에에도 admin이나 help등을 넣으면 admin.example.com, help.example.com같은 도메인으로 이동할 수 있게 된다. 레코드 이름은 www, 레코드 유형은 A로 선택해준 다음 우측 중단의 별칭을 활성화시키도록 하겠다.

앤드포인트를 선택할 수 있도록 나오는데 Application/Classic Load Balancer을 선택해준다

리전(지역)은 현재 콘솔에 설정된 리전으로 선택해준다. 이는 인스턴스 생성시 선택한 리전과 같은것으로 맞춰주면 된다. 필자의 경우 미국 동부(오하이오) 리전을 선택했다.

그러면 우리가 생성한 로드밸런서의 목록을 볼 수 있다. 이는 이름 태그가 아닌 DNS이름으로 나오기때문에 확인 후 선택해야만 한다. 모두 끝낸뒤 레코드 생성을 클릭한다.

 

이를 모두 완료하면 https://www.example.com은 SSL인증된 로드밸런서로 연결되고, 이는 대상 그룹으로 연결된다. 대상 그룹은 브라우저로부터 발신된 데이터 요청을 선택된 인스턴스들의 80번 포트로 보내고 서버(정확히는 서버 내부에 설치된 Docker Container)는 이에 응답하여 데이터를 반환하게 된다. 이것이 Https가 작동되는 원리이다. 그리고 웹브라우저로 접속해보면 아래와 같이 https가 적용된것을 볼 수 있다.

URL의 좌측을 보면 자물쇠 표시가 나와있는것을 볼 수 있다. 현재는 80번 포트에서 실행중인 서비스가 없기때문에 502 Bad Gateway오류가 나오는 모습이다.

클릭해보면 HTTPS가 사용된것을 볼 수 있다. 인증서를 클릭하면

이렇게 Amazone Root CA 1 인증서가 적용된 모습을 볼 수 있다.

4. Http에서 Https로 전달

우리가 지금까지 구축한 https은 분명 잘 작동하지만 아직 부족한게 한가지 있다. 그것은 웹 브라우저에서 https://example.com이 아닌 그냥 example.com을 입력하면 http로 이동하게 된다는것이다. 이를 위해 로드 밸런서의 타깃을 수정해줘야만 한다. 로드 밸런서 페이지로 이동하도록 하겠다.

생성해놨던 로드밸런서를 선택하면 하단에 이런 창이 나오게 된다. 여기서 리스너 메뉴에 들어가서 HTTP:80을 선택하고 편집을 클릭한다.

그러면 이런 페이지가 나오게 된다. 이는 HTTP의 80번 포트로 들어온 요청을 어디로 보낼것인지 설정해주고 있다. 이를 변경해주기 example-group을 휴지통 아이콘을 클릭해서 삭제해주도록 하자.

그리고 작업 추가에서 리디렉션 대상을 선택한다

리디렉션 대상에서 HTTPS, 443을 입력하고 기본 호스트, 경로 쿼리를 사용하십시오를 선택한다. 이후 하단의 체크 아이콘을 클릭한다.

위처럼 리디렉션 대상이 나오면 된거다.

다시 전 화면으로 빠져나가 리스너를 확인해보면 선택해준 기본값으로 리디렉션이 되는것을 볼 수 있다. 이러면 그냥 example.com으로 접속한 사용자은 http로 들어오게 될텐데 자동으로 https로 리디렉션 되기때문에 걱정할 필요가 없게됬다.

 

이번 글에서는 AWS Console에서 HTTPS 웹서버를 구축하는것에 대해서 써보았다. 중간에 좀 스킵한 부분도 있긴 하지만 이는 더 자세히 작성되어 있는 다른 자료에서 보충할 수 있을것이라고 생각한다. 다음 글에서는 도커를 사용한 서비스 호스팅과 Prometheus와 Grafana를 사용한 모니터링 시스템 구축에 대해서 써볼 예정이다.