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

本文說明如何建立regional internal Application Load Balancer ,將靜態內容的要求轉送至 Cloud Storage 值區

事前準備

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

安裝 Google Cloud CLI

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

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

必要的角色

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

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

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

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

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

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

設定 SSL 憑證資源

如果 regional internal Application Load Balancer 使用 HTTPS 做為要求和回應通訊協定,請使用 Certificate Manager 建立 SSL 憑證資源,如以下文件所述:

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

建議使用 Google 代管的憑證。

限制

當 Cloud Storage 值區做為 regional internal Application Load Balancer的後端時,適用下列限制:

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

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

  • 為regional internal Application Load Balancer建立後端 bucket 時,無法整合 Cloud CDN。

  • 使用 regional internal Application Load Balancer 存取後端 bucket 時,系統僅支援 HTTP GET 方法。你可以從 bucket 下載內容,但無法透過regional internal Application Load Balancer 將內容上傳至 bucket。

  • 如果是 regional internal Application Load Balancer,Cloud Storage 值區僅支援負載平衡器設定所在的區域。不支援雙區域多區域 bucket。

設定總覽

您可以在區域中設定 regional internal Application Load Balancer ,如下列架構圖所示:

 regional internal Application Load Balancer 會將流量傳送至 Cloud Storage 後端。
將流量分配至 Cloud Storage (按一下即可放大)。

如架構圖所示,這個範例會在虛擬私有雲 (VPC) 網路中建立regional internal Application Load Balancer ,其中包含兩個後端 bucket,每個後端 bucket 都會參照 Cloud Storage bucket。Cloud Storage bucket 位於 us-east1 地區,您可以平衡各 bucket 之間的流量負載。

設定網路和子網路

在虛擬私有雲網路中,於要設定負載平衡器轉送規則的區域 us-east1 內設定子網路。此外,請在要設定負載平衡器的區域中,設定僅限 Proxy 的子網路 us-east1

這個範例會使用以下虛擬私人雲端網路、地區和子網路:

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

  • 負載平衡器的子網路us-east1 地區中名為 subnet-us 的子網路使用 10.1.2.0/24 做為其主要 IP 範圍。

  • 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. 在「Subnets」(子網路) 區段,將「Subnet creation mode」(子網路建立模式) 設為「Custom」(自訂)

  5. 在「New subnet」(新的子網路) 區段中,輸入以下資訊:

    1. Name (名稱):subnet-us
    2. 選取「區域」us-east1
    3. IP address range (IP 位址範圍):10.1.2.0/24
    4. 按一下 [完成]。
  6. 點選「建立」

gcloud

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

    gcloud compute networks create lb-network --subnet-mode=custom
    
  2. 使用 gcloud compute networks subnets create 指令,在 us-east1 地區的 lb-network 虛擬私有雲網路中建立子網路。

    gcloud compute networks subnets create subnet-us \
        --network=lb-network \
        --range=10.1.2.0/24 \
        --region=us-east1
    

設定僅限 Proxy 的子網路

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

這個僅限 Proxy 的子網路,會由與虛擬私有雲網路位於相同區域的所有 Envoy 型區域負載平衡器使用。每個地區和每個網路只能有一個用於特定用途的有效僅限 Proxy 子網路。在本範例中,我們會在 us-east1 地區建立僅限 Proxy 的子網路。

控制台

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

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

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

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

  4. 輸入下列資訊:

    1. 在「Name」(名稱) 中輸入 proxy-only-subnet-us
    2. 在「區域」部分輸入 us-east1
    3. 在「用途」部分,選取「Regional Managed Proxy」
    4. 在「IP address range」(IP 位址範圍) 中,輸入 10.129.0.0/23
  5. 按一下 [新增]。

gcloud

  • 使用 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
    

設定防火牆規則

這個範例使用輸入防火牆規則 fw-allow-ssh,允許透過通訊埠 22 存取用戶端 VM 的 SSH。

控制台

  1. 在 Google Cloud 控制台中,前往「Firewall policies」(防火牆政策) 頁面。

    前往「防火牆政策」頁面

  2. 按一下「Create firewall rule」(建立防火牆規則),以建立允許連入用戶端 VM 的 SSH 連線規則:

  3. 在「Create a firewall rule」(建立防火牆規則) 頁面中,輸入下列資訊:

    1. Name (名稱):fw-allow-ssh
    2. Network (網路):lb-network
    3. Direction of traffic (流量方向):「Ingress」(輸入)
    4. 「Action on match」(相符時執行的動作)允許
    5. 目標指定的目標標記
    6. 「Target tags」(目標標記)allow-ssh
    7. Source filter (來源篩選器):「IPv4 ranges」(IPv4 範圍)
    8. Source IPv4 ranges (來源 IPv4 範圍):0.0.0.0/0
    9. 通訊協定和通訊埠
      1. 選擇「指定的通訊協定和通訊埠」
      2. 勾選「TCP」核取方塊,然後輸入 22 做為「Port number」(通訊埠編號)。
  4. 點選「建立」

gcloud

  • 建立 fw-allow-ssh 防火牆規則,允許與具有 allow-ssh 網路標記的 VM 建立 SSH 連線。若省略 --source-ranges,Google Cloud 會將規則解讀為任何來源

    gcloud compute firewall-rules create fw-allow-ssh \
        --network=lb-network \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-ssh \
        --rules=tcp:22
    

