Study Notes - CloudFront
CloudFront 是 AWS 非常重要的服務,用了幾年,斷斷續續有一些心得與想法,這次換個方式整理筆記,先全部用 Q and A 方式記錄學習。
本文整理的 Delivery Method 以 Web 為主
Q and A
Q: 如何知道現在的 Client 連到哪個 Edge 去了?
這是很常見的情境,通常出現網站短暫不穩,或者局部無法存取的時候,就會需要知道現在狀況,流程大概是:
- 反查 CloudFront 的 IP
- 利用 IP 再反查到 domain
- 透過 Domain 的資訊知道現在存取的 Edge
1 | ~$ nslookup d2iqjn78bwc7cy.cloudfront.net |
這個名字 server-13-35-37-44.tpe51.r.cloudfront.net.
可以看到 TPE51
,這是機場代號,這個網站可以查到這些 Edge 的代號以及位置:CloudFront CDN Edge Locations
最常出現的狀況就是 ISP 因為維護,暫時改變 Routing Table,所以可能會找到的是日本的 NRT (成田機場) 的 Edge。
另外如果 DNS 上游是 VPC,例如上游是透過美西 (us-west-2) 的 VPC ,那麼 Edge 有可能會跑到美西去。
Q: 如何限制 CloudFront 存取來源?例如限制特定來源 IP?限定特定區域(座標)?
限制方法有以下:
- CloudFront 可以用 Geo Restriction,限制特定的國家,像是來自台灣、日本
- 透過 AWS WAF 則可以做更多更細緻的限制,像是 IP Address、String Pattern (HTTP header, URI, Query …)、Geo Location … 等。
Q: Behavior 裡 Object Caching 的 Min / Max / Default TTL 有什麼差別?
Object Caching 意思是:
從 Origin (像是 S3 or EC2, ELB …) 拿回的物件資料,存放在 CloudFront Edge 的保留時間。
例如預設 TTL 是 3600 秒,那麼第一個拿到的物件就會存放在 CloudFront 一小時,這一個小時其他的請求,都不會影響這個物件,直到一小時後的第一個請求,CloudFront 才會再去 Origin 拿。在 CloudFront 可以使用 Origin Cache Headers,也就是上層的 Cache-Control,或者使用 CloudFront 的參數。
快取透過 HTTP Header cache-control
的 max-age
做控制(單位是秒):
- 如果
max-age
沒有指定,則 CloudFront 使用Default TTL
- 如果
max-age
有指定,則會被限制在 Min / Max TTL 這個範圍,換言之,如果小於 Min TTL ,max-age 會被限制在這個值,超過 Max TTL ,max-age 則會被限制住。
假設一個設定是這樣:
- Min: 0
- Max: 86400
- Default: 3600
1 | ## 不指定 cache-control |
HTTP 另一個 Header: Expires
則是以時間為參考點的 Cache,如果 Header 同時有 expires 和 cache-control,CloudFront 只會看 cache-control。
Q: 如何強制更新 特定的 Object ?例如,後端有資料更新到 S3 了,同時更新 CloudFront 的 Cache TTL?
這個使用場景,像是一些新聞網站,後台做資料更新後,希望能夠盡快的更新 CDN 的快取時間,這時候就可以使用這樣的技巧。
流程上:
- 依據要更新的資料,找到對應的 path
- 使用者更新資料,資料寫入資料庫 (這段建議使用 Message Queue 實作)
- 依據更新的資料,產生靜態資料 (html),寫入 S3
- 最後更新 Distrubtion 上特定路徑的資料,以 CLI 執行如下:
1 | aws cloudfront create-invalidation \ |
底下是會回覆的訊息:
1 | { |
相關文件:Invalidating Files, cli: create-invalidation
Q: CloudFront 用 S3 當 Origin 時,S3 要做什麼設定?
參閱 Study Notes - AWS S3,常見問答 (FAQ)
Q: 一個 Distribution 可以掛幾個 Alternate Domain Names?
一個 Distribution 可以掛一個 ACM,一個 ACM 則可以掛 100 個 Domain。
Q: 怎樣追蹤一個請求?
API Gateway, ALB 都有 HTTP Header: x-amzn-trace-id
可以做為 Trace Id,但是目前 CloudFront 文件中沒有看到有這個 Header.
相關參見 AWS X-Ray
Q: Origin 可不可以限制 Edge 來源存取?
底下幾種方法:
- 把 AWS IP Address Ranges 加入防火牆白名單。
- 在 CloudFront 加一個 Custom Header, Origin 以此 Header 過濾來源。
Q: 有沒有什麼工具可以測試各地區存取的速度?
Q: CloudFront 如何開啟 CORS?
- Behavior -> Edit -> Forward Headers -> Whitelist
- 加入這兩個 Headers:
Origin
、Access-Request-Control-Method
參考: https://aws.amazon.com/premiumsupport/knowledge-center/no-access-control-allow-origin-error/
延伸閱讀
站內延伸
AWS re:Invent
- AWS re:Invent 2018: Four Ways to Leverage CloudFront in Faster DevOps Workflows (CTD409)
- AWS re:Invent 2017: Amazon CloudFront Flash Talks: Best Practices on Configuring, Security
- AWS re:Invent 2016: Design Patterns for High Availability: Lessons from Amazon CloudFront (CTD303)
參考資料
- AWS CloudFront CDN Edge Locations 211 PoPs
- AWS for WordPress plugin now available and with new Amazon CloudFront workflow
- 透過 CloudFront / WAF 防止盜圖
- Secured API Acceleration with Engineers from Amazon CloudFront and Slack
- CloudFront 常见错误配置及解决方法