Amazon S3 + Cloudflare 節省網路流量

手頭上一個寵物專案有用到 Amazon S3,就單純後台抓圖放到 S3,然後前台去下載圖片,最近使用者多了起來,雖然前台已經優化過了(前台會儲存已經看過的圖片),每個月會收到四美金的帳單,這時候才認真研究了 S3 的計費方式。

S3 的計費可以拆成三塊:

  • 儲存:檔案佔的空間。
  • 請求:HTTP Get / Post ...
  • 資料傳輸:檔案傳輸的流量。
整個列下來發現,幾乎都是資料傳輸惹的禍,大概40張0.2MB的圖片,結果一個月來了30GB的流量,看來光是前台有優化不夠,每個使用者一個月只抓一次就可以把我打死了。

研究了一下常看到別人用的 Cloudflare,它提供 CDN(Content delivery network )功能的雲端服務,如此若 Cloudflare 可以直接將圖片快取下來,使用者就不會跑到 S3 去下載圖片,藉此節省 S3 資料傳輸產生的費用。

廢話說多了開始進入正題,網路上看到的做法,要先有自己的網域,把網域對應至 Amazon S3 bucket 位置,最後將自己的網域上的 Name Server 指到 Cloudflare 上。

螢幕快照 2015-09-08 下午2.11.13

以上圖為例:
  1. S3 設定:
    1. 我有一張圖檔叫 bar.png。
    2. 新增 bucket,取名為 files.foo.com(必須要跟 S3 上的 bucket 名稱一致)。
    3. 圖檔放在此 bucket 內。
    4. 此時可以透過 http://files.foo.com.s3.amazonaws.com/bar.png 下載圖片。
  2. DNS 設定:
    1. 我有一個自己的網域叫 foo.com,我建立了一個子網域 files.foo.com 要拿來指向 S3。
    2. DNS 上新增 CName: files <-> files.foo.com.s3.amazonaws.com
    3. 此時,就可以透過 http://files.foo.com/bar.png 下載圖片,接下來要接上 Cloudflare。
  3. Cloudflare 設定:
    1. 在 Cloudflare 上匯入 foo.com 網域,匯入後你原先那台 DNS 上的設定都會被匯入,你可以決定哪些設定要走 Cloudflare 哪些不要。
    2. 看到 CName: file <-> files.foo.com.s3.amazonaws.com,設定這項設定要走 Cloudflare。
    3. Cloudflare 會提示你因為 DNS 還沒將 Name Server 指過來,所以還沒連接上。
  4. DNS 設定:
    1. DNS 上將 NS 指到 Cloudflare 分配給你的 Name Server。
    2. 此時,透過 http://files.foo.com/bar.png 下載圖片,多試幾次,用瀏覽器看 http header 會發現 server 從原本的 s3 變成 cloudflare,就代表設定已經生效了!
螢幕快照 2015-09-08 下午2.10.19

成果如下:
  • Cloudflare 節省了我原本 85% 的流量。
  • 原本每月要繳給 Amazon 4 美金,降至 0.6 美金。

1 則回應:

Miriam Unbosom 提到...

你好,謝謝你的分享。
想請教為了 S3 建立的那個子網域是否也需要先設定一個 A紀錄 指向主機?