在「架構重整 – 使用 Route 53」中有提到,為了將案例中的主要網域 xxxx.com 轉址到 www.xxxx.com,我採用了 CloudFront 的方式來實現。主要是不想另外再用一個 nginx 負責轉址(需要額外的設定與維護),傾向使用 AWS 原生服務來完成,減少管理的資源。實現的方式也很簡單,只需要一個 S3 bucket,前面掛上 CloudFront,並到 Route 53 做對應設置即可。同時也使用 AWS 提供的 SSL 簽證,再也不用花冤望錢繳保護費了!
建立 S3 bucket
- 到 S3 建立一個 bucket,名字要和所需轉址的網域完全相同。比如說我們要轉的網址為 koding.work,就到 S3 中建立一個名稱為 koding.work 的 bucket
- 到 bucket 中的 Properties > Static website hosting,勾選 Redirect requests,在 Target bucket or domain 中填入 www.koding.work (目標網域),protocol 填入 https
建立 CloudFront
- 到 CloudFront,點 Create Distribution 建立新的集群
- Origin Domain Name 點擊後,會出現下拉選單,要選 xxxx.xxxx..s3-website-xxxxx.amazonaws.com 的 bucket,以這邊來說我們選擇 www.koding.work.s3-website-ap-northeast-1.amazonaws.com
- 往下拉到 Distribution Settings 的部分,Alternate Domain Names (CNAMEs) 填入我們欲轉址的網域,於是填入 koding.work
- SSL Certificate 的部分,要先去 AWS Certificate Manager 建立一個 koding.work 的 SSL 憑證,再到這裡勾選 Custom SSL Certificate (example.com),並在下拉選單中選擇 SSL 憑證
5. 按 Create Distribution,等候一段時間就完成!
原理解釋
這邊解釋一下上述步驟的原理。
第四步的部分,因為我們是使用 S3 的 static website hosting,而不是只使用他的 bucket,所以 CloudFront 在選擇的時候,要選擇網域中有 s3-website 字眼的特殊 S3 網域為目標。
第五步的部分,因為我們希望使用者輸入 koding.work 的時候可以透過 DNS 指到這個 CloudFront 集群,所以需要特別設定進去,CloudFront 才會知道所對應的 CNAME 網域。
第六步的部分,我們希望無論是 http://koding.work 或是 https://koding.work 都能順利進入 CloudFront,所以需要為他掛上 SSL 憑證。使用 AWS 提供的憑證不需要額外付費,佛心來的一定要使用!
腦中測試
設定完畢後,我們來走一次各種情況的轉址流程。
情況一:使用者輸入 http://koding.work
- 透過 Route 53 得知,要指向我們設立的 CloudFront,此時走 HTTP
- 透過 CloudFront,proxy 到名稱叫做 koding.work 的 S3 Bucket static website hosting
- 透過 S3 的設定得知,要轉向 https://www.koding.work
情況二:使用者輸入 https://koding.work
- 透過 Route 53 得知,要指向我們剛剛設立的 CloudFront,但此時走 HTTPS!
- 透過 CloudFront ,proxy 到名稱叫做 koding.work 的 S3 Bucket static website hosting
- 透過 S3 的設定得知,要轉向 https://www.koding.work
如果我們沒有為 CloudFront 掛上 koding.work 的 SSL 簽證,走到第二步的時候,瀏覽器就會報錯表示簽證驗證失敗!這樣就不能到 S3 那邊進行轉址了!
透過 AWS 的 S3、CloudFront 和 Certificate Manager,我們就能簡單完成網域轉址的問題,不但不用自己管理轉址服務,還能使用免費的 SSL 簽證,實在完美!
延伸閱讀:
拯救脆弱系統 – 使用 Route 53
拯救脆弱系統 – 使用 ELB 與 Docker