設定具備 Cloud Storage bucket 的區域外部應用程式負載平衡器

本文說明如何建立區域外部應用程式負載平衡器,將靜態內容的要求轉送至 Cloud Storage 值區

事前準備

請確認設定符合下列必要條件。

安裝 Google Cloud CLI

本指南中的部分操作只能使用 Google Cloud CLI 執行。如要安裝,請參閱「安裝 gcloud CLI」。

您可以在 API 和 gcloud CLI 參考資料文件中找到與負載平衡相關的指令。

必要的角色

如果您是專案建立者,系統會授予您擁有者角色 (roles/owner)。根據預設,擁有者角色 (roles/owner) 或編輯者角色 (roles/editor) 包含本文所述的必要權限。

如果您不是專案建立者,必須在專案中將必要權限授予適當的主體。舉例來說,主體可以是 Google 帳戶 (適用於一般使用者) 或服務帳戶。

如要取得建立 Cloud Storage bucket 和網路資源所需的權限,請要求管理員在專案中授予您下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

您或許也能透過自訂角色或其他預先定義的角色,取得必要權限。

如要進一步瞭解 Cloud Load Balancing 的角色和權限,請參閱「角色和權限」。如要進一步瞭解如何使用條件式授權定義轉送規則的 IAM 政策,請參閱「轉送規則的 IAM 條件」。

設定 SSL 憑證資源

如果是使用 HTTPS 做為要求和回應通訊協定的區域外部應用程式負載平衡器,您可以使用 Compute Engine SSL 憑證或 Certificate Manager 憑證,建立 SSL 憑證資源。

在本範例中,請使用憑證管理工具建立 SSL 憑證資源,如以下任一文件所述:

建立憑證後,即可將憑證附加至 HTTPS 目標 Proxy。

建議使用 Google 代管的憑證。

限制

Cloud Storage bucket 做為區域外部應用程式負載平衡器的後端時,有下列限制:

  • 系統不支援私有 bucket 存取權,因此後端 bucket 必須可透過網際網路公開存取。

  • 系統不支援已簽署的網址

  • 為區域外部應用程式負載平衡器建立後端 bucket 時,無法整合 Cloud CDN。

  • 使用區域性外部應用程式負載平衡器存取後端 bucket 時,系統僅支援 HTTP GET 方法。您可以從 bucket 下載內容,但無法透過區域外部應用程式負載平衡器將內容上傳至 bucket。

  • 如果是區域性外部應用程式負載平衡器,則僅支援在設定負載平衡器的區域中使用 Cloud Storage bucket。不支援雙區域多區域 bucket。

設定總覽

下圖顯示區域性外部應用程式負載平衡器,後端儲存空間與負載平衡器位於相同區域。

區域外部應用程式負載平衡器的轉送規則具有外部 IP 位址。

區域性外部應用程式負載平衡器會將流量傳送至 Cloud Storage 後端。
將流量分配至 Cloud Storage (按一下即可放大)。

在後續章節中,您將設定各種資源,如上圖所示。

設定網路和僅限 Proxy 的子網路

這個範例使用以下虛擬私有雲網路、地區和僅限 Proxy 的子網路:

  • 聯播網。網路為名為 lb-network自訂模式虛擬私有雲網路

  • Envoy Proxy 的子網路us-east1 地區中名為 proxy-only-subnet-us 的子網路使用 10.129.0.0/23 做為其主要 IP 範圍。

設定自訂模式虛擬私有雲網路

控制台

  1. 前往 Google Cloud 控制台的「VPC Networks」(虛擬私有雲網路) 頁面。

    前往「VPC networks」(虛擬私有雲網路)

  2. 按一下「建立虛擬私有雲網路」

  3. 在「Name」(名稱) 中輸入 lb-network

  4. 點選「建立」

gcloud

  1. 使用 gcloud compute networks create 指令,建立名為 lb-network 的自訂虛擬私有雲網路。

    gcloud compute networks create lb-network --subnet-mode=custom
    

設定僅限 Proxy 的子網路

