Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>
 banner

소개

(2019년 8월 25)현재 joinc.co.kr사이트는 통큰아이 서버호스팅을 받고 있다. 매우 저렴한 가격에 사용하고 있기는 한데, 그래도 명색이 클라우드 엔지니어인데 AWS에서 사이트를 돌려야 할 것 같아서 AWS로 이전하기로 했다. 도메인은 whois에 등록해서 사용하고 있다.

(거의)무중단으로 이전하기를 원했고 우선 도메인을 이전하기로 했다. 아래와 같은 구성이 될 것이다.

 DNS 이전

  • DNS 관리 기관을 이전하지는 않을 것이다.
  • joinc.co.kr 도메인 질의를 Route 53으로 위임 할 것이다. 위 그림을 보자. 원래 joinc.co.kr 도메인에 대한 도메인 서버는 ns{1-4}.whoisdomain.kr 이다. 이 도메인 서버를 Route 53 으로 변경한다.
네임서버의 변경을 마치고 나면 약 5분정도 질의가 실패한다. 그래서 (거의) 무중단이라고 했다. 5분정도 까짓거 무시하고, 토요일 새벽에 작업을 진행하기로 했다. 일단 도메인 작업이 끝나면, 서버를 AWS(EC2, ELB, RDS를 사용 할 것 같다)로 이전하는 것은 무중단으로 가능하다.

Joinc 도메인 정보 확인

NS 레코드 확인
# dig joinc.co.kr NS 

; <<>> DiG 9.11.5-P1-1ubuntu2.5-Ubuntu <<>> joinc.co.kr NS
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8524
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;joinc.co.kr.			IN	NS

;; ANSWER SECTION:
joinc.co.kr.		300	IN	NS	ns2.whoisdomain.kr.
joinc.co.kr.		300	IN	NS	ns1.whoisdomain.kr.
joinc.co.kr.		300	IN	NS	ns4.whoisdomain.kr.
joinc.co.kr.		300	IN	NS	ns3.whoisdomain.kr.
문제가 생길경우 롤백을 위해서 NS 정보를 기억하고 있어야 한다. whoisdomain.kr이 질의에 응답하고 있는 걸 확인 할 수 있다.

Route 53에 대해서

Route 53은 AWS에서 제공하는 고가용성 DNS 서비스다. Route 53을 이용하면 EC2 인스턴스를 포함한 다양한 AWS 서비스로의 라우팅이 가능하다. 라운드로빈 라우팅 뿐만 아니라 Health Check 기반 라우팅, Weight 기반 라우팅등 개선된 기능을 제공한다. Route 53은 다른 문서에서 자세히 다루겠다. 여기에서는 도메인 서버를 위임하는 부분만 다룬다.

joinc.co.kr 호스트 존 생성

Route 53 대시보드에서 Create Hostd Zone을 클릭하고 Domain Name만 입력하면 된다. 호스트 존을 생성하면, 4개의 분산된 TLDs(Top-level domain)서버가 할당된다.

 NS 레코드

joinc.co.kr 호스트 존에 할당된 4개의 TLDs를 whois 도메인 관리자 페이지에서 네임서버 정보에 입력하면 된다.

 네임서버정보 변경

Route 53 TLDs 를 네임서버에 등록하는 즉시, *.joinc.co.kr에 대한 질의는 Route 53으로 위임된다. 따라서 아래 joinc.co.kr A 레코드 등록작업을 먼저해야 한다.

joinc.co.kr A 레코드 등록

내가 관리하고 있는 서비스 도메인은 joinc.co.kr www.joinc.co.kr과 cloud.joinc.co.kr 세개다. 두 개 도메인에 대한 A 레코드를 등록했다.

 Route 53 A Record 등록

A 레코드를 등록한 다음, 제대로 적용됐는지를 테스트한 후, whois 네임서버 정보를 변경한다.
# dig @ns-1264.awsdns-30.org www.joinc.co.kr            

; <<>> DiG 9.11.5-P1-1ubuntu2.5-Ubuntu <<>> @ns-1264.awsdns-30.org www.joinc.co.kr
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31237
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.joinc.co.kr.		IN	A

;; ANSWER SECTION:
www.joinc.co.kr.	300	IN	A	1.234.27.228

