快轉到主要內容

將Hugo靜態網站部署到Amazon S3 + Cloudfront + Route 53

資訊科技 Hugo網站架設 Amazon Web Services
🗓️ 民國112年 癸卯年
✍ 切換正體/簡體字
目錄

本文紀錄從Netlify轉移到Amazon S3,部署Hugo靜態網站的實驗過程。

Netlify的 Pro方案是19美金,每個月1TB流量。根據統計,我一個月的流量在 self host圖片後大概需要200GB的流量,

因為流量超出Netlify免費額度,但好像又沒有用到那麼多,所以測試將整個Hugo的靜態網站遷移至AWS S3。

S3官網寫以實際用量計價,前十二個月免費。但實際上本文會用到的服務不只S3,還要加上Cloudfront、Route 53的零碎費用,最後看下來好像也沒比Netlify便宜多少,僅算是個實驗紀錄。

請先按 AWS計算機確認成本後再考慮轉移你的網站!

原本的方案

  • 網站生成器:Hugo
  • 網域:GoDaddy
  • DNS: Netlify
  • 網站託管:Netlify
  • 發表新文章的步驟:本機Linux撰寫 → 推送網站原始碼至Github做備份 → Netlify自動拉取 → 執行hugo生成靜態網頁(public) → 部署網站

變更為

  • 網站生成器:Hugo
  • 網域:GoDaddy
  • DNS: Amazon Route53
  • CDN:Amazon Cloudfront
  • 網站託管:Amazon S3
  • 發表新文章的步驟:本機Linux撰寫 → 在本機用hugo指令生成網頁(public) → 用hugo deploy指令上傳到Amazon S3 → 驗證CDN → 部署網站 → 推送原始碼至Github做備份

hugo deploy是一個聰明的指令,它會自動比對本機與AWS S3哪些檔案需要刪改,只上傳需要變更的部份。

轉移過程約花了2小時。

1. 斷開與Netlify的魂結
#

執行此步驟後,網站會下線。

  1. 進到Netlify的Domain頁面

  1. 刪除DNS Records

  1. 點選Site Settings,至Production → Domain,刪除自訂域名

  1. 至GoDaddy後台,刪除名稱伺服器,回復成GoDaddy的預設名稱伺服器。

  1. 如果有訂閱Pro版,記得點選Downgrade成Starter Plan。

2. 新增S3 Bucket
#

  1. Amazon S3新增一個儲存貯體,儲存貯體名稱名稱隨意取,AWS區域選擇離你最近的城市。取消勾選「封鎖所有公開存取權」,這樣網站才能被外人存取。

  2. 建立儲存貯體後,點選「屬性」頁籤,滑到最下面,啟用靜態網站託管,索引文件設index.html,錯誤文件設404.html

  1. 於屬性頁面最下方,可看到「儲存貯體網站端點」的網址。S3的端點網址不支援HTTPS,因此下面要新增Cloudfront來存取它。

  2. 點選「許可」頁籤,設定「儲存貯體政策」如下:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::儲存貯體的名稱/*"
        }
    ]
}

3. 申請ACM SSL憑證
#

  1. AWS Certificate Manager頁面,點選「請求」,請求公有憑證

  2. 填入網域,以及www網域。驗證方法選擇DNS。

  1. 點選憑證ID,會看到CNAME名稱和CNAME值

  1. 進入GoDaddy後台,點選網域→管理DNS,編輯網域的DNS紀錄,點選新增紀錄,新增上述的二個CNAME與CNAME的數值。

  2. 等待約30分鐘,返回AWS Certificate Manager頁面,會看到狀態變成「已發行」。

4. 新建Cloudfront分布
#

  1. Amazon Cloudfront,點選「建立分佈」

  2. 來源網域選取Amazon S3,帶有website的儲存貯體網站端點。檢視器通訊協定政策設定導向為HTTPS。啟用Web Application Firewall防範網路攻擊(需額外付費)。

  3. 「備用網域」名稱填入網域與www網域,「自訂SSL憑證」選擇剛請求的ACM憑證。「預設根對象」設定為index.html

5. 設定Route 53新增DNS
#

這一步驟讓造訪域名的訪客自動連到CloudFront,並將造訪www網域的訪客重新導向到無www的網域。

  1. Route 53,點選託管區域 → 新增託管區域,輸入網域名稱

  1. 點選新增A紀錄,勾選「別名」,將流量路由至Cloudfront。

  1. 再新增一個A紀錄,域名輸入www,勾選別名,將流量路由至此託管紀錄的另一個別名,也就是無www的網域。

  1. 於託管區域列表的NS紀錄可看到Amazon的名稱伺服器

  1. 到GoDaddy後台,編輯DNS,將名稱伺服器改為Amazon的

6. 使用hugo deploy配合aws-cli部署網站
#

  1. 於本機安裝 AWS CLI命令行工具,Linux各大發行版應該都有收。

  2. Amazon IAM新增使用者,並新增"AmazonS3FullAccess"和"CloudFrontFullAccess"這二個許可。

  3. 在IAM的頁面點選安全憑證 → 建立存取金鑰 → 命令列

  4. 於本機新增AWS CLI的設定檔

mkdir ~/.aws
vim ~/.aws/credentials
  1. 填入以下內容:
[default]
aws_access_key_id=自行填寫
aws_secret_access_key=自行填寫

ARGS="--profile=default --endpoint-url=儲存貯體網站端點網址"
  1. 於Hugo網站的目錄,編輯網站設定config.toml,於最底部加上以下內容:
[deployment]
order = [".jpg$", ".gif$"]

[[deployment.targets]]
name = "s3"

# region後面的地區含在儲存貯體網站端點網址,例如ap-northeast
URL = "s3://儲存貯體名稱?region=地區"

cloudFrontDistributionID = "Cloudfront分布的ID"
  1. 新增快捷部署指令稿deploy.sh
#!/bin/bash

rm -r public

# 生成網頁
hugo --gc --minify

# 上傳檔案到S3,可先用hugo deploy --target s3 --dryRun預覽變更
hugo deploy --target s3

# (選擇性) 推送網站原始碼至Github
rm -r public resources .hugo_build.lock
git add -A
git commit -m "網站更新"
git push
  1. 接著執行命令稿./deploy.sh,即會自動完成部署操作。

在那之後就可以重新開啟自己的域名,看看網站有無正常運作。可能需要清除瀏覽器快取並重新啟動才會看到網站上線。

確認遷移完成後,將Netlify的網域和檔案正式刪除。

參考資料
#

相關文章

自己的圖片自己host,為什麼不要將Hugo網站圖片放Imgur免費圖床
資訊科技 Hugo網站架設 Imgur
安裝Giscus作為Hugo網站的留言板,支援轉換Gitalk/Utterances的留言
資訊科技 Hugo網站架設 Giscus Github
從Snap Store安裝Hugo靜態網頁生成器
資訊科技 Hugo網站架設 Snap Hugo

留言板

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。要討論程式碼請用Giscus,匿名討論請用Disqus。

這是Giscus留言板,需要Github帳號才能留言。支援markdown語法,若要上傳圖片請貼Imgur連結。您的留言會在Github Discussions向所有人公開。

這是Disqus留言板,您可能會看到Disqus強制投放的廣告。有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。