僅限 Proxy 的子網路提供一組 IP 位址, Google Cloud 會代表您執行 Envoy Proxy。Proxy 會終止來自用戶端的連線,並建立與後端的新連線。

這個僅限 Proxy 的子網路,會由與虛擬私有雲網路位於相同區域的所有 Envoy 型區域負載平衡器使用。每個地區和每個網路只能有一個用於特定用途的有效僅限 Proxy 子網路。

控制台

  1. 前往 Google Cloud 控制台的「VPC Networks」(虛擬私有雲網路) 頁面。

    前往「VPC networks」(虛擬私有雲網路)

  2. 按一下您建立的 VPC 網路名稱。

  3. 在「子網路」分頁中,按一下「新增子網路」

  4. 輸入下列資訊:

    • Name (名稱):proxy-only-subnet-us
    • Region (區域):us-east1
    • 用途區域受管理 Proxy
    • IP address range (IP 位址範圍):10.129.0.0/23
  5. 按一下 [新增]。

gcloud

  1. 使用 gcloud compute networks subnets create 指令,在 us-east1 區域中建立僅限 Proxy 的子網路。

    gcloud compute networks subnets create proxy-only-subnet-us \
        --purpose=REGIONAL_MANAGED_PROXY \
        --role=ACTIVE \
        --region=us-east1 \
        --network=lb-network \
        --range=10.129.0.0/23
    

設定 Cloud Storage bucket

設定 Cloud Storage bucket 的程序如下:

  • 建立 bucket。
  • 將內容複製到 bucket。

建立 Cloud Storage 值區

在本範例中,您會在 us-east1 地區建立兩個 Cloud Storage bucket。

控制台

  1. 前往 Google Cloud 控制台的「Cloud Storage bucket」頁面。

    前往「Buckets」(值區) 頁面

  2. 按一下「建立」

  3. 在「開始使用」部分,輸入符合命名規範的全域不重複名稱。

  4. 按一下「Choose where to store your data」(選取資料的儲存位置)

  5. 將「Location type」(位置類型) 設為「Region」(區域)

  6. 從區域清單中選取「us-east1」

  7. 點選「建立」

  8. 按一下「Buckets」(值區),返回 Cloud Storage Buckets 頁面。 按照這些操作說明,在 us-east1 地區建立第二個 bucket。

gcloud

  1. 使用 gcloud storage buckets create 指令,在 us-east1 區域中建立第一個 bucket

    gcloud storage buckets create gs://BUCKET1_NAME \
        --default-storage-class=standard \
        --location=us-east1 \
        --uniform-bucket-level-access
    
  2. 使用 gcloud storage buckets create 指令,在 us-east1 區域中建立第二個 bucket

    gcloud storage buckets create gs://BUCKET2_NAME \
        --default-storage-class=standard \
        --location=us-east1 \
        --uniform-bucket-level-access
    

將變數 BUCKET1_NAMEBUCKET2_NAME 替換為 Cloud Storage 值區名稱。

將圖片檔案複製到 Cloud Storage bucket

如要測試設定,請將圖片檔案從公開的 Cloud Storage bucket 複製到您自己的 Cloud Storage bucket。

在 Cloud Shell 中執行下列指令,並將值區名稱變數改為不重複的 Cloud Storage 值區名稱:

gcloud storage cp gs://gcp-external-http-lb-with-bucket/three-cats.jpg gs://BUCKET1_NAME/love-to-purr/
gcloud storage cp gs://gcp-external-http-lb-with-bucket/two-dogs.jpg gs://BUCKET2_NAME/love-to-fetch/

將 Cloud Storage 值區設為可公開讀取

如要將 bucket 中的所有物件設為可供公開網路中的所有使用者讀取,請授予主體 allUsers Storage 物件檢視者角色 (roles/storage.objectViewer)。

控制台

