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: 如何強制更新 特定的 Object ?例如,後端有資料更新到 S3 了,同時更新 CloudFront 的 Cache TTL?

這個使用場景,像是一些新聞網站,後台做資料更新後,希望能夠盡快的更新 CDN 的快取時間,這時候就可以使用這樣的技巧。

流程上:

  1. 依據要更新的資料,找到對應的 path
  2. 使用者更新資料,資料寫入資料庫 (這段建議使用 Message Queue 實作)
  3. 依據更新的資料,產生靜態資料 (html),寫入 S3
  4. 最後更新 Distrubtion 上特定路徑的資料,以 CLI 執行如下:
1
2
3
aws cloudfront create-invalidation \
--distribution-id EDFDVBD6EXAMPLE \
--paths "/example-path/example-file.jpg"

底下是會回覆的訊息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"Invalidation": {
"Status": "InProgress",
"InvalidationBatch": {
"Paths": {
"Items": [
"/example-path/example-file.jpg"
],
"Quantity": 1
},
"CallerReference": "cli-1577206606-588441"
},
"Id": "I3BW3G3ATJDOS1",
"CreateTime": "2019-12-24T16:56:47.546Z"
},
"Location": "https://cloudfront.amazonaws.com/2019-03-26/distribution/EDFDVBD6EXAMPLE/invalidation/I3BW3G3ATJDOS1"
}

相關文件: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 來源存取?

底下幾種方法:

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

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

Q: CloudFront 如何開啟 CORS?

  1. Behavior -> Edit -> Forward Headers -> Whitelist
  2. 加入這兩個 Headers:OriginAccess-Request-Control-Method

參考: https://aws.amazon.com/premiumsupport/knowledge-center/no-access-control-allow-origin-error/


延伸閱讀

站內延伸

AWS re:Invent

參考資料



Comments