如果您的內容託管在地端部署或另一個雲端,可以使用「外部後端」,透過 Google 的 Cloud CDN 提供內容。
本文逐步說明如何將 Amazon Simple Storage Service (Amazon S3) 或 Azure Blob 儲存空間等第三方物件儲存空間,設為 Cloud CDN 的外部後端,這兩者皆可與外部應用程式負載平衡器搭配使用。
架構
如要建立外部後端,請建立網際網路的網路端點群組 (NEG),並指向設為負載平衡器後端的第三方儲存空間服務。網際網路 NEG 會用於外部後端。
如要將第三方儲存空間 bucket 設為後端,請完成下列步驟:
- 準備第三方儲存空間 bucket,用來提供內容。
- 建立使用 bucket FQDN 的網際網路 NEG。
- 將網際網路 NEG 設為後端,設定外部應用程式負載平衡器。
- 測試設定。
準備用來提供內容的 bucket
開始在 Google Cloud中設定前,請確認 bucket 設定正確無誤。本操作說明假設您使用 Amazon S3 儲存貯體,且具備變更 Amazon S3 儲存貯體和物件所需的權限。
請確認 Amazon S3 儲存貯體和其中的物件已設為公開,或已設定 Amazon S3 儲存貯體的私有來源驗證。
請確認內容符合「可快取內容」一文列出的可快取性條件。如需新增物件中繼資料,請參閱 AWS 知識庫,例如「編輯物件中繼資料」。
設定網際網路 NEG 時,需提供 Amazon S3 儲存貯體的端點 (FQDN) 資訊。請按照 AWS 知識庫 (例如「存取儲存貯體」) 提供的操作說明取得端點資訊。您也可以從物件的總覽頁面取得 Amazon S3 端點網址。
建立使用 bucket 主機名稱的網際網路 NEG
為求簡單起見,本範例使用 FQDN backend.example.com。請務必將這個值替換為第三方儲存空間 bucket 的 FQDN,格式類似 http://unique-name-bucket.s3-us-west-1.amazonaws.com/。
本指南透過範例說明基本概念,包括如何在外部應用程式負載平衡器中,使用外部後端 (有時稱為「自訂來源」)。外部後端是指 Google Cloud外部的端點。使用外部後端搭配外部應用程式負載平衡器時,可以透過 Cloud CDN 快取提升效能。
本指南會逐步說明如何設定全域外部應用程式負載平衡器,並啟用 Cloud CDN 的後端服務,將 Proxy 連線至位於 backend.example.com 的外部後端伺服器。
在本範例中,負載平衡器會接受用戶端的 HTTPS 要求,並以 HTTPS 形式轉送至外部後端。這個範例假設外部後端支援 HTTPS。
其他選項包括將負載平衡器設為接受 HTTP 或 HTTPS 要求,並在將要求轉送至外部後端時使用 HTTPS。
本指南假設您已設定負載平衡器,且正要新增外部後端。詳情請參閱「設定後端為代管執行個體群組的傳統版應用程式負載平衡器」。
圖 1 顯示範例架構。
上圖中,www.example.com 的負載平衡器前端 IP 位址為 120.1.1.1。快取失敗時,系統會透過 HTTPS 從外部後端擷取使用者對 /cart/id/1223515 的要求。其他所有傳入流量都會根據網址對應,導向使用 Compute Engine VM 的 Google Cloud 後端服務或後端 bucket。
事前準備
按照本指南操作之前,請先熟悉以下內容:
網際網路的網路端點群組總覽,包括多項限制。
權限
如要按照本指南操作,需建立網際網路的網路端點群組 (NEG),並在專案中建立或修改外部應用程式負載平衡器,因此您必須是專案擁有者或編輯者,或是具備下列所有的 Compute Engine IAM 角色:
| 任務 | 必要角色 |
|---|---|
| 建立及修改負載平衡器元件 | 網路管理員 |
| 建立及修改 NEG | Compute 執行個體管理員 |
設定具備外部後端的負載平衡器
本節說明如何設定及測試網際網路 NEG。
設定總覽
設定網際網路 NEG 的步驟如下:
- 在網際網路 NEG 中定義網際網路端點。
- 將網際網路 NEG 新增為後端服務的後端。
- 設定外部應用程式負載平衡器的網址對應,定義要將哪些使用者流量對應至這個後端服務。
- 將必要的 IP 範圍加入許可清單。
此範例會建立下列資源:
- IP 位址為
120.1.1.1的轉送規則,會將傳入要求導向目標 Proxy。 - 轉送規則的
networkTier須為PREMIUM。 - 目標 Proxy 會根據網址對應檢查每個要求,決定要求適用的後端服務。
- 如果使用外部後端,目標 Proxy 須為
TargetHttpProxy或TargetHttpsProxy。本範例使用TargetHttpsProxy。 - 後端服務啟用 Cloud CDN (選用) 後,就能快取及提供 Cloud CDN 快取的回應。
- 此範例包含自訂標頭,如果外部後端預期 HTTP 要求的
Host標頭具有特定值,這個標頭就為必要項目。
具體設定如下所示。
建立 NEG 和網際網路端點
控制台
- 前往 Google Cloud 控制台的「Network endpoint groups」(網路端點群組) 頁面。
- 按一下「Create network endpoint group」(建立網路端點群組)。
- 輸入網路端點群組的名稱:
example-fqdn-neg。 - 將「Network endpoint group type」(網路端點群組類型) 設為「Network endpoint group (Internet)」(網路端點群組 (網際網路))。
- 在「Default port」(預設通訊埠) 中輸入
443。 - 將「New network endpoint」(新網路端點) 設為「Fully qualified domain name and port」(完整網域名稱與通訊埠)。
- FQDN 請輸入
backend.example.com。 - 將「Port type」(通訊埠類型) 設為「Default」(預設),並確認「Port number」(通訊埠編號) 為
443。 - 按一下「Create」(建立)。
gcloud
建立網際網路 NEG,並將
--network-endpoint-type設為internet-fqdn-port(可連線至外部後端的主機名稱和通訊埠):gcloud compute network-endpoint-groups create example-fqdn-neg \ --network-endpoint-type="internet-fqdn-port" --global將端點新增至 NEG。如未指定通訊埠,系統會根據後端服務中設定的通訊協定,預設選取通訊埠
80(HTTP) 或443(HTTPS;HTTP/2)。請務必加上--global旗標:gcloud compute network-endpoint-groups update example-fqdn-neg \ --add-endpoint="fqdn=backend.example.com,port=443" \ --global列出已建立的網際網路 NEG:
gcloud compute network-endpoint-groups list --global
輸出內容:
NAME LOCATION ENDPOINT_TYPE SIZE example-fqdn-neg global INTERNET_FQDN_PORT 1
列出該 NEG 中的端點:
gcloud compute network-endpoint-groups list-network-endpoints example-fqdn-neg \ --global輸出內容:
INSTANCE IP_ADDRESS PORT FQDN backend.example.com
在負載平衡器中新增外部後端
以下範例會更新現有的負載平衡器。
在現有的負載平衡器中,預設服務是 Google Cloud服務。這個範例新增路徑比對器來修改現有網址對應,將 cart/id/1223515 的所有要求傳送至與網際網路 NEG 相關聯的 images 後端服務。
控制台
建立後端服務並新增網際網路 NEG
- 前往 Google Cloud 控制台的「Load balancing」(負載平衡) 頁面。
- 如要將後端服務新增至現有負載平衡器,請選取傳統版應用程式負載平衡器,然後按一下 「Menu」(選單) ,再選取「Edit」(編輯)。
- 按一下「Backend configuration」(後端設定)。
- 在「Backend services & backend buckets」(後端服務和後端 bucket) 選單中,選取「Create a backend service」(建立後端服務)。
- 將後端服務的名稱設為
images。 - 將「Backend type」(後端類型) 設為「Internet network endpoint group」(網際網路的網路端點群組)。
- 選取負載平衡器與網際網路 NEG 之間要使用的通訊協定。在此範例中,請選取「HTTPS」。
- 在「New backend」(新增後端) >「Internet network endpoint group」(網際網路的網路端點群組) 下方,選取
example-fqdn-neg,然後按一下「Done」(完成)。 - 選取「Enable Cloud CDN」(啟用 Cloud CDN)。
- 選用:修改快取模式和存留時間設定。
- 在「Advanced configurations」(進階設定) 的「Custom request headers」(自訂要求標頭) 下方,按一下「Add header」(新增標頭)。
- 「Header name」(標頭名稱) 請輸入
Host。 - 「Header value」(標頭值) 請輸入
backend.example.com。
- 「Header name」(標頭名稱) 請輸入
- 按一下「Create」(建立)。
- 視窗保持開啟,以便繼續操作。
將後端服務附加至現有網址對應
- 按一下「Host and path rules」(主機與路徑規則)。
- 第一或前幾個資料列的右欄中顯示 Google Cloud 服務,其中一個已填入「Hosts」(主機) 與「Paths」(路徑) 的預設規則
Any unmatched (default)。 - 確認右欄中已選取包含
images的資料列。如果此資料列不存在,請按一下「Add host and path rules」(新增主機與路徑規則),然後選取images。請依照下列資訊填入其他欄位:- 在「Hosts」(主機) 中輸入
*。 - 在「Paths」(路徑) 中輸入
/cart/id/1223515。
- 在「Hosts」(主機) 中輸入
檢查並完成
- 按一下「Review and finalize」(檢查並完成)。
- 比較設定與打算建立的內容。
- 如果沒有任何問題,請按一下「Update」(更新)。
gcloud
為 NEG 建立新的後端服務:
gcloud compute backend-services create images \ --global \ --enable-cdn \ --cache-mode=CACHE_MODE \ --protocol=HTTP2
將 CACHE_MODE 替換為下列其中一項,設定快取模式:
設定後端服務,將自訂要求標頭
Host: backend.example.com新增至要求:gcloud compute backend-services update images \ --custom-request-header "Host: backend.example.com" --global
使用
backend-services add-backend指令,將網際網路 NEG 新增至後端服務:gcloud compute backend-services add-backend images \ --network-endpoint-group "example-fqdn-neg" \ --global-network-endpoint-group \ --global
建立新的比對規則,將新的後端服務附加至負載平衡器的網址對應,將要求導向該後端:
gcloud compute url-maps add-path-matcher EXAMPLE_URL_MAP \ --default-service=GCP_SERVICE_EXAMPLE \ --path-matcher-name=CUSTOM_ORIGIN_PATH_MATCHER_EXAMPLE \ --backend-service-path-rules=/CART/ID/1223515=IMAGES
請更改下列內容:
EXAMPLE_URL_MAP:現有網址對應表的名稱GCP_SERVICE_EXAMPLE:現有預設後端服務的名稱CUSTOM_ORIGIN_PATH_MATCHER_EXAMPLE:這個新路徑規則的名稱/CART/ID/1223515:路徑IMAGES:附加網際網路 NEG 的新後端服務名稱
將必要的 IP 範圍加入許可清單
如要允許外部應用程式負載平衡器將要求傳送至網際網路 NEG,必須使用 dig 或 nslookup 等工具查詢 _cloud-eoips.googleusercontent.com DNS TXT 記錄。
例如執行下列 dig 指令:
dig TXT _cloud-eoips.googleusercontent.com | grep -Eo 'ip4:[^ ]+' | cut -d':' -f2
輸出內容包含兩個 IP 範圍,如下所示:
34.96.0.0/20
34.127.192.0/18
請記下 IP 範圍,並確認防火牆或雲端存取控管清單 (ACL) 允許這些範圍。
詳情請參閱「驗證要求」。
將網域連結至負載平衡器
負載平衡器建立完成後,請記下與負載平衡器相關聯的 IP 位址,例如 30.90.80.100。如要將網域指向負載平衡器,請透過網域註冊服務建立 A 記錄。如果在 SSL 憑證新增了多個網域,須為每個網域新增 A 記錄,並全部指向負載平衡器的 IP 位址。舉例來說,如要為 www.example.com 和 example.com 建立 A 記錄,請使用以下方法:
NAME TYPE DATA www A 30.90.80.100 @ A 30.90.80.100
如果使用 Cloud DNS 做為 DNS 服務供應商,請參閱「新增、修改及刪除記錄」。
測試外部應用程式負載平衡器
負載平衡器設定完成後,即可開始將流量傳送至負載平衡器的 IP 位址。若已設定網域,也可將流量傳送至網域名稱。不過,DNS 傳播可能需要一段時間才能完成,因此可以先用 IP 位址測試。
前往 Google Cloud 控制台的「Load balancing」(負載平衡) 頁面。
點選剛剛建立的負載平衡器。
記下負載平衡器的 IP 位址。
若您是建立 HTTP 負載平衡器,可以使用網路瀏覽器前往
http://IP_ADDRESS測試負載平衡器。請將IP_ADDRESS替換為負載平衡器的 IP 位址,系統會自動導向helloworld服務首頁。若您是建立 HTTPS 負載平衡器,可以使用網路瀏覽器前往
https://IP_ADDRESS測試負載平衡器。請將IP_ADDRESS替換為負載平衡器的 IP 位址,系統會自動導向helloworld服務首頁。如果這個做法無效,且您是使用 Google 代管的憑證,請確認憑證資源狀態為「ACTIVE」(有效)。詳情請參閱「Google 代管的 SSL 憑證資源狀態」。
或者,您也可以使用本機電腦指令列中的
curl。請將IP_ADDRESS替換為負載平衡器的 IPv4 位址。如果使用 Google 代管的憑證,請測試指向負載平衡器 IP 位址的網域。例如:
curl -s 'https://www.example.com:443' --resolve www.example.com:443:IP_ADDRESS
選用:如果使用自訂網域,可能需要等待更新的 DNS 設定傳播完畢,再於網路瀏覽器中測試網域 (例如
backend.example.com)。如需疑難排解說明,請參閱「排解外部後端和網際網路 NEG 問題」。
測試 Cloud CDN
測試 1:直接命中 bucket 端點
這項測試會使用 VM 的 time 和 wget 指令。此範例從 backend.example.com bucket 下載 /cart/id/1223515/image.jpg。
輸出內容顯示整體要求耗時 780 毫秒,這是直接從 Amazon S3 擷取 3.3 MB 圖片所花的時間。
time wget backend.example.com/cart/id/1223515/image.jpg
--2020-06-26 18:22:46-- backend.example.com/cart/id/1223515/image.jpg Resolving backend.example.com (backend.example.com)... 52.219.120.233 Connecting to backend.example.com (backend.example.com)|52.219.120.233|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 3447106 (3.3M) [image/jpeg] Saving to: '/cart/id/1223515/image.jpg.47' /cart/id/1223515/image.jpg.47 100%[==============================================================================================================================================>] 3.29M 6.25MB/s in 0.5s 2020-06-26 18:22:47 (6.25 MB/s) - '/cart/id/1223515/image.jpg.47' saved [3447106/3447106] real 0m0.780s user 0m0.003s sys 0m0.012s
測試 2:透過 Cloud CDN 傳送第一次要求
這項測試會使用負載平衡器的 IP 位址來擷取 /cart/id/1223515/image.jpg 檔案。這是第一個要求,因此應該會快取失敗,且 Cloud CDN 會從來源 (即 Amazon S3) 擷取圖片。輸出內容顯示要求耗時 844 毫秒。
time wget http://LOAD_BALANCER_IP_ADDRESS/cart/id/1223515/image.jpg
--2020-06-26 18:19:27-- http://LOAD_BALANCER_IP_ADDRESS/cart/id/1223515/image.jpg Connecting to LOAD_BALANCER_IP_ADDRESS:80... connected. HTTP request sent, awaiting response... 200 OK Length: 3447106 (3.3M) [image/jpeg] Saving to: '/cart/id/1223515/image.jpg.44' /cart/id/1223515/image.jpg.44 100%[==============================================================================================================================================>] 3.29M 8.23MB/s in 0.4s 2020-06-26 18:19:28 (8.23 MB/s) - '/cart/id/1223515/image.jpg.44' saved [3447106/3447106] real 0m0.844s user 0m0.003s sys 0m0.012s
測試 3:透過 CDN 傳送第二次要求
現在使用這個負載平衡器 IP 再傳送一次要求,這次應該會成功快取回應,因此速度會比前 2 項測試快。
再次使用同一個負載平衡器 IP LOAD_BALANCER_IP_ADDRESS。輸出內容顯示要求只花了 18 毫秒。
time wget http://LOAD_BALANCER_IP_ADDRESS/cart/id/1223515/image.jpg
--2020-06-26 18:19:29-- http://LOAD_BALANCER_IP_ADDRESS/cart/id/1223515/image.jpg Connecting to LOAD_BALANCER_IP_ADDRESS:80... connected. HTTP request sent, awaiting response... 200 OK Length: 3447106 (3.3M) [image/jpeg] Saving to: '/cart/id/1223515/image.jpg.45' /cart/id/1223515/image.jpg.45 100%[==============================================================================================================================================>] 3.29M --.-KB/s in 0.008s 2020-06-26 18:19:29 (423 MB/s) - '/cart/id/1223515/image.jpg.45' saved [3447106/3447106] real 0m0.018s user 0m0.001s sys 0m0.010s
使用記錄進行驗證
Cloud CDN 的記錄與 Cloud CDN 後端所連接的外部應用程式負載平衡器相關聯。您可以透過記錄檢查要求是命中還是失敗。如要進一步瞭解 Cloud CDN 記錄,請參閱「查看記錄」。
限制
第三方 bucket 和物件必須設為公開。或者,也可設定私人來源驗證,讓 bucket 和物件保持私密。外部後端不支援其他內容驗證方法,例如已簽署的網址或已簽署的 Cookie。
如果外部後端服務預期 HTTP 要求的
Host標頭為特定值,您必須設定後端服務,將Host標頭設為該預期值。如果沒有設定自訂要求標頭,後端服務會保留Host,這是用戶端連線至 Google Cloud 外部應用程式負載平衡器所用的標頭。如需自訂標頭的一般資訊,請參閱「設定自訂要求標頭」。如需具體範例,請參閱「設定具備外部後端的負載平衡器」。