設定第三方物件儲存庫

如果您的內容託管在地端部署或另一個雲端,可以使用「外部後端」,透過 Google 的 Cloud CDN 提供內容。

本文逐步說明如何將 Amazon Simple Storage Service (Amazon S3) 或 Azure Blob 儲存空間等第三方物件儲存空間,設為 Cloud CDN 的外部後端,這兩者皆可與外部應用程式負載平衡器搭配使用。

架構

如要建立外部後端,請建立網際網路的網路端點群組 (NEG),並指向設為負載平衡器後端的第三方儲存空間服務。網際網路 NEG 會用於外部後端。

如要將第三方儲存空間 bucket 設為後端,請完成下列步驟:

  1. 準備第三方儲存空間 bucket,用來提供內容。
  2. 建立使用 bucket FQDN 的網際網路 NEG。
  3. 將網際網路 NEG 設為後端,設定外部應用程式負載平衡器。
  4. 測試設定。

準備用來提供內容的 bucket

開始在 Google Cloud中設定前,請確認 bucket 設定正確無誤。本操作說明假設您使用 Amazon S3 儲存貯體,且具備變更 Amazon S3 儲存貯體和物件所需的權限。

  1. 請確認 Amazon S3 儲存貯體和其中的物件已設為公開,或已設定 Amazon S3 儲存貯體的私有來源驗證

  2. 請確認內容符合「可快取內容」一文列出的可快取性條件。如需新增物件中繼資料,請參閱 AWS 知識庫,例如「編輯物件中繼資料」。

  3. 設定網際網路 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 顯示範例架構。

圖 1:S3 儲存貯體用於外部後端
圖 1:S3 儲存貯體用於外部後端

上圖中,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 須為 TargetHttpProxyTargetHttpsProxy。本範例使用 TargetHttpsProxy
  • 後端服務啟用 Cloud CDN (選用) 後,就能快取及提供 Cloud CDN 快取的回應。
  • 此範例包含自訂標頭,如果外部後端預期 HTTP 要求的 Host 標頭具有特定值,這個標頭就為必要項目。

具體設定如下所示。

圖 2:後端採用 Amazon S3 儲存貯體的 Cloud CDN
圖 2:後端採用 Amazon S3 儲存貯體的 Cloud CDN

建立 NEG 和網際網路端點

控制台

  1. 前往 Google Cloud 控制台的「Network endpoint groups」(網路端點群組) 頁面。

    前往「Network endpoint groups」(網路端點群組)

  2. 按一下「Create network endpoint group」(建立網路端點群組)
  3. 輸入網路端點群組的名稱:example-fqdn-neg
  4. 將「Network endpoint group type」(網路端點群組類型) 設為「Network endpoint group (Internet)」(網路端點群組 (網際網路))
  5. 在「Default port」(預設通訊埠) 中輸入 443
  6. 將「New network endpoint」(新網路端點) 設為「Fully qualified domain name and port」(完整網域名稱與通訊埠)
  7. FQDN 請輸入 backend.example.com
  8. 將「Port type」(通訊埠類型) 設為「Default」(預設),並確認「Port number」(通訊埠編號)443
  9. 按一下「Create」(建立)

gcloud

  1. 建立網際網路 NEG,並將 --network-endpoint-type 設為 internet-fqdn-port (可連線至外部後端的主機名稱和通訊埠):

    gcloud compute network-endpoint-groups create example-fqdn-neg \
        --network-endpoint-type="internet-fqdn-port" --global
    
  2. 將端點新增至 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
    
  3. 列出已建立的網際網路 NEG:

    gcloud compute network-endpoint-groups list --global
    

    輸出內容:

    NAME                LOCATION   ENDPOINT_TYPE        SIZE
    example-fqdn-neg    global     INTERNET_FQDN_PORT   1
    

  4. 列出該 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

  1. 前往 Google Cloud 控制台的「Load balancing」(負載平衡) 頁面。

    前往「Load balancing」(負載平衡)

  2. 如要將後端服務新增至現有負載平衡器,請選取傳統版應用程式負載平衡器,然後按一下 「Menu」(選單) ,再選取「Edit」(編輯)
  3. 按一下「Backend configuration」(後端設定)
  4. 在「Backend services & backend buckets」(後端服務和後端 bucket) 選單中,選取「Create a backend service」(建立後端服務)
  5. 將後端服務的名稱設為 images
  6. 將「Backend type」(後端類型) 設為「Internet network endpoint group」(網際網路的網路端點群組)
  7. 選取負載平衡器與網際網路 NEG 之間要使用的通訊協定。在此範例中,請選取「HTTPS」
  8. 在「New backend」(新增後端) >「Internet network endpoint group」(網際網路的網路端點群組) 下方,選取 example-fqdn-neg,然後按一下「Done」(完成)
  9. 選取「Enable Cloud CDN」(啟用 Cloud CDN)
  10. 選用:修改快取模式存留時間設定。
  11. 在「Advanced configurations」(進階設定) 的「Custom request headers」(自訂要求標頭) 下方,按一下「Add header」(新增標頭)
    1. 「Header name」(標頭名稱) 請輸入 Host
    2. 「Header value」(標頭值) 請輸入 backend.example.com
  12. 按一下「Create」(建立)
  13. 視窗保持開啟,以便繼續操作。

