2016年4月4日 星期一

AWS 隨意筆記 (6) 設定用於 S3 靜態網站的 CloudFront Distribution

0

上一篇已經可以用 S3 架設靜態網站並自訂網址,接下來嘗試把這個網站設定 CloudFront CDN 。

將網站設定 CDN 並非必要,也要為此多付出成本,但當然也有好處,例如:加快網站速度(特別對於像圖片之類的大檔案)、支援 HTTPS (也有助於 SEO )、加強網站負載能力等。


設定用於 S3 靜態網站的 CloudFront Distribution:  

設定Distribition的作法大致上與前幾篇相同,只是一些設定值不同:


AWS 隨意筆記 (4) 申請 AWS Certificate SSL 憑證用於 CloudFront (HTTPS)


1. 進入CloudFront主控畫面,建立一個 Web Distribition。

2. 如以下圖片進行設定。

圖一 ( 設定值 PART 1 ) :

Origin Domain Name:點選此輸入框,選取作為網站的 S3 Bucket。

Origin Path: 如果只想用此bucket的某個子目錄內容,則在此輸入路徑。

Restrict Bucket Access: 選擇"Yes",因為希望網站是向CloudFront存取,而不是向S3。

Origin Access Identity :選"create a New Identity",建立專用於存取此 S3 Bucket 的 Identity。

Comment: Identity的描述。

圖二 ( 設定值 PART 2 ) :

Grant Read Permission on Bucket: 選"Yes, Update Bucket Policy",會自動將源頭 S3 Bucket 的 Policy  加上允許專用 Identity 讀取的權限。

Viewer Protocol Policy: 選那個都可以。 如果選了"Redirect HTTP to HTTPS",將會把所有 HTTP 連結,自動導向 HTTPS 連結 (如果存在的話)。

圖三 ( 設定值 PART 3 ) :

按照預設值沒修改。

圖四 ( 設定值 PART 4 ) :

Compress Objects Automatically: 選"Yes",將會有能夠提供gzip壓縮的能力。

Price Class:要使用哪些地區的節點。要最快就選"Use All Edge Locations" (將會用所有節點提供最佳速度),要省錢就選"Only US and Europe" (這兩區的節點最便宜)。

AWS WAF Web ACL: 可以為此分流加上 AWS WAF (防火牆),再強化安全性與設置更多存取限制條件,這是付費服務。

Alternate Domain Names (CNAMEs): 填入此網站的網址。

圖五 ( 設定值 PART 5 ) :

SSL Certificate: 選擇 Custom SSL Certificate 用在自訂的網址。如果還沒有憑證的話,可以按下面的"Request an ACM certificate"獲取一張免費憑證。

Custom SSL Client Support:選"Only Client that Support Server Name Indications (SNI)",這是免費服務。上面那個選項沒需求不要亂點因為很貴。

圖六 ( 設定值 PART 6 ) :

Default Root Object:填入網站的索引頁面檔名,例如index.html。

Logging: 如果選擇On,將會產生紀錄所有訪問者行為的紀錄檔在網站Bucket中。


3. 創建之後,需要等待一段時間才能使用 (當狀態變為Deployed),可以先去修改自訂網址相關設定。

點擊此 Distribition,察看 General 分頁可找到 Domain Name 欄位裡的值(xxxxxxxxxxx.cloudfront.net),複製下來。

到網址管理後台,修改CNAME紀錄,例如:
CNAME: www 
值: xxxxxxxxxxx.cloudfront.net 

這樣做將會把自訂網址,指向CloudFront的預設終端網址(xxxxxxxxxxx.cloudfront.net),而不是像上一篇,是指向 S3 Bucket 的預設終端網址 (www.xxx.com.s3-website-ap-northeast-1.amazonaws.com )。


(1) 使用者拜訪網站時,是透過CloudFront而非S3。

(2) S3只經由專用Identity與CloudFront之間進行傳輸。 (詳見 官方文件: Using an Origin Access Identity to Restrict Access to Your Amazon S3 Content )

(3) 使用者不直接拜訪S3。


修改 Bucket Policy 與測試:

察看網站的 S3 Bucket ,發現已經被自動修改過了。

(如果曾經像上一篇一樣,在Policy裡面設定了所有人都可讀取的權限,如下,要記得去掉這段。)

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"AddPerm",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::examplebucket/*"]
    }
  ]
}

修改後的Policy大致如下 (將 xxxxxxxx 改為對應的 Identity 編號,編號可以在 CloudFront的Origin Access Identity 分頁中找到 ):

{
 "Version": "2012-10-17",
 "Statement": [
  {
   "Sid": "2",
   "Effect": "Allow",
   "Principal": {
    "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity xxxxxxxxxxxxx"
   },
   "Action": "s3:GetObject",
   "Resource": "arn:aws:s3:::bucketname/*"
  }
 ]
}

圖七:

測試一下:

訪問 http://www.carol-caracol.com/
> 自動導向 https://www.carol-caracol.com/

訪問 https://www.carol-caracol.com/test/test.html
> 正常顯示

訪問 http://www.carol-caracol.com/test.jpg
> 自動導向 https://www.carol-caracol.com/test.jpg

訪問S3靜態網站預設終端網址 http://www.carol-caracol.com.s3-website-ap-northeast-1.amazonaws.com/
> 403 Forbidden

圖八:


CloudFront 檔案失效請求 ( Invalidations ) :

也就是清除已經傳輸到 CloudFront 各節點上的檔案。清除之後,如果此檔案有存取需求,CloudFront會重新向資料源頭取得最新版的檔案。

根據 CloudFront 定價頁面

失效請求
每個月前 1,000 個路徑失效要求並不收取其他費用。之後,每個路徑失效要求需支付 0.005 USD。
請注意:失效要求上所列的路徑,代表您希望從 CloudFront 快取失效的物件 URL (或者,如果路徑包含萬用字元,則會有多個 URL)。如需有關失效的詳細資訊,請參閱 Amazon CloudFront Developer Guide 中的 Invalidating Objects

一個路徑的失效大約需要0.17NTD,前一千個路徑免費 (並非新手免費方案,無期限)。如果是 /images/* 的路徑,要小心是會依照此資料夾檔案的所有路徑數量計算。

我覺得這個功能盡量少用啦 (多一個步驟要做、也要花錢),比較建議的方法,是將檔案依照版本,取不同的檔名、或放在不同資料夾中。修改後指向不同路徑即可。

例如不要把檔名取為image.jpg,而是取為image_01.jpg,修改之後就取名為image_02.jpg,並將連結指向新的檔名。又或者把檔案放在image_v1資料夾,下一版的檔案放在image_v2資料夾。這樣就比較不用需要擔心CDN上檔案是否更新的問題。

可參考 官方文件:Invalidating Objects (Web Distributions Only) 。

圖九:


0 意見:

張貼留言

歡迎分享本文~