Amazon CloudFront - 永久免費的 CDN 服務
快速、高度安全且可編程的內容分發網絡 (CDN),包含超過 225 個節點(超過 215 個邊緣站點和 13 個區域性邊緣緩存)的全球網絡,覆蓋 47 個國家/地區的 90 個城市。
CDN 服務免費用 - 每月 1TB
加上 200 萬個 HTTP 和 HTTPS 要求,以及 200 萬個 CloudFront Functions 調用
手把手配置Amazon CloudFront 實現全站加速
如何配置 CloudFront Distribution
下面介紹下如何爲自己的應用配置 CloudFront,實現網站訪問加速。
在開始之前,首先簡單介紹下 CloudFront的常見術語。
Distribution:分配,是 CloudFront 的基本單元,每個分配有唯一的 ID 以及CloudFront 爲其分配的域名(類似 abcdefg13456789.cloudfront.net)。
Origin: 源站,顧名思義,是需要被加速的站點,可以是 S3 存儲桶,可以是 ELB/EC2,可以是 Elemental MediaStore/MediaPackage,或者是用戶自定義的站點(如第三方 IDC 中的 HTTP Web 服務器)。一個分配中可以有多個源站。
Behaviors:行爲, CloudFront 通過路徑匹配和優先級決定執行哪一個緩存行爲,一個分配中可以有多個 行爲,並且每個 行爲 對應一個源站。在 行爲 中可以設置緩存 TTL 時間,允許的 HTTP 行爲(GET,PUT,POST 等),與 Lambda@edge函數關聯等等。
本節將涉及如下內容:
- 創建一個分配;
- 該分配有兩個源站,其中一個是創建時添加,一個是後添加。一個源站爲ELB,一個源站爲 S3 存儲桶;
- 兩個 行爲,一個是默認 行爲 並對應回源 ELB,一個是新加的 行爲 並對應源站 S3 存儲桶;
- ELB,S3 創建過程不做介紹;
創建 分配
進入 CloudFront console,並選擇新建 Distribution。設置如下:
源

參數解釋如下:
| 源 設置 | |
|---|---|
| 源域 | 源站地址,僅支持域名方式。也可以通過下拉列表直接選擇帳號裏已經創建過的 ELB,S3,MediaStore,MediaPackage等。 如果是自定義站點,需先給該站點配置一個域名,不能填寫 IP。 |
| 協議 | CloudFront 回源協議,可以是 HTTP 或 HTTPS,或者與實際客戶請求時一樣的協議。注意這兒是 CloudFront 回源站時用的協議,而不是CloudFront對外服務的協議。 如果選用了 HTTPS,一定要注意源站已經配置對應回源域名(Origin Domain Name)的 SSL 證書。 |
| 源路徑 | (可選)如果源站內容有多層目錄,而又希望回源的時候路徑上不體現這些目錄,可以在此設置要隱藏的目錄層級。例如:配置源路徑 /version1 後,客戶訪問www.customer.com/page.html 相當於訪問源站 origin.customer.com/version1/page.html |
| 名稱 | 可以設置一個容易記憶的名字 |
| 添加自定義標頭 | 可以在請求源站時,帶上特殊的Http header頭,例如可以帶上自定義的驗證頭。 |
| 啓用源護盾 | 源護盾是一個附加的緩存層,可以減少源站回源的壓力,如果源站不在亞馬遜雲科技上部署,通過源護盾,還可以改善回源的穩定性和速度。源護盾會產生額外的費用。 |
| 其他設置 | 可以設置回源時的失敗重試次數,連接超時,響應超時,以及連接複用的保持時間。 |
行爲

