前言
公司最近要上線一個新的網站,本文會記錄相關的設置如下:
- 由於EC2的預設網址非常不直觀,所以要用ACM為這個網站註冊一個專屬的網域
- 使用Route53為這個網域申請憑證
- 使用CloudFront綁定憑證,讓網站變成https
- 最後使用Route53設定DNS

註冊網域
首先到Route53

到Route53儀表板,在網域註冊的地方點網域

[註冊網域]

輸入自己想要取的網域名,如果完全符合會出現完全相符的圖示
如果不符合的話,AWS也會推薦一些相近的網域名稱供使用者挑選

價格也是明碼標示

這邊看有沒有自動續約的需求,如果有需要可以勾起來

輸入聯絡人資訊

稍微讓AWS處理一下之後,就註冊完成囉

去查看信件,這邊也有提示我們要做進一步的動作,也就是和我們的網站作託管,那我們就繼續吧~

設定 DNS 記錄
網域註冊完成後,回到Route53儀表板,這次我們要點的是DNS管理的「託管區域」

點選我們租用的網域

點選「建立紀錄」

這時候回到EC2租用的主機,複製公開的IP名稱

紀錄名稱:看網址要不要打前綴詞,像是hello.ray-code.com等等…
紀錄類型:這邊選擇「A 紀錄」這個記錄將你的網域名稱指向你的 IP 地址。這樣,當有人訪問你的網域時,DNS 將將其解析為你的 IP 地址,使流量能夠正確到達你的伺服器。
值:填入IP
最後點選建立紀錄

設定完成!!
這時候就可以打上這個網域,看有沒有成功轉跳到你要的網站囉~

參考網址:
https://docs.aws.amazon.com/zh_tw/Route53/latest/DeveloperGuide/welcome-domain-registration.html
https://medium.com/@justinlee_78563/關於aws-ec2-設定https-17c95bc30d4e
申請憑證(ACM)
經過剛剛的設定,我們已經可以透過domain連線到我們的網站,但這時候的網站還是http,不會是https,因應資安的需求及要求,所以我們接下來的動作就是讓我們的網站可以由http轉到https
來到AWS Certificate Manger,簡稱(ACM)
這邊記得要先切換區域到US East (N. Virginia) Region (us-east-1),這樣後續在申請CloudFront才吃得到
Associate a certificate from AWS Certificate Manager. The certificate must be in the US East (N. Virginia) Region (us-east-1).
點選[請求憑證]

請求公有憑證→下一步

輸入自己的網域名稱,也可以新增多個網域名稱,也可以輸入萬用字元,例如:*.ray-code.com
這邊我是單純新增ray-code.com
注意:憑證的網域內容在後面CloudFront設定CName的時候必須可以對應到,才可以設定,不然沒辦法設定!

驗證方法選擇電子郵件驗證
金鑰演算法我選擇的是RSA2048
然後就點選下一步

這邊就可以看到目前的狀態是等待驗證,也就是我們要等待AWS寄來的信件做驗證

信件內容長這樣,點選Approve




通過之後就會看到狀態已經改變

設定CloudFront
申請完成之後,要思考的是怎麼把這個憑證套用上我們的EC2網站,原本想把這個憑證匯出,結果發現好像不能這樣搞XD
看了一下AWS的說明,ACM可以跟哪些服務搭配 ,發現適合我的選項應該是CloudFront,也就是CDN服務

說明一下為什麼會認為CloudFront是比較適合自己的選項,其實講白了就是因為錢
ELB的話只要使用就要算錢,不管使用量高低,只要開始使用就是7*24的計費
CloudFront則是有使用流量才會計費,而且每個月都還有免費的流量可以使用
依我網站的使用量,使用CloudFront的服務是比較經濟實惠的
而網路上很多的教學都是ELB+CloudFront兩套全吃,這跟我的情境又更不相符了XD

點擊建立CloudFront之後,會看到沒有EC2可以選,預設的來源只有S3、ELB等等等…但就是沒有EC2
但是根據CloudFront的說明,應該是有支援的才對


查了一圈才發現,其實只要將EC2的對外DNS打上去就可以了
通訊協定的部分選擇僅限http


檢視器的部分,選擇redirect HTTP to HTTPS
Method我這邊是全開,不過其實不開也OK XD

快取的部分,根據這篇文章的說明,還有這個影片,選了以下的選項(僅供參考)

CName的部分,打上你原本網站的Domain

憑證的部分,選擇剛剛在us-east-1申請的憑證

都設定好了,就可以送出囉!

建立成功,這時候確認狀態及上次修改是不是已改用及顯示時間,這樣才確定它部署成功哦!

Route53設定
完成了CloudFront之後,這時候https(憑證) 跟CDN(CloudFront)都設定完成了,但這時候如果我們將domain輸入到網址列,會發現依舊還是http不是https,所以我們要來更改Route設定,把剛剛的CDN設定上去,才可以做正確的連結
回到Route53,原本我們是在紀錄名稱打的是EC2的IP,這時候我們要把他換成剛剛設定CloudFront的設定
點選編輯紀錄集

把別名勾起來→選擇CloudFront分配的別名
這時候如果設定都正確,下面應該可以挑到剛剛設定的CloudFront

儲存之後,就可以來連線看看囉!
錯誤排除
明明Route53、ACM、CloudFront都設定好了,但是網站卻一直連不上去,這個部分我花了快一天的時間,查了無數的文件,後來才找到解決的方法,所以記錄下來,希望可以幫到未來的自己也幫到大家

首先,針對504的錯誤,確實Route53、ACM、CloudFront的設定都是正確的,那問題出在哪呢?

原因是出在防火牆,因為這個網站原先我只是內部測試,所以我針對公司內部的網路開啟了80及443port,但由於我們現在使用了CDN服務,所以網路的來源就不再只是公司內部的連線,這時候如果你的安全性設定沒有變更,那等於你用防火牆把CDN擋在外頭了,當然就沒有辦法正常連線
所以我們要做的事情很簡單,就是到EC的安全性群組,將80及443port打開連線即可

第二個技術點出現了,經過公司前輩的指點,得知其實只要開啟80Port就可以了,443是不需要開啟的
因為在ACM上面的憑證是沒有辦法匯出的,所以我們在IIS上面,根本沒辦法Binding https,我們能夠開啟的就只有80port,而CDN實際也是跟80port連線。
這邊使用到的技術是Flexible SSL,瀏覽器與Cloudfront之間有一層https加密,但Cloudfront與EC2之間還是使用http連線。
詢問了一下ChatGTP老師,這邊應該是使用AWS的SNI技術,想多了解的可以再去google一下



於是我們就實際來測試一下,拿掉443port是不是還是可以正常連線

經過求證,連線依然正常

最後我們就展示一下,設定好的網站,是可以使用SSL連線的結果~

參考資料:
https://docs.aws.amazon.com/acm/latest/userguide/acm-services.html