;; AUTHORITY SECTION:
joinc.co.kr.		172800	IN	NS	ns-1264.awsdns-30.org.
joinc.co.kr.		172800	IN	NS	ns-1656.awsdns-15.co.uk.
joinc.co.kr.		172800	IN	NS	ns-378.awsdns-47.com.
joinc.co.kr.		172800	IN	NS	ns-569.awsdns-07.net.

;; Query time: 222 msec
;; SERVER: 205.251.196.240#53(205.251.196.240)
;; WHEN: 토  8월 24 12:41:22 KST 2019
;; MSG SIZE  rcvd: 200
A 레레드 조회가 잘 되는 걸 확인했다. 이제 whois 네임서버 정보를 변경한다.

도메인 테스트

whois의 네임서버 변경 후 약 5분 뒤에, 도메인 설정이 적용될 것이다. [man/12/digtrace dig +trace] 명령으로 질의 과정 전부를 확인해봤다.
dig +trace @8.8.8.8 www.joinc.co.kr

; <<>> DiG 9.11.5-P1-1ubuntu2.5-Ubuntu <<>> +trace @8.8.8.8 www.joinc.co.kr
; (1 server found)
;; global options: +cmd
.			192145	IN	NS	j.root-servers.net.
.			192145	IN	NS	d.root-servers.net.
.			192145	IN	NS	i.root-servers.net.
.			192145	IN	NS	h.root-servers.net.
.			192145	IN	NS	a.root-servers.net.
.			192145	IN	NS	c.root-servers.net.
.			192145	IN	NS	k.root-servers.net.
.			192145	IN	NS	m.root-servers.net.
.			192145	IN	NS	l.root-servers.net.
.			192145	IN	NS	g.root-servers.net.
.			192145	IN	NS	b.root-servers.net.
.			192145	IN	NS	f.root-servers.net.
.			192145	IN	NS	e.root-servers.net.
.			192145	IN	RRSIG	NS 8 0 518400 20190903170000 20190821160000 59944 . sjPTdYPcR293HnJd1Xr6GP5b+pNs3hvQzyWqPN0rJq8dbzkDnsLkDShu QYh1b+3UjY1zOUYOKzmITptEqwPtB/G8pvedrV6gNz8ue65YVKkTQyun M3Cfn8e5BJO6ORg9NvBt92OjvSdZqUq6Y1aGDtCOBoePFuYMrI91BlAK ydAHd66Osg4CLPu6BVIxCQdz5i57YXuRgy/z/xyZoPRrafLToIhgb+94 EwR+ly40ONBSlPBzwnimUeXrWjrNsapw/QVlOg/nNKIrXf5acbfEuuTc n4I9/JE2v74H3Pp1HEohdKfpfImIKW5nKCwjgGBJmClKM0ggigv3UBHS aj3yZA==
;; Received 525 bytes from 8.8.8.8#53(8.8.8.8) in 33 ms

kr.			172800	IN	NS	b.dns.kr.
kr.			172800	IN	NS	f.dns.kr.
kr.			172800	IN	NS	d.dns.kr.
kr.			172800	IN	NS	e.dns.kr.
kr.			172800	IN	NS	c.dns.kr.
kr.			172800	IN	NS	g.dns.kr.
kr.			86400	IN	DS	17625 7 2 FB939059F4B67BBA1E8AC37E35811E506488B2D8CFF807AF873B2116 B5676B5C
kr.			86400	IN	RRSIG	DS 8 1 86400 20190905230000 20190823220000 59944 . RGq8RlHcMECqZfKq4z7ggMOt5ShFH+EOYmn2y6Cur5/4f7vv29ExNFKD B0rgiFW4I4ruD5cmTpZ16I4dJgOdcDk/ZiZ52gCh1JchVy+/ATCAYKvc mOwTDxZrHQUkKOLdhmOZ2eNPCHsG7eXZJoy6TKFdHSZxTG92OPHHZU9+ BEeTnxALfCiUvGLbJuONunSl5uo9ZzwSwzy5W7Yfu4x2xIUL7w4IRX9b EYBXfziltXTGzNvphtaXT3VSZFAeJD/K8i9jrLHIDifRB2+7Y3Fk93u8 nmQ0v4QbqOuHPKcYWUwscg8ypATF7HADW1HBBB2uuYpoICX9X8JdZ/F1 Oeh2kA==
;; Received 691 bytes from 193.0.14.129#53(k.root-servers.net) in 364 ms

