이번에 오랫동안 알고 지냈던 소프트웨에 마에스트로 5기 김강인군을 도와 모 사이트에 SSL을 적용하는 작업을 하게 되었습니다. 이 글은 그 과정의 문서화입니다.

1. EC2 instance 생성

제가 갔을땐 이미 되어있었습니다. 따라서 이 부분은 생략합니다. EC2 instance 생성법이 필요하신 분은 아마존 웹 서비스를 다루는 기술 4장 내용을 추천합니다.

이 글에서 전제로 하는 것은 EC2에 80번 포트를 사용하는 HTTP 기준으로 세팅된 웹 서버가 있는 것입니다.

2. SSL 인증서 발급

Comodo인증서를 대행해주는 곳을 통해 작업했습니다. 인증서 발급 방법은 각 인증사마다 다르므로 문서화 하지 않습니다. 인증서를 발급받으면 Public Key, Private Key, Chain값을 받을 수 있습니다. 이 글에선 앞으로 이 값들을 이용합니다.

3. ELB 생성

※ 여기서부터 작업 내용은 AWS가 개편되면 달라질 수 있습니다. 개략적인 내용은 같을 것이므로 순서가 바뀌더라도 염려하지 않으셔도 됩니다.

3.1. 생성 버튼 클릭

AWS Console에 로그인 한 뒤, EC2 > Load Balancers 메뉴로 들어갑니다. Create Load Balancer 버튼을 클릭합니다.

Create Load Balancer

3.2. Step 1: Define Load Balancer

그러면 다음과 같은 화면이 나옵니다.

Step 1: Define Load Balancer

Load Balancer name의 경우 중복되지 않는 값으로 정해줍니다. 나머지 값들은 그대로 둡니다. Listener는 기본 값으로 HTTP만 있는데 좌측 하단의 Add 버튼을 클릭하여 스크린샷과 같이 Load Balancer ProtocolHTTPS (Secure HTTP)로 설정해주시고 나머지는 그대로 두면 됩니다.(Load Balancer Port값이 자동으로 443으로 변경될 것입니다) 다음 단계 진행을 위해 Next 버튼을 클릭합니다.

3.3. Step 2: Assign Security Groups

Step 2: Assign Security Groups

이미 가지고 있는 Security Group이 있으시다면 재활용해도 되지만 이번엔 새로 만들도록 하겠습니다.

Create a new security group

손 댈것이 없습니다. 혹시라도 이름이 바꾸고 싶으시다면 Security group name값만 수정해주시면 됩니다. 저는 혼동을 피하기 위해 ELB-security-group이라고 지정해주었습니다. 다음 단계 진행을 위해 Next 버튼을 클릭합니다.

3.4. Step 3: Configure Security Settings

3.4.1. Select Certificate

아마 처음 진행하시면 인증서를 올리신 적이 없으실 것이므로 인증서를 새로 올리는 절차를 거쳐야 합니다. Certificate Type에서 Upload a new SSL Certificate 를 선택합니다.

이제 여기서부턴 #2에서 받았던 인증서가 필요해집니다. 인증서 파일들을 text editor로 열어주세요.

Upload a new SSL Certificate

1. Certificate Name

인증서들을 구분하는 이름입니다. 중복은 불가능합니다.

2. Private Key

파일 중에 다음과 같은 형식으로 구성된 파일이 존재할 것입니다. 해당 파일의 내용을 한 글자도 빠짐 없이 그대로 Copy&Paste 해주시면 됩니다.

-----BEGIN RSA PRIVATE KEY-----
SOME CONTENTS
-----END RSA PRIVATE KEY-----
3. Public Key Certificate

파일 중에 다음과 같은 형식으로 구성된 파일이 존재할 것입니다. Private Key와 동일한 방식으로 해당 파일의 내용을 한 글자도 빠짐 없이 그대로 Copy&Paste 해주시면 됩니다.

-----BEGIN CERTIFICATE-----
SOME CONTENTS
-----END CERTIFICATE-----
4. Certificate Chain