參數解釋如下:
| 默認緩存行爲 | |
|---|---|
| 路徑模式 | 默認是 * ,就是全部匹配。支持通配符 * 代表0或多個字符,? 代表完全匹配一個字符。注意路徑模式是區分大小寫的。例如 image/*.jpg 代表image目錄下的所有jpg文件都遵循這個緩存行爲。 |
| 自動壓縮對象 | 是否在客戶端支持的時候,返回源站文件的壓縮版本,以優化體驗。注意還需要在下面的緩存策略中,勾選使用 GZip 或 Brotli 壓縮算法。 |
| 查看器協議策略 | 允許客戶端訪問CloudFront時使用的協議,支持 HTTP 和 HTTPS,並且提供重定向 HTTP 到 HTTPS。 |
| 允許的 HTTP 方法 | 允許的 HTTP 動作,不同的 行爲 可以配置不同的選項。 |
| 限制查看器訪問 | 是否使用簽名的 URL 或簽名的 Cookie 才能訪問,也就是常說的防盜鏈技術。 |
| 緩存鍵和源請求 | 如何進行源的緩存,以及如何區分不同的緩存,通過這兩個設置進行。這裏有兩種方式,一種是通過緩存策略和源請求策略共同確定,另一種舊的遺留策略,不推薦使用。下面將會詳細介紹如何通過緩存策略和源請求策略確定緩存的情況。 |
| 響應標頭策略 | 通過響應標頭策略,可以實現安全相關需求和獲取更多的統計信息,下面將會詳細介紹。 |
| 其他設置 | 可以設置IIS的平滑流,字段級加密,以及實時訪問日誌流配置。 |
策略配置
下面介紹上面提到的三個關鍵的策略配置:
- 緩存策略
緩存策略用於決定內容是否進行緩存,以及緩存的時間。CloudFront默認提供了多種緩存託管策略,可以直接選擇使用,也可以根據需要自定義緩存策略來使用,默認提供的託管策略如下:
| 託管 緩存策略 | |
|---|---|
CachingOptimized |
適用於靜態網站加速的場景。源站不會因爲不同用戶、不同終端等返回不同的內容,內容默認進行了壓縮。 |
CachingOptimizedForUncompressedObjects |
和上面策略相同,但不進行壓縮。 |
CachingDisabled |
適用於動態內容,或不可緩存的內容。 |
Elemental-MediaPackage |
爲Amazon Elemental MediaPackage服務配置的策略。 |
Amplify |
爲Amazon Amplify Web應用程序配置的策略。 |
如果需要自定義緩存策略,各個設置項如下:
| 自定義 緩存策略 | |
|---|---|
| TTL設置 | 最短TTL:CloudFront在到達這個時間後,會向源請求以確認緩存是否最新。 默認TTL:如果源的內容沒有指定Cache-Control或Expires標頭時,CloudFront會按這個值設置緩存過期時間。 最長TTL:當源的內容指定了Cache-Control或Expires標頭時,設置緩存過期時間爲標頭和最長TTL中的最小值。 注意,這三個值隻影響CloudFront回源和緩存的行爲,向客戶端返回的緩存標頭以源站返回的標頭爲準。 |
| 緩存鍵設置 | 該設置指定在緩存源站內容時,應該用哪些關鍵鍵值進行區分不同內容,分別進行緩存。 標題:無 表示不需要區分不同的Http Header標頭。可以通過 包括以下標題 選擇需要區分的Http Header標頭。 查詢字符串:無 表示不需要區分不同查詢字符串的回源。全部 表示需要帶上所有查詢字符串進行緩存區分。包括/排除指定字符串 表示包括或排除對應的字符串來區分緩存。 Cookie:和查詢字符串類似,但是是處理Cookie裏包含的值。 |
| 壓縮支持 | 可以開啓GZip和Brotli壓縮,注意選擇了 自動壓縮對象 後纔會生效。 |
- 源請求策略
源請求策略用於設置回源請求時的行爲,CloudFront默認提供了多種源請求託管策略,可以直接選擇使用,也可以根據需要自定義源請求策略來使用,默認提供的託管策略如下:
| 託管 源請求策略 | |
|---|---|
UserAgentRefererHeaders |
僅包含User-Agent和Referer標頭,可以統計客戶來源。 |
CORS-CustomOrigin |
包含Origin標頭,適用於自定義源啓用跨源資源共享 CORS。 |
CORS-S3Origin |
適用於S3源啓用跨源資源共享 CORS。 |
AllViewer |
適用於動態請求的源站,源站可以獲取查詢字符串和Cookie等信息。 |
Elemental-MediaTailor-PersonalizedManifests |
適用於Amazon Elemental MediaTailor 終端節點的源 |
如果需要自定義源請求策略,各個設置項如下:
| 自定義 源請求策略 | |
|---|---|
| 標題 | 定義回源時,怎樣設置Http Header。 無:不使用Http Header標頭進行回源請求。 包括以下標題:選擇指定的Http Header標頭進行回源。 所有查看器標題和以下CloudFront標題:CloudFront可以判斷一些常用的情況,並進行標識,例如客戶端是否是手機,客戶端訪問的國家標識等。 所有查看器標題:傳遞客戶端的所有標題。 默認情況下,源站收到 CloudFront的請求中的 Host 字段值爲 源站 設置中的源站域名,如果用戶的源站需要拿到客戶端發來的 Host 字段的值(即用戶 CNAME 到該分配的域名),在此處就需要將 Host 添加到白名單,此時源站將收到客戶端發出請求時的域名。 |
| 查詢字符串 | 定義回源時,怎樣設置Url上問號後的參數。 無:表示不帶任何字符串回源。 全部:表示帶上所有查詢字符串回源。 包括指定字符串:表示包括對應的字符串回源。 |
| Cookie | 定義回源時,怎樣設置Cookie值。 無:表示不帶任何Cookie回源。 全部:表示帶上所有Cookie回源。 包括指定Cookie:表示包括對應的Cookie回源。 |
- 響應標頭策略
響應標頭策略用於返回給客戶端內容時,增加特殊的Http Header標頭,實現對應功能。CloudFront默認提供了多種響應標頭託管策略,可以直接選擇使用,也可以根據需要自定義響應標頭策略來使用,默認提供的託管策略如下:
| 託管 響應標頭策略 | |
|---|---|
SimpleCORS |
允許來自任何源的簡單 CORS 請求(添加標頭:Access-Control-Allow-Origin: *)。 |
CORS-With-Preflight |
支持CORS的預檢請求(Http的OPTIONS方法)。 |
SecurityHeadersPolicy |
添加一組安全標頭。 |
CORS-and-SecurityHeadersPolicy |
添加CORS標頭和安全標頭。 |
CORS-with-preflight-and-SecurityHeadersPolicy |
添加CORS,預檢和安全標頭。 |
如果需要自定義響應標頭策略,各個設置項如下:
| 自定義 響應標頭策略 | |
|---|---|
| 跨源資源共享 (CORS) | 配置CORS相關設置。如果源提供了CORS相關設置,且沒有選擇 源覆蓋,則會把源的設置返回到客戶端。 |
| 安全標頭 | 多種安全相關標頭,可以進行自定義設置。 |
| 自定義標頭 | 可以設置自定義的標頭。 |
| 服務計時標頭 | 可以提供CloudFront是否命中緩存,回源點,各級回源所用時間等信息。 可以設置採樣的百分比。 |
函數

函數關聯設置,可以在CloudFront處理請求的不同階段,嵌入Lambda@edge和 CloudFront Functions代碼,進行自定義的邏輯處理,這裏不展開。
設置

參數解釋如下:
| 設置 | |
|---|---|
| 價格級別 | 有三類,北美與歐洲、北美歐洲加亞太非、全球加速,不同類別應用到的 PoP 點不同,對應價格也不一樣。 |
| AWS WAF Web ACL | 如果配置了 WAF,可以在此關聯,當然 CloudFront Distribution 創建完成後也可以在WAF Console關聯。 |
| 備用域名(CNAMEs) | (若使用自己域名,該項是必須項)CloudFront Distribution 創建完成後,CloudFront 會提供一個以 cloudfront.net 結尾的域名,如果需要使用自己的域名的話,需要在此處填寫待使用的域名。 |
| 自定義SSL證書 | 支持用戶使用自己域名的證書,需要與上一欄域名匹配。可以使用 Amazon ACM 申請證書,需要注意的是,需要在 us-east-1 區域下的 ACM 申請才能應用到 CloudFront。 支持 dedicate IP 和 SNI 兩種模式。 |
| 支持的 HTTP 版本 | 可以啓用HTTP/2的支持。 |
| 默認根對象 | 可以指定默認指向的文件名,例如:index.html |
| 標準日誌記錄 | 標準訪問日誌記錄,建議開啓。日誌開啓還需要選擇存放的S3桶。 |
| IPv6 | 是否支持IPv6。 |
點擊 創建分配 後,來到 分發 的列表頁面,可以看到狀態是“In Process”,大概10分鐘左右看到狀態是“已啓用”時,則表示該分配創建完成,可以使用,並且可見到 CloudFront 爲其分配的域名,例如xxxxxxx.cloudfront.net,如果需要使用自己的域名,需要在自己域名的DNS管理中,添加DNS解釋,把域名 CNAME 到 CloudFront分配的域名,例如此處的xxxxxxx.cloudfront.net,添加後就可以使用自己域名進行訪問了。
添加源站
接下來,我們可以再添加一個源站,點擊分配的 ID,可見當前分配的相關設置,點擊 “源”,可以看到當前的源站設置,點擊 “創建源”,可以添加一個源站。

此時我們添加一個 S3 桶爲源站,可以在源域上選擇需要的S3桶。

注意選擇 S3 桶爲源站時,會出現S3存儲桶訪問的“使用OAI”選項,我們知道 S3 通過 ACL 和 Bucket Policy 控制存儲桶的對象是否被公開訪問,因此該 S3 存儲桶需要允許 CloudFront 能夠從 S3 存儲桶拉取對象,因此這裏有兩種方式,一個是該桶設置爲公開訪問桶,任何人可以直接從該桶下載,而另一種方法是使用 OAI(Origin Access Identity),即該 分配 獲取一個 OAI,並且在 S3 bucket policy 中的 principle 部分填寫該 OAI,這樣該 S3 存儲桶將僅向該分配開放了相應的權限,而其他人無法直接從該存儲桶下載資源,建議選擇“是的,使用OAI”以避免 Bucket Policy 配置錯誤。
添加 行爲
同樣進入分配後,在 行爲 欄選擇 創建行爲。我們假定訪問 jpg圖片的請求,回源到前面創建的 S3 存儲桶。

當一個請求到達CloudFront POP 點,CloudFront 檢查該請求的 URL 路徑,並與 行爲 中設置的進行匹配,並按優先級匹配到對應的 行爲 配置,執行對應的行爲。
可以調整 行爲 的優先級調整策略。

緩存優化
本節將介紹常見的 TTL 設置建議、動態加速,設置樣例以及錯誤處理。
TTL 設置建議
CloudFront 在計算 Cache key 時會將請求的 URL 以及當前分配對應的 行爲 配置(如是否轉發 Header、Cookie、查詢字符串)考慮在內,計算出唯一值。因此即使兩次請求都是相同的 URL,如果兩次請求的個別 Header 不一樣,且該 Header 配置爲需要區分緩存,則計算出的 Cache key 也不同,返回給客戶端的內容自然也不同。因此配置轉發的查詢字符串、Cookie 及 Header 越少,Cache key 也將越少,緩存命中率就越高,帶來的性能也越好。
對於用戶內容在 PoP 點的緩存 TTL,可以使用源站設置的 Cache Control: max-age 的值,或者在 Behavior 中使用 Customized 設置 Minimum TTL,Maximum TTL、Default TTL(https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/Expiration.html )。
| 分類 | 靜態內容,長期 | 靜態內容,短期 | 動態內容 |
|---|---|---|---|
| 舉例 | *.css, *.js, *.jpg, *.png 軟件下載,媒體文件,媒體分片文件(HLS *.ts,*.m3u8)。 |
登錄頁,index.jsp,新聞,天氣信息,HLS 直播 m3u8 文件。 | 變化的內容,不可緩存的內容。 |
| 建議 | 不變的內容可以設置較大的 TTL 值,使用版本號更新內容,內容放置在S3桶中。 選擇緩存策略:CachingOptimized |
定期更新的內容設置低 TTL 值。TTL 到期後,CloudFront 回源校驗源站內容是否發生變化。 | 經常變化的內容;按請求不同內容不同;設置很低甚至0 TTL。 選擇緩存策略:CachingDisabled |
對於動態內容,動態加速場景,可以在源站設置:
Cache-Control: no-cache; max-age=0; No-store; private 或 Cache-Control: public; max-age=0;
對於 Cache-Control Header 設置樣例:
| 靜態資源 | 登錄頁 | 媒體分片 | 動態內容 | HLS 直播 |
|---|---|---|---|---|
| *.css, *.js, 軟件下載,更新包等 | Index.html |
/*.ts |
/*.m3u8 |
|
Cache-Control:public;max-age=31536000 |
Cache-Control:no-cache=Set-Cookie;max-age=30 |
Cache-Control:public;max-age=31536000 |
Cache-Control:no-cache;max-age=0;No-store;private |
Cache-Control:public;max-age=2 |
錯誤處理
當源站不可用時,可以在 CloudFront 配置針對400,403,404,405,414,500,501,502,503,504等錯誤碼的自定義響應頁並修改返回給客戶端的響應碼。CloudFront 將週期性驗證源站的可用性,並可在源站恢復前將當前緩存中的內容作爲響應返回給客戶端。

設置方式可見
內容更新
當源站靜態內容更新時,如何讓客戶端在 TTL 失效時間前即可拿到最新版本的內容是每一位開發者關心的問題,在 CloudFront 有兩種方式。
版本號控制
當已發佈的內容更新時,可在文件名或者路徑中使用版本號進行區分,比如從 v1 到 v2,或者時間戳等可以區別同一對象兩種版本的其他方法,同時應用測對資源鏈接指向新版本號的資源。
使用 失效(Invalidation) 功能
失效 功能可以使文件在 TTL 失效時間到達前將文件從 PoP 點刪除,使用該功能可以快速的在文件名不變的前提下將文件更新。
失效 支持指定單個文件或者以*通配符結尾的路徑。限制及費用見
https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/Invalidation.html

監控與日誌
CloudFront 提供多種報告供用戶瞭解自己分配的使用率等情況,您可以使用 CloudWatch API 獲取分配的相應監控指標,需要注意的是,使用 CloudWatch API 時 region 應設置爲 us-east-1。
CloudFront 報告提供按天或按小時的請求數、數據傳輸、HTTP Status Code、Top50 訪問的對象,使用率以及按設備、瀏覽器、操作系統、客戶端位置等指標的報告,同時可以配置 CloudWatch 警報,對關鍵指標數據進行監控(請求數、已下載字節、已上傳字節、總錯誤率、4xx錯誤率、5xx錯誤率),一旦超過正常閾值,運維人員可第一時間得到告警。

儘管 CloudFront 提供了多維度的報告,但可能仍不能滿足用戶的多維度分析的需求。因此推薦這類用戶對 CloudFront 日誌進行分析,當用戶開啓 CloudFront 分配日誌後,日誌將會上傳到指定的 S3 存儲桶,通過分析日誌可以瞭解有關該分配的更多的客戶端請求行爲,有助於做運營分析或者 debug。關於日誌字段解釋見
https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html
用戶可以使用無服務器交互式查詢服務Amazon Athena輕鬆的使用標準 SQL 直接在 S3 中分析數據,並與 Amazon QuickSight 集成,輕鬆實現數據可視化。使用 Amazon Athena 查詢 Amazon CloudFront 日誌方式見
https://docs.aws.amazon.com/zh_cn/athena/latest/ug/cloudfront-logs.html
對於需要實時獲取CloudFront日誌,可以使用CloudFront的實時日誌功能,這裏介紹一個實時日誌的一鍵部署解決方案,幫助客戶快速分析日誌:https://aws.amazon.com/cn/blogs/china/quickly-build-custom-cdn-monitoring-through-amazon-cloudfront-real-time-log/
合規與安全
CloudFront 目前已經獲得 PCI DSS 合規,GDPR(https://aws.amazon.com/cn/compliance/privacy-features/)、HIPPA、SOC 以及 ISO 9001, 27001, 27017, 27018 等合規認證。
同時開啓 CloudTrail,用戶帳號下所有的 CloudFront API 調用記錄將均被CloudTrail 記錄,便於用戶後期審計。下面我們將從4個方面進行介紹 CloudFront 如何保證您的內容安全。
回源保護
我們可以將源站設置爲僅允許 CloudFront 訪問,而拒絕客戶端的直接回源。
源站爲 ELB/EC2
- ELB/EC2 的安全組僅對 CloudFront 節點 IP 開放對應的端口(80/443),CloudFront 節點服務器的 IP 地址範圍見:
https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/LocationsOfEdgeServers.html
- 在 CloudFront Origin 設置時,添加自定義 Header 字段及值,源站對請求中的字段檢查,若不含有該 Header 字段及值,則返回錯誤碼。
- 回源 HTTPS,回源支持1、TLSv1.2 安全協議以及 RSA,ECDSA 兩類密碼算法。
- 使用 源護盾 保障源的安全
https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/origin-shield.html
源站爲 S3 存儲桶
在 S3 存儲桶策略中應用 OAI,僅允許帶該 OAI 的 CloudFront 分配從存儲桶中獲取內容。https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html
傳輸安全
CloudFront 支持客戶端到 PoP 點使用 HTTPS 請求,CloudFront 爲每個分配生成的域名支持 HTTPS 請求,並支持用戶上傳自己從可信 CA 購買的證書。用戶可以在 Amazon ACM 服務免費申請自己域名的證書,需要注意的是,需要在 us-east-1 區的 ACM 服務申請,才能應用到 CloudFront 的分配。對於用戶域名證書,CloudFront 支持專屬 IP 和 SNI 兩種方式。
內容保護
簽名 URL、簽名 Cookie
針對有些內容限制訪問的情景,如僅允許付費用戶或者授權用戶訪問的內容,我們可以通過簽名 URL 或簽名 Cookie 的方式提供內容的私有化訪問。文檔中已有非常詳細的說明,在此不再展開,具體方式見:
https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html
Field-Level Encryption 字段級加密
2017年12月份,CloudFront 推出了該功能,使用該功能,可以進一步增強敏感數據 (如信用卡號碼或個人身份信息) 的安全性。在將 POST 請求轉發到您的源站之前,CloudFront 的字段級加密使用特定於字段的加密密鑰 (由用戶提供) 對 HTTPS 表單中的敏感數據進行進一步加密。這可確保敏感數據只能被應用程序堆棧中的某些組件或服務解密和查看。配置方式見:
https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/field-level-encryption.html
Geo 限制
CloudFront 提供了基於地理位置訪問限制的功能,用戶可以通過設置白名單或者黑名單的方式,允許或禁止某個國家或地區對自己分配的訪問。

緩解攻擊
Amazon WAF 是一款 Web 應用程序防火牆,幫助保護您的 Web 應用程序免受常見 Web 漏洞的攻擊。AWS Shield 是一種託管式分佈式拒絕服務(DDoS)防護服務,可以保護在 AWS 上運行的防護應用程序。
CloudFront可以與 Amazon WAF、Amazon Shield 進行集成,用戶可以在創建 CloudFront 分配時關聯已創建的 WAF,或者在 WAF Console 創建完 WAF 規則後與 CloudFront 分配關聯。
可編程 CDN
亞馬遜雲科技推出了Lambda@edge 和 CloudFront Functions,用戶可以通過CloudFront事件觸發,例如源服務器和瀏覽者之間的內容請求或響應。通過函數代碼快速實現自定義功能,感興趣的讀者可以查看以下內容:
https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/lambda-examples.html
參考資料
[1] 開發人員指南:https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/Introduction.html
[2] Amazon WAF https://aws.amazon.com/cn/waf/
[3] Amazon Certificate Manager https://aws.amazon.com/cn/certificate-manager/
[4] Amazon Shield https://aws.amazon.com/cn/shield/