joinc.co.kr.		86400	IN	NS	ns-1656.awsdns-15.co.uk.
joinc.co.kr.		86400	IN	NS	ns-1264.awsdns-30.org.
joinc.co.kr.		86400	IN	NS	ns-378.awsdns-47.com.
joinc.co.kr.		86400	IN	NS	ns-569.awsdns-07.net.
U3DDJFBKOIPB9S5A1IFP8MCCN46S4K58.co.kr.	900 IN NSEC3 1 1 10 96E920 U3IGRDUSJ53PT3117IA7U8BUE9QD3ASL NS SOA RRSIG DNSKEY NSEC3PARAM
U3DDJFBKOIPB9S5A1IFP8MCCN46S4K58.co.kr.	900 IN RRSIG NSEC3 7 3 900 20190922193023 20190823193023 43889 co.kr. G4h8Vq4nyVWQcuuaSiQ6I57F4kpzZTvP4MfsODNWTjhVL3TP0unuxVKH t2H2I7NlOJyYFjcqPW3JgUdSku7XvOJTj/gdrQvrADsNx+soA1WkztTo Lskk5ikDmkMce2FsLMB0V8sIgJA7jmmxSJF4LmsixJ6YIZLAiOeHfq+n XaU=
PVPTTA4DUJPKT536HU0MFA9E94UE0P4S.co.kr.	900 IN NSEC3 1 1 10 96E920 Q0RSE55IH6FPM6OJ2Q0MRV5HR6NSNQME NS DS RRSIG
PVPTTA4DUJPKT536HU0MFA9E94UE0P4S.co.kr.	900 IN RRSIG NSEC3 7 3 900 20190922193023 20190823193023 43889 co.kr. cyXwLF3XE0HyIku5iPeT0PSCFOpkuEO4pREdyLjtvI9JMwE4mLcGG/FT 2xa4OwVMKGGBr+361NLO2vPb6xImLOr5YTIbnwaYI2exr2lN/xvSTK6p 1XvML8/Tht1++3JyaQkSzU01dAqNE6A/PiLkRUR6jYJEHJ+C3Y4ytY7C 5KA=
;; Received 707 bytes from 203.83.159.1#53(d.dns.kr) in 3 ms

www.joinc.co.kr.	300	IN	A	1.234.27.228
joinc.co.kr.		172800	IN	NS	ns-1264.awsdns-30.org.
joinc.co.kr.		172800	IN	NS	ns-1656.awsdns-15.co.uk.
joinc.co.kr.		172800	IN	NS	ns-378.awsdns-47.com.
joinc.co.kr.		172800	IN	NS	ns-569.awsdns-07.net.
;; Received 200 bytes from 205.251.193.122#53(ns-378.awsdns-47.com) in 184 ms
마지막 줄을 보면 rote 53 도메인 서버가 www.joinc.co.kr에 대한 A 레코드를 반환한 것을 확인 할 수 있다. 이것으로 도메인 설정이 끝났다.

ACM 을 이용한 SSL 인증서 관리

ELB로 서비스를 구성할 계획이다. 해서 ACM으로 SSL 인증서를 관리하기로 했다. ACM(AWS Certificate Manager)를 이용하면 SSL 인증서 발급, offload, 주기적 갱신 작업에 신경쓸 필요가 없다. AWS에서 모두 알아서 관리해준다. ACM에 대한 자세한 내용은 여기에서는 다루지 않는다. ACM 만들고 ELB에 offload 하는 것 까지만 확인한다.

ACM 평범한 구성은 아래와 같다.

 ACM 구성

  • ACM을 이용해서 중앙에서 SSL/TLS 인증서를 관리한다.
  • 인증서는 ELB와 CloudFront 등의 AWS 서비스에 배포 할 수 있다.
ACM을 이용해서 joinc.co.kr 도메인 인증서를 만들기로 했다.

 Dashboard

Get Start버튼을 클릭하자.

 Request a public certificate

인증서 요청 페이지가 뜬다. 인증서는 public certificate(공인 인증서)private certificate(사설 인증서) 두 가지 타입이 존재한다. joinc.co.kr은 인터넷에 공개할 서비스 이므로 public certificate를 요청했다.

 ACM Add domain names