Optinal이라고 적혀있는데 안적으면 인증서가 Self-signed 취급당합니다. SSL을 신청하면 받을 수 있는 파일 중에 Chain과 관련된 파일만 모아져있는 디렉토리(폴더)가 있을 것입니다. 인증사별로 Chain의 설정방법은 다르므로 간단히 언급만 하자면, Intermediate certificate가 1개 이상 존재하고 Root certificate 이 1개 존재합니다. Certificate Chain란에는 다음과 같은 형식으로 적어주시면 됩니다. (맨 마지막이 Root Cert로 끝나야만 합니다)

-----BEGIN CERTIFICATE-----
Intermediate certificate 2
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
Intermediate certificate 1
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
Root certificate
-----END CERTIFICATE-----

3.4.2. Select a Cipher

Select a Cipher

특별한 사유가 있으신 것이 아니라면 Predefined Security Policy에 정의되어 있는 것 중 가장 최신의 것을 사용하시면 됩니다. 다음 단계 진행을 위해 Next 버튼을 클릭합니다.

3.5. Step 4: Configure Health Check

Step 4: Configure Health Check

ELB가 각 instance가 사용가능한지 확인할 방법을 정의합니다. 저의 경우 웹 서비스이므로 무난하게 HTTP를 선택했습니다. 이 경우 Ping Path만 수정해주시면 됩니다. Ping Path는 서버가 살아있을때만 접속 가능한 주소여야 합니다. 저의 경우는 /heart_beat/ 라고 지정해주었습니다.

이제 실제 EC2 instance에 있는 서버에도 약간의 수정이 필요합니다. 저는 Python 개발자이므로 Django와 Flask 기준으로 예를 들겠습니다.(언어/Framework 선택과는 아무 상관 없는 부분) 설정을 마치신 뒤에는 다음 단계 진행을 위해 Next 버튼을 클릭합니다.

1. Django

from django.conf.urls import url
from django.http import HttpResponse


def heart_beat(request):
    return HttpResponse("It's Works!", content_type='text/plain')

urlpatterns = [
    ...,
    url('^heart_beat/', heart_beat),
]

urls.py에 설정해주시면 됩니다. (당연하지만) view가 굳이 urls.py에 같이 있을 필요는 없습니다.

2. Flask

...

@app.route('/heart_beat/')
def heart_beat():
    return "It's Works!"

3.6. Step 5: Add EC2 Instances

Step 5: Add EC2 Instances

ELB로 묶을 EC2 instance들을 모두 선택해주시면 됩니다. 다음 단계 진행을 위해 Next 버튼을 클릭합니다.

3.7. Step 6: Add Tags

추가하실 Tag가 있으면 추가하시면 됩니다. Review and Create를 클릭합니다.

3.8. Step 7: Review

잘못 설정한 것이 없는지 확인하신 후 Create를 클릭합니다. 몇분 정도 소요된 후 ELB가 활성화됩니다.

4. Domain 연결

AWS Services 중 Route 53으로 들어갑니다. 저의 경우는 이미 Hosted Zones가 생성되어 있었으므로 생성 과정은 생략합니다. 생성법이 필요하신 분은 아마존 웹 서비스를 다루는 기술 17장 내용을 추천합니다.

생성/수정시에 유의하실 부분은 A Record의 설정법입니다. 보통 EC2만을 사용한다면 Elastic IP를 상대로 지정을 하겠지만, 우리의 경우에는 ELB에 도메인이 연결되어야만 하고, ELB에는 Elastic IP를 붙일 수 없습니다. 따라서 Alias 기능을 사용합니다.

Alias

Alias는 Yes를 선택하시고, Alias Target은 ELB를 선택해주시면 됩니다. ELB를 Primary/Secondary로 구성하실 경우 Routing Policy를 Failover로 선택해주시면 됩니다.(ELB가 2개 필요합니다.)

5. Test

접속이 되나 확인해보시면 됩니다. :)