Study Notes - CloudFront


CloudFront 是 AWS 非常重要的服務,用了幾年,斷斷續續有一些心得與想法,這次換個方式整理筆記,先全部用 Q and A 方式記錄學習。

本文整理的 Delivery Method 以 Web 為主


Q and A

Q: 如何知道現在的 Client 連到哪個 Edge 去了?

這是很常見的情境,通常出現網站短暫不穩,或者局部無法存取的時候,就會需要知道現在狀況,流程大概是:

  1. 反查 CloudFront 的 IP
  2. 利用 IP 再反查到 domain
  3. 透過 Domain 的資訊知道現在存取的 Edge
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
~$ nslookup d2iqjn78bwc7cy.cloudfront.net
Server: 8.8.8.8
Address: 8.8.8.8#53

Non-authoritative answer:
Name: d2iqjn78bwc7cy.cloudfront.net
Address: 13.35.37.77
Name: d2iqjn78bwc7cy.cloudfront.net
Address: 13.35.37.44

~$ nslookup 13.35.37.44
Server: 8.8.8.8
Address: 8.8.8.8#53

Non-authoritative answer:
44.37.35.13.in-addr.arpa name = server-13-35-37-44.tpe51.r.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-controlmax-age 做控制(單位是秒):

  1. 如果 max-age 沒有指定,則 CloudFront 使用 Default TTL
  2. 如果 max-age 有指定,則會被限制在 Min / Max TTL 這個範圍,換言之,如果小於 Min TTL ,max-age 會被限制在這個值,超過 Max TTL ,max-age 則會被限制住。

假設一個設定是這樣:

  • Min: 0
  • Max: 86400
  • Default: 3600
1
2
3
4
5
## 不指定 cache-control
curl -v -X GET https://d2iqjn78bwc7cy.cloudfront.net/

## 指定 cache 時間為 30 秒,在範圍之內
curl -v -X GET -H 'cache-control: max-age=30' https://d2iqjn78bwc7cy.cloudfront.net/

HTTP 另一個 Header: Expires 則是以時間為參考點的 Cache,如果 Header 同時有 expires 和 cache-control,CloudFront 只會看 cache-control。

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 來源存取?

底下幾種方法:

  1. AWS IP Address Ranges 加入防火牆白名單。
  2. 在 CloudFront 加一個 Custom Header, Origin 以此 Header 過濾來源。

Q: 有沒有什麼工具可以測試各地區存取的速度?


延伸閱讀

AWS re:Invent

參考資料


Comments