공인 인증서를 요청할 도메인을 설정한다. ACM은 아스테리스크(*)를 지원한다. 하나의 인증서로 모든 joinc.co.kr 서브도메인에 대한 인증을 확인할 수 있다.

 도메인 소유 검증 확인

도메인에 대한 인증서를 발급하기 위해서는 도메인을 소유하고 있다는 것을 검증받아야 한다. ACM은 DNS validation 과 Email validation 방식을 제공한다. 나는 DNS validation 을 선택했다.

리뷰 과정을 거치면 Validation 페이지로 넘어간다.

 ACM Validation

도메인을 이용한 인증 절차를 확인 할 수 있다. Route53의 joinc.co.kr 호스트 존에 CNAME 레코드를 추가하면 된다. Validation 이 완료되기 전까지는 pending상태가 된다. joinc.co.kr 호스트 존에 CNAME 값을 추가하자.

 ACM DNS Validation

추가한 뒤 수분 정도가 뒤나면 validation 작업이 완료된다. 만들었으니, 잘 작동하는지 테스트를 해보기로 했다. 테스트 구성은 아래와 같다.

 ACM 테스트

  1. EC2 인스턴스를 실행한다. 여기에는 NginX를 설치한다.
  2. ELB를 만들고 인스턴스를 연결한다.
  3. ELB에 앞서 만든 인증서를 offload 한다.
  4. 웹 브라우저로 테스트한다.
ELB를 전개 할 때, 사용할 ACM 인증서를 선택만하면 된다.(EC2/ELB를 전개하고 연결하는 기록하지 않았다.)

 인증서 선택

테스트를 위해서 acm.joinc.co.kr 도메인을 만들기로 했다. 이 도메인을 앞서 만든 ELB에 연결하면 된다. Route53으로 이동해서 acm.joinc.co.kr 도메인을 만들고 CNAME에 ELB 도메인 주소를 입력했다.

 ELB를 CNAME으로 등록

도메인이 잘 등록됐는지 dig로 테스트를 했다.
# dig acm.joinc.co.kr

; <<>> DiG 9.11.5-P1-1ubuntu2.5-Ubuntu <<>> acm.joinc.co.kr
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28511
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;acm.joinc.co.kr.		IN	A

;; ANSWER SECTION:
acm.joinc.co.kr.	300	IN	CNAME	acmtest-420658116.ap-northeast-2.elb.amazonaws.com.
acmtest-420658116.ap-northeast-2.elb.amazonaws.com. 59 IN A 13.124.184.76
acmtest-420658116.ap-northeast-2.elb.amazonaws.com. 59 IN A 13.124.220.228

;; Query time: 9 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: 월  8월 26 14:01:00 KST 2019
;; MSG SIZE  rcvd: 140

curl로 연결테스트를 진행한다.
 curl -I https://acm.joinc.co.kr
HTTP/2 200 
date: Mon, 26 Aug 2019 05:02:04 GMT
content-type: text/html
content-length: 3520
server: nginx/1.12.2
last-modified: Mon, 17 Dec 2018 00:17:59 GMT
etag: "5c16eb37-dc0"
accept-ranges: bytes

인증서 정보를 확인해보자.
# echo | openssl s_client -showcerts -servername gnupg.org -connect acm.joinc.co.kr:443 2>/dev/null | openssl x509 -inform pem -noout -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            05:34:a3:5e:f6:07:a6:ff:ac:3a:f8:a4:69:0c:3d:78
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, O = Amazon, OU = Server CA 1B, CN = Amazon
        Validity
            Not Before: Aug 26 00:00:00 2019 GMT
            Not After : Sep 26 12:00:00 2020 GMT
        Subject: CN = *.joinc.co.kr
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
// 생략...
작동 확인 끝 !!

앞으로 할 것들

  1. 도메인 관리 기관은 여전히 whois다. 굳이 aws로 기관이전할 생각은 없다.
  2. joinc.co.kr 도메인에 대한 질의는 Route53이 수행한다. 앞으로 Route53의 다양한 기능들을 테스트 해 볼 수 있겠다.
  3. 마지막으로 AWS로 joinc 서버를 이전하고 EC2, ELB, ACM, RDS 구성을 하면 된다.

참고