如要向所有使用者授予 bucket 中物件的檢視權限,請為每個 bucket 重複執行下列程序:

  1. 前往 Google Cloud 控制台的「Cloud Storage bucket」頁面。

    前往「Buckets」(值區) 頁面

  2. 在值區清單中,找到您要設為公開的值區名稱,然後點選這個名稱。

  3. 選取 [權限] 分頁標籤。

  4. 在「Permissions」(權限) 部分中,按一下「Grant access」(授予存取權限) 按鈕。系統會顯示「授予存取權」對話方塊。

  5. 在「New principals」(新增主體) 欄位中輸入 allUsers

  6. 在「Select a role」(選取角色) 欄位中,在篩選方塊中輸入 Storage Object Viewer,然後從篩選結果中選取「Storage Object Viewer」(Storage 物件檢視者)

  7. 按一下 [儲存]

  8. 按一下「Allow public access」(允許公開存取)

gcloud

如要向所有使用者授予值區中物件的檢視權限,請執行 buckets add-iam-policy-binding 指令

gcloud storage buckets add-iam-policy-binding gs://BUCKET1_NAME \
    --member=allUsers \
    --role=roles/storage.objectViewer
gcloud storage buckets add-iam-policy-binding gs://BUCKET2_NAME \
   --member=allUsers \
   --role=roles/storage.objectViewer

保留負載平衡器的 IP 位址

為負載平衡器的轉送規則保留靜態外部 IP 位址。

控制台

  1. 前往 Google Cloud 控制台的「Reserve a static address」(保留靜態位址) 頁面。

    前往「保留靜態位址」頁面

  2. 選擇新地址的「名稱」

  3. 將「IP version」(IP 版本) 設為「IPv4」

  4. 在「Type」(類型) 中,選取「Regional」(地區)。

  5. 在「地區」部分,請選擇「us-east1」

  6. 將「Attached to」(連接至) 選項保留為「None」(無)。建立負載平衡器後,這個 IP 位址會附加至負載平衡器的轉送規則。

  7. 按一下「保留」,保留 IP 位址。

gcloud

  1. 如要預留靜態外部 IP 位址,請使用 gcloud compute addresses create 指令

    gcloud compute addresses create ADDRESS_NAME \
       --region=us-east1
    

    更改下列內容:

    • ADDRESS_NAME:您要稱呼此位址的名稱。
  2. 使用 gcloud compute addresses describe 指令查看結果:

    gcloud compute addresses describe ADDRESS_NAME
    

傳回的 IP 位址在下節中稱為 RESERVED_IP_ADDRESS

設定具備後端值區的負載平衡器

本節說明如何為區域外部應用程式負載平衡器建立下列資源:

  • 兩個後端值區。後端 bucket 會做為您先前建立的 Cloud Storage bucket 的 wrapper。
  • 網址對應
  • 目標 Proxy
  • 具有區域 IP 位址的轉送規則。轉送規則具有外部 IP 位址。

在本範例中,您可以使用 HTTP 或 HTTPS 做為用戶端與負載平衡器之間的要求與回應通訊協定。如要建立 HTTPS 負載平衡器,您必須在負載平衡器的前端新增 SSL 憑證資源。

