在「架構重整 – 使用 ELB 與 Docker」中,已經完整描述我如何從 legacy sysytem 轉移至使用 Docker 和 ELB 來建立可用性高的系統架構,但其中沒有提到 Route 53 的設定,因此這邊詳細補充說明一下如何設定 Route 53,以及為何要使用 Route 53。
Route 53 也是 AWS 服務之一,他其實就是 DNS (Doman Name System),可能有人會好奇說,如果是在 Godaddy 等網域公司購買網域,都會附上免費的 DNS 服務,為何需要轉移到 AWS 上面?
為何需要使用 Route 53
假設今天沒有使用 ELB,我認為沒有轉移的必要性,但如果使用 ELB,真的必須做轉移,為什麼?
AWS 提供的 ELB 服務對外的 IP 基本上是不固定的,因為 AWS 會使用多台 instance 來建立高可用的 ELB,同時用此架構來抵擋外界的 DDoS 等攻擊。所以當你今天開啟一台 ELB,你只會拿到 ELB 的 domain name,像是這樣
xxxxxxxx.ap-northeast-1.elb.amazonaws.com
在 Godaddy DNS 設定頁面中,A record 只能填寫 IP 而不能寫入網域。CNAME record 雖然能填入網域,卻不能用在 @ (主要紀錄)中。以 koding.work 舉例:
- 如果我今天的 ELB 網域名稱是 koding-work-elb-12345.ap-northeast-1.elb.amazonaws.com
- 我到 Godaddy DNS 後台,只能設定 www.koding.work CNAME 到 kodiing-work-elb-12345.ap-northeast-1.elb.amazonaws.com (ELB)
- 但無法設定 koding.work CNAME 到 kodiing-work-elb-12345.ap-northeast-1.elb.amazonaws.com (ELB)
- 想要設定 koding.work A,但後面只能填 ip,所以也不能使用
- 想要設定 koding.work CNAME 到 www.koding.work,也會被拒絕
- 結論,koding.work 為主網域,只能設定 A record,不能設定 CNAME,所以只有 ip 才能做指向
導致主要網址 koding.work 並不能指向到 ELB,也不能透過 DNS 指向到 www.koding.work,除非要另外使用 nginx 等設置做手動轉址,但這樣管理上會非常繁複。
如果轉移到 Route 53,他的後台可以在設定 A record 的時候,直接指定哪一個 AWS 資源,如我們的目標 ELB,或是 CloudFront、S3 等等。這樣設定上就會很單純且直覺,沒有透過 hack 的手法下去作轉換,所有指向的功能都在 Route 53 中解決。
如何從 Godaddy DNS 改成使用 Route 53
要作轉換也很簡單,先到 Route 53 中開啟一個新的 host zone,填入目標網域名稱。接著到 Godaddy DNS 後台,選擇「使用自訂名稱伺服器」,依序把 Route 53 提供的 NS record 填入 Godaddy 後台中並儲存。由於要將設定散佈到世界各地的伺服器中,完全生效需要幾分鐘的時間。
實際轉移案例分享
在當時的案例中,情況與我上面的假設略有出入,該案例主要使用的網域為 www.xxxx.com,所以我一開始在做 migrate 的時候,順序是這樣:
- 我先開啟了 ELB,並到 godaddy 中把 www.xxxx.com 的 CNAME 設定到 ELB 的網域(原本 CNAME 是指向 xxxx.com)
- 原先的 xxxx.com A record 保留舊有 EC2 ip
- 使用者如果輸入 www.xxxx.com,會直接進入 ELB 中
- 使用者如果輸入 xxxx.com,會先進入舊有 EC2 中,透過 EC2 中的 nginx rewrite 轉址成 www.xxxx.com,再進入 ELB
在我逐步要把舊 EC2 廢除時,就發現會遇到 xxxx.com 沒辦法妥善轉址的問題!因此那時的策略是
- 先將 DNS 轉移到 Route 53
- 設定 CloudFront 負責原先舊 EC2 中 xxxx.com 轉 www.xxxx.com 的任務(可參考 拯救脆弱系統 – 使用 CloudFront 轉址)
- 將 Route 53 中 xxxx.com 的 A record 指向 CloudFront
- 測試 ok 後逐步把舊 EC2 拔掉
到這裡就算是完成了 ELB 轉移的過程,可以放心讓系統自生自滅了(誤)!
延伸閱讀:
拯救脆弱系統 – 使用 CloudFront 轉址
拯救脆弱系統 – 使用 ELB 與 Docker
參考資料:
Route53 AWS 官方文件
封面圖片備註:
我知道圖片裡是 Route 66,只是懶得P圖,直接使用了XD