將後端服務附加至現有網址對應

  1. 按一下「Host and path rules」(主機與路徑規則)
  2. 第一或前幾個資料列的右欄中顯示 Google Cloud 服務,其中一個已填入「Hosts」(主機) 與「Paths」(路徑) 的預設規則 Any unmatched (default)
  3. 確認右欄中已選取包含 images 的資料列。如果此資料列不存在,請按一下「Add host and path rules」(新增主機與路徑規則),然後選取 images。請依照下列資訊填入其他欄位:
    1. 在「Hosts」(主機) 中輸入 *
    2. 在「Paths」(路徑) 中輸入 /cart/id/1223515

檢查並完成

  1. 按一下「Review and finalize」(檢查並完成)
  2. 比較設定與打算建立的內容。
  3. 如果沒有任何問題,請按一下「Update」(更新)

gcloud

  1. 為 NEG 建立新的後端服務:

    gcloud compute backend-services create images \
       --global \
       --enable-cdn \
       --cache-mode=CACHE_MODE \
       --protocol=HTTP2
    

    CACHE_MODE 替換為下列其中一項,設定快取模式

    • CACHE_ALL_STATIC:自動快取靜態內容

    • USE_ORIGIN_HEADERS (預設):規定來源須設定有效的快取標頭,才能快取內容

    • FORCE_CACHE_ALL:快取所有內容,忽略 Cache-Control 回應標頭中的任何 privateno-storeno-cache 指令

  2. 設定後端服務,將自訂要求標頭 Host: backend.example.com 新增至要求:

    gcloud compute backend-services update images \
       --custom-request-header "Host: backend.example.com" --global
    
  3. 使用 backend-services add-backend 指令,將網際網路 NEG 新增至後端服務:

    gcloud compute backend-services add-backend images \
      --network-endpoint-group "example-fqdn-neg" \
      --global-network-endpoint-group \
      --global
    
  4. 建立新的比對規則,將新的後端服務附加至負載平衡器的網址對應,將要求導向該後端:

    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,必須使用 dignslookup 等工具查詢 _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.comexample.com 建立 A 記錄,請使用以下方法:

NAME                  TYPE     DATA
www                   A        30.90.80.100
@                     A        30.90.80.100

如果使用 Cloud DNS 做為 DNS 服務供應商,請參閱「新增、修改及刪除記錄」。

測試外部應用程式負載平衡器

負載平衡器設定完成後,即可開始將流量傳送至負載平衡器的 IP 位址。若已設定網域,也可將流量傳送至網域名稱。不過,DNS 傳播可能需要一段時間才能完成,因此可以先用 IP 位址測試。

  1. 前往 Google Cloud 控制台的「Load balancing」(負載平衡) 頁面。

    前往「Load balancing」(負載平衡)

  2. 點選剛剛建立的負載平衡器。

  3. 記下負載平衡器的 IP 位址。

  4. 若您是建立 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
    

  5. 選用:如果使用自訂網域,可能需要等待更新的 DNS 設定傳播完畢,再於網路瀏覽器中測試網域 (例如 backend.example.com)。

    如需疑難排解說明,請參閱「排解外部後端和網際網路 NEG 問題」。

測試 Cloud CDN

測試 1:直接命中 bucket 端點

這項測試會使用 VM 的 timewget 指令。此範例從 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 外部應用程式負載平衡器所用的標頭。如需自訂標頭的一般資訊,請參閱「設定自訂要求標頭」。如需具體範例,請參閱「設定具備外部後端的負載平衡器」。

後續步驟

  • 如要確認 Cloud CDN 是否從快取提供回應,請參閱「快取的記錄和指標」。
  • 如要瞭解哪些內容可快取或不可快取,請參閱「快取總覽」。
  • 如要查看 GFE 網路連接點,請參閱「快取位置」。