設定 Cloud Storage bucket

設定 Cloud Storage bucket 的程序如下:

  1. 建立 bucket。
  2. 將內容複製到 bucket。
  3. 將 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」(Cloud Storage 值區) 頁面。 按照上述操作說明,在相同區域 (us-east1) 中建立第二個 bucket。

gcloud

  • 使用 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
    
    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。

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. 按一下「權限」按鈕。 系統會隨即顯示「Permissions」對話方塊。

  4. 在「Permissions」(權限) 對話方塊中,按一下「Add principal」(新增主體) 按鈕。 系統會顯示「授予存取權」對話方塊。

  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 位址

為負載平衡器的轉送規則保留靜態內部 IPv4 位址。詳情請參閱「預留靜態內部 IP 位址」。

控制台

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

    前往「預留靜態內部 IP 位址」

  2. 在「名稱」欄位中,輸入新地址的名稱。

  3. 在「IP version」(IP 版本) 清單中,選取「IPv4」

  4. 在「Network」(網路) 清單中,選取「lb-network」

  5. 在「Subnetwork」(子網路) 清單中,選取「subnet-us」

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

  7. 在「Static IP address」(靜態 IP 位址) 清單中,選取「Assign automatically」(自動指派)。建立負載平衡器後,這個 IP 位址會附加至負載平衡器的轉送規則。

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

gcloud

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

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

    ADDRESS_NAME 替換為新地址的名稱。

  2. 如要查看地址資訊,請使用 gcloud compute addresses describe 指令

    gcloud compute addresses describe ADDRESS_NAME
    

    複製傳回的 IP 位址,在下一節中做為 RESERVED_IP_ADDRESS 使用。

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

本節說明如何為regional internal Application Load Balancer建立下列資源:

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

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

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

    gcloud beta compute backend-buckets create backend-bucket-cats \
        --gcs-bucket-name=BUCKET1_NAME \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --region=us-east1
    
    gcloud beta compute backend-buckets create backend-bucket-dogs \
        --gcs-bucket-name=BUCKET2_NAME \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --region=us-east1
    
  2. 使用 gcloud beta compute url-maps create 指令建立網址對應,將傳入要求轉送至後端 bucket。

    gcloud beta compute url-maps create lb-map \
        --default-backend-bucket=backend-bucket-cats \
        --region=us-east1
    
  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 lb-map \
        --path-matcher-name=path-matcher-pets \
        --new-hosts=* \
        --backend-bucket-path-rules="/love-to-fetch/*=backend-bucket-dogs" \
        --default-backend-bucket=backend-bucket-cats \
        --region=us-east1
    
  4. 使用 gcloud compute target-http-proxies create 指令建立目標 Proxy

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

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

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

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

    CERTIFICATE_NAME 替換成您使用憑證管理工具建立的 SSL 憑證名稱

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

    HTTP 轉送規則可選擇是否預留 IP 位址,但 HTTPS 轉送規則必須預留 IP 位址。

    在本範例中,臨時 IP 位址會與負載平衡器的 HTTP 轉送規則建立關聯。只要轉送規則存在,臨時 IP 位址就會保持不變。如果您需要刪除轉送規則再重新建立,該規則可能會獲得新的 IP 位址。

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

    gcloud compute forwarding-rules create http-fw-rule-1 \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --network=lb-network \
        --subnet=subnet-us \
        --subnet-region=us-east1 \
        --ports=80 \
        --target-http-proxy=http-proxy \
        --target-http-proxy-region=us-east1 \
        --region=us-east1
    

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

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

    RESERVED_IP_ADDRESS 替換為您在「保留靜態內部 IP 位址」一節中複製的位址名稱。

向負載平衡器傳送 HTTP 要求

從內部用戶端 VM 將要求傳送至負載平衡器的轉送規則。

取得負載平衡器轉送規則的 IP 位址

取得 us-east1 區域中負載平衡器轉送規則的 IP 位址 (http-fw-rule-1),使用 curl 向該區域的虛擬 IP 位址 (VIP) 發出 HTTP 要求。

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

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

建立用戶端 VM 來測試連線

建立用戶端 VM,並將 HTTP 要求傳送至虛擬私有雲網路中的 VIP。用戶端 VM 可以位於與負載平衡器相同地區的任何區域中,也可以使用相同 VPC 網路中的任何子網路。在本範例中,您會在與負載平衡器轉送規則相同的子網路中,建立用戶端 VM。

  1. us-east1 區域中建立用戶端 VM。

    gcloud compute instances create client-a \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --network=lb-network \
        --subnet=subnet-us \
        --zone=us-east1-c \
        --tags=allow-ssh
    
  2. 建立與用戶端 VM 的 SSH 連線。

    gcloud compute ssh client-a --zone=us-east1-c
    
  3. 在本例中, regional internal Application Load Balancer 在虛擬私有雲網路的 us-east1 區域中,具有前端 VIP。使用 curl 向該區域的 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
    

    FORWARDING_RULE_IP_ADDRESS 替換為您在「取得負載平衡器轉送規則的 IP 位址」一節中複製的 IP 位址。

後續步驟