手頭上一個寵物專案有用到 Amazon S3,就單純後台抓圖放到 S3,然後前台去下載圖片,最近使用者多了起來,雖然前台已經優化過了(前台會儲存已經看過的圖片),每個月會收到四美金的帳單,這時候才認真研究了 S3 的計費方式。
S3 的計費可以拆成三塊:
- 儲存:檔案佔的空間。
- 請求:HTTP Get / Post ...
- 資料傳輸:檔案傳輸的流量。
研究了一下常看到別人用的 Cloudflare,它提供 CDN(Content delivery network )功能的雲端服務,如此若 Cloudflare 可以直接將圖片快取下來,使用者就不會跑到 S3 去下載圖片,藉此節省 S3 資料傳輸產生的費用。
廢話說多了開始進入正題,網路上看到的做法,要先有自己的網域,把網域對應至 Amazon S3 bucket 位置,最後將自己的網域上的 Name Server 指到 Cloudflare 上。
以上圖為例:
- S3 設定:
- 我有一張圖檔叫 bar.png。
- 新增 bucket,取名為 files.foo.com(必須要跟 S3 上的 bucket 名稱一致)。
- 圖檔放在此 bucket 內。
- 此時可以透過 http://files.foo.com.s3.amazonaws.com/bar.png 下載圖片。
- DNS 設定:
- 我有一個自己的網域叫 foo.com,我建立了一個子網域 files.foo.com 要拿來指向 S3。
- DNS 上新增 CName: files <-> files.foo.com.s3.amazonaws.com->
- 此時,就可以透過 http://files.foo.com/bar.png 下載圖片,接下來要接上 Cloudflare。
- Cloudflare 設定:
- 在 Cloudflare 上匯入 foo.com 網域,匯入後你原先那台 DNS 上的設定都會被匯入,你可以決定哪些設定要走 Cloudflare 哪些不要。
- 看到 CName: file <-> files.foo.com.s3.amazonaws.com,設定這項設定要走 Cloudflare。->
- Cloudflare 會提示你因為 DNS 還沒將 Name Server 指過來,所以還沒連接上。
- DNS 設定:
- DNS 上將 NS 指到 Cloudflare 分配給你的 Name Server。
- 此時,透過 http://files.foo.com/bar.png 下載圖片,多試幾次,用瀏覽器看 http header 會發現 server 從原本的 s3 變成 cloudflare,就代表設定已經生效了!
成果如下:
- Cloudflare 節省了我原本 85% 的流量。
- 原本每月要繳給 Amazon 4 美金,降至 0.6 美金。
1 則回應:
你好,謝謝你的分享。
想請教為了 S3 建立的那個子網域是否也需要先設定一個 A紀錄 指向主機?