在剛確定可以使用 CDN 來加速後,後續的第一個問題,很可能就是:
「請問,CDN 可以不要只有 dwnhikcdqi4zf.cloudfront.net 這類網址,可以用我自己的域名嗎?」
今天就一起來瞭解如何透過 CloudFront 設定為你自己可以控制的域名。
原本的 HTTP 網址: http://ironman2023-alb-1744908637.ap-northeast-1.elb.amazonaws.com/
CDN 域名: http://dwnhikcdqi4zf.cloudfront.net
期望後續改用域名: https://ironman.kgg23.com
要讓 Client(ex: 瀏覽器) 要使用我們自己的域名連線到 CDN 時,我們可以怎麼做?
首先,先把 DNS 紀錄設定好。
Step a. 在 CloudFront Console 裡,可以找到每個 Distribution 對應的域名。
Step b. 找到域名後,添加一條對應的紀錄,相關設定如下(以 Route53 設定 ironman.kgg23.com 為例):
Name: ironman
Type: CNAME
Value: dwnhikcdqi4zf.cloudfront.net
Step c. 設定好了,用 dig 指令已經可以看到對應的呈現。
$ dig +short ironman.kgg23.com
dwnhikcdqi4zf.cloudfront.net.
13.35.37.34
13.35.37.186
13.35.37.91
13.35.37.231
DNS 紀錄成功加上了,但,好像連不上?
$ curl -svo /dev/null http://ironman.kgg23.com
< HTTP/1.1 403 Forbidden
< Server: CloudFront
原來文件有說,如果要使用自己指定的 CNAME,需要先在 Distribution 設定 CNAME 並設定對應的憑證。經過測試,我們知道如果沒有設定對應的 CNAME,就會 403。
Step a. 修改目標 Distribution 的設定把CNAME (ironman.kgg23.com) 填寫進去。
Step b. 添加憑證的時候,如果在自己帳號下的 us-east-1 區的 "Certificate Manager" 服務中,還沒有對應這域名的憑證,我們可以直接申請一個。(或上傳憑證,但我推薦直接申請一個新的[1]。詳細步驟可參考這文件-請求公有憑證。如果已經有,就可以直接跳到步驟 f.
Step c. (申請憑證的簡化步驟版本) 登入 Certificate Manager 的 Console,切換至 'us-east-1' region)
Step d. (申請憑證的簡化步驟版本) 選擇 "request a public certificate", 域名("Fully qualified domain name")填寫 "*.yourdomain.com" (比方說,我這填寫 "*.kgg23.com"選擇 DNS Validation,按下 "request"。點選下一頁的紀錄,將要求的 Name & Value 紀錄下來。
Step e. (申請憑證的簡化步驟版本) 將前步驟紀錄的 Name & Value 添加到 DNS 紀錄中,生效之後回到 Certification Manager 檢查,不用等太久,就會看到已經順利通過囉。
Step f. 完成憑證申請後,回到 Distribution 設定畫面中,選擇剛申請的憑證(可按下憑證下拉選單右側的 reload 按鈕,重新整理有哪些憑證內容);
Step g. "Legacy Client Support": 如果你不知道是否要選這個,就別勾選[2]。
Step h. security policy 選擇: "TLSv1.2_2021 (recommended)"
Step i. 存檔,完成設定。等相關更新完成,此時已經可以成功連線囉。
[1] 相較於上傳憑證,透過 Certification Manager 申請頒發的憑證,最大的好處是:
只要持續有使用& 使用 DNS 認證,AWS 會自動在憑證到期之前續約。(因為憑證到期沒來得及更新造成網站無法使用,是很多維護網站的人出過的包 (通常還會被視為低級錯誤)
[2] CloudFront 在提供服務時,一般是使用 SNI(Server Name Indication),但很舊的 Client 端(ex: Android 3.3 之前),不能支持 SNI 功能,所需要額外勾選來提供相容能力。