如要使用 gcloud CLI 建立上述負載平衡元件,請按照下列步驟操作:

  1. 使用 gcloud beta compute backend-buckets create 指令,在 us-east1 區域中建立兩個後端 bucket。後端值區的負載平衡架構為 EXTERNAL_MANAGED

    gcloud beta compute backend-buckets create backend-bucket-cats \
        --gcs-bucket-name=BUCKET1_NAME \
        --load-balancing-scheme=EXTERNAL_MANAGED \
        --region=us-east1
    
    gcloud beta compute backend-buckets create backend-bucket-dogs \
        --gcs-bucket-name=BUCKET2_NAME \
        --load-balancing-scheme=EXTERNAL_MANAGED \
        --region=us-east1
    

    將變數 BUCKET1_NAMEBUCKET2_NAME 替換為 Cloud Storage 值區名稱。

  2. 使用 gcloud beta compute url-maps create 指令建立網址對應,將傳入要求轉送至後端 bucket。

    gcloud beta compute url-maps create URL_MAP_NAME \
        --default-backend-bucket=backend-bucket-cats \
        --region=us-east1
    

    將變數 URL_MAP_NAME 替換為網址對應的名稱。

  3. 使用 gcloud beta compute url-maps add-path-matcher 指令設定網址對應的主機和路徑規則。

    在本範例中,預設後端 bucket 為 backend-bucket-cats,可處理其中的所有路徑。不過,任何以 http://FORWARDING_RULE_IP_ADDRESS/love-to-fetch/two-dogs.jpg 為目標的要求都會使用 backend-bucket-dogs 後端。舉例來說,如果預設後端 (backend-bucket-cats) 中也存在 /love-to-fetch/ 資料夾,負載平衡器會優先處理 backend-bucket-dogs 後端,因為 /love-to-fetch/* 有專屬的路徑規則。

    gcloud beta compute url-maps add-path-matcher URL_MAP_NAME \
        --path-matcher-name=path-matcher-pets \
        --new-hosts=* \
        --backend-bucket-path-rules="/love-to-fetch/*=backend-bucket-dogs" \
        --default-backend-bucket=backend-bucket-cats
    

    將變數 URL_MAP_NAME 替換為網址對應的名稱。

  4. 使用 gcloud compute target-http-proxies create 指令建立目標 Proxy

    如果是 HTTP 流量,請建立目標 HTTP Proxy,將要求轉送至網址對應:

    gcloud compute target-http-proxies create http-proxy \
        --url-map=URL_MAP_NAME \
        --region=us-east1
    

    將變數 URL_MAP_NAME 替換為網址對應的名稱。

    如果是 HTTPS 流量,請建立目標 HTTPS Proxy,將要求轉送至網址對應。Proxy 是負載平衡器的一部分,用於保存 HTTPS 負載平衡器的 SSL 憑證。建立憑證後,即可將憑證附加至 HTTPS 目標 Proxy。

    如要附加 Certificate Manager 憑證,請執行下列指令:

    gcloud compute target-https-proxies create https-proxy \
        --url-map=URL_MAP_NAME \
        --certificate-manager-certificates=CERTIFICATE_NAME \
        --region=us-east1
    

    更改下列內容:

  5. 使用 gcloud compute forwarding-rules create 指令,在 us-east1 區域中建立含有 IP 位址的轉送規則

    如果是 HTTP 流量,請建立區域轉送規則,將傳入要求轉送至 HTTP 目標 Proxy:

    gcloud compute forwarding-rules create http-fw-rule \
        --load-balancing-scheme=EXTERNAL_MANAGED \
        --network=lb-network \
        --address=RESERVED_IP_ADDRESS \
        --ports=80 \
        --region=us-east1 \
        --target-http-proxy=http-proxy \
        --target-http-proxy-region=us-east1
    

    如果是 HTTPS 流量,請建立區域轉送規則,將傳入要求轉送至 HTTPS 目標 Proxy:

    gcloud compute forwarding-rules create https-fw-rule \
        --load-balancing-scheme=EXTERNAL_MANAGED \
        --network=lb-network \
        --address=RESERVED_IP_ADDRESS \
        --ports=443 \
        --region=us-east1 \
        --target-https-proxy=https-proxy \
        --target-https-proxy-region=us-east1
    

向負載平衡器傳送 HTTP 要求

負載平衡服務已開始執行,接著可以向負載平衡器的轉送規則傳送要求。

  1. 取得負載平衡器轉送規則的 IP 位址 (http-fw-rule),該規則位於 us-east1 區域。

      gcloud compute forwarding-rules describe http-fw-rule \
          --region=us-east1
    

    複製傳回的 IP 位址,以便在下一步中做為 FORWARDING_RULE_IP_ADDRESS 使用。

  2. 使用 curl 向轉送規則的虛擬 IP 位址 (VIP) 發出 HTTP 要求。

      curl http://FORWARDING_RULE_IP_ADDRESS/love-to-purr/three-cats.jpg --output three-cats.jpg
    
      curl http://FORWARDING_RULE_IP_ADDRESS/love-to-fetch/two-dogs.jpg --output two-dogs.jpg
    

後續步驟