本文說明如何建立外部應用程式負載平衡器,將靜態內容的要求轉送至 Cloud Storage bucket。透過後端 bucket 設定負載平衡器後,系統會將網址路徑開頭為 /love-to-fetch 的要求傳送至 us-east1 Cloud Storage bucket,而所有其他要求則會傳送至 europe-north1 Cloud Storage bucket,無論使用者位於哪個區域。
如果後端透過 HTTP(S) 提供「動態」內容,建議使用後端服務,而非後端 bucket。
如要直接在 Google Cloud 控制台中,按照這項工作的逐步指南操作,請按一下「Guide me」(逐步引導):
Cloud Storage bucket 做為負載平衡器後端
外部應用程式負載平衡器會利用網址對應,將來自指定網址路徑的流量導向後端。
在下圖中,負載平衡器會將路徑為 /love-to-fetch/ 的流量傳送至 us-east1 區域中的 Cloud Storage bucket。並將所有其他要求傳送至位於 europe-north1 區域的 Cloud Storage bucket。
根據預設,Cloud Storage 會使用與 Cloud CDN 相同的快取。在後端 bucket 啟用 Cloud CDN 後,就能使用 Cloud CDN 控制項來管理內容。Cloud CDN 控制項包括快取模式、經簽署的網址和撤銷。Cloud CDN 也可快取大型內容 (大於 10 MB)。如果沒有在後端 bucket 啟用 Cloud CDN,您只能依 Cloud Storage 中繼資料的設定,使用來源 Cache-Control 標頭控管小型內容的快取。
事前準備
請確認設定符合下列必要條件。如果您使用 gcloud storage 公用程式,可以按照「使用 Google Cloud CLI 工具探索物件儲存庫」中的操作說明安裝。
設定預設專案
控制台
- 登入 Google Cloud 帳戶。如果您未曾使用過 Google Cloud,歡迎 建立帳戶,親自體驗實際使用我們產品的成效。新客戶還能獲得價值 $300 美元的免費抵免額,用於執行、測試及部署工作負載。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
gcloud
gcloud config set project PROJECT_ID
將 PROJECT_ID 替換為您在本指南中使用的專案。
Terraform
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
權限
如要按照本指南操作,您需在專案中建立 Cloud Storage bucket 和負載平衡器。因此您必須是專案擁有者或編輯者,或是具備下列 Compute Engine IAM 角色:
| 工作 | 必要角色 |
|---|---|
| 建立負載平衡器元件 | 網路管理員 |
| 建立 Cloud Storage 值區 | Storage 物件管理員 |
如需詳細資訊,請參閱下列指南:
設定 SSL 憑證資源
如要建立負載平衡器,您必須擁有可附加至目標 Proxy 的 SSL 憑證資源。SSL 憑證資源可以是憑證對應組合,也可以是 Compute Engine SSL 憑證 (傳統憑證)。
憑證對應組合
您可以按照下列任一文件所述,建立憑證對應組合:
Compute Engine SSL 憑證
如果是 HTTPS 負載平衡器,請按照下列其中一份文件的說明,建立 Compute Engine SSL 憑證資源:
建議使用 Google 代管的憑證。
保留外部 IP 位址
建立負載平衡器之前,您可以保留全域靜態外部 IP 位址,讓目標對象透過該位址連線至負載平衡器。
這是選用步驟,但建議您執行,因為靜態外部 IP 位址可將您的網域固定指向單一位址。
控制台
前往 Google Cloud 控制台的「External IP addresses」(外部 IP 位址) 頁面。
按一下「Reserve static address」(保留靜態位址)。
在「Name」(名稱) 方塊中輸入
example-ip。將「Network Service Tier」(網路服務級別) 設為「Premium」(進階級)。
將「IP version」(IP 版本) 設為「IPv4」。
將「Type」(類型) 設為「Global」(通用)。
按一下「Reserve」(預留)。
gcloud
gcloud compute addresses create example-ip \
--network-tier=PREMIUM \
--ip-version=IPV4 \
--global
請記下預留的 IPv4 位址:
gcloud compute addresses describe example-ip \
--format="get(address)" \
--global
Terraform
如要保留外部 IP 位址,請使用 google_compute_global_address 資源。
選用:使用 BYOIP 位址
如果使用自備 IP 位址 (BYOIP),可將自己的公開位址匯入Google Cloud ,與 Google Cloud 資源搭配使用。舉例來說,如果您匯入了多個自己的 IPv4 位址,設定負載平衡器時,就可以將其中一個位址指派給轉送規則。請按照本文的操作說明建立負載平衡器,在「IP 位址」欄位提供 BYOIP 位址。
如要進一步瞭解如何使用 BYOIP,請參閱「使用自己的 IP 位址」。
準備 Cloud Storage bucket 和內容
準備 Cloud Storage bucket 的程序如下:
建立 bucket。
將內容複製到 bucket。
提供值區存取權。
建立 Cloud Storage 值區
在本範例中,您會建立兩個 Cloud Storage bucket,供負載平衡器存取。如為實際工作環境的部署作業,建議您選擇多區域 bucket,讓系統自動在多個 Google Cloud 區域中複製物件。這麼做有助於提高內容可用性,並提升應用程式的容錯能力。
請記下您建立的 Cloud Storage bucket 名稱,以便稍後使用。在本指南中,這兩個應用程式稱為 BUCKET_1_NAME 和 BUCKET_2_NAME。
控制台
前往 Google Cloud 控制台的「Cloud Storage bucket」頁面。
按一下「建立值區」。
在「Name your bucket」(為 bucket 命名) 方塊中,輸入符合命名規範的全域不重複名稱。
按一下「Choose where to store your data」(選取資料的儲存位置)。
將「Location type」(位置類型) 設為「Region」(區域)。
將「Location」(位置) 設為「europe-north1」。在本指南中,這稱為 BUCKET_1_NAME。
點選「建立」。
按一下「Buckets」,返回 Cloud Storage「Buckets」頁面。按照這些操作說明建立第二個 bucket,不過請將「Location」(位置)設為「us-east1」。這就是本指南中的BUCKET_2_NAME。
gcloud
gcloud storage buckets create gs://BUCKET_1_NAME --project=PROJECT_ID --default-storage-class=standard --location=europe-north1 --uniform-bucket-level-access
gcloud storage buckets create gs://BUCKET_2_NAME --project=PROJECT_ID --default-storage-class=standard --location=us-east1 --uniform-bucket-level-access
將 BUCKET_1_NAME 和 BUCKET_2_NAME 替換成要建立的值區名稱。
Terraform
如要建立 bucket,請使用 google_storage_bucket 資源。
如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。
將內容轉移至 Cloud Storage 值區
為了方便您稍後測試設定,請將下列圖片從公開 Cloud Storage bucket 複製到自己的 Cloud Storage bucket。
gcloud
按一下「Activate Cloud Shell」(啟用 Cloud Shell)。
在 Cloud Shell 中執行下列指令,並將 bucket 名稱變數改為您的 Cloud Storage bucket 名稱:
gcloud storage cp gs://gcp-external-http-lb-with-bucket/three-cats.jpg gs://BUCKET_1_NAME/never-fetch/
gcloud storage cp gs://gcp-external-http-lb-with-bucket/two-dogs.jpg gs://BUCKET_2_NAME/love-to-fetch/
Terraform
如要將項目複製到 bucket,可以使用 google_storage_bucket_object 資源。
或者,您也可以使用 null_resource 資源。
resource "null_resource" "upload_cat_image" {
provisioner "local-exec" {
command = "gcloud storage cp gs://gcp-external-http-lb-with-bucket/three-cats.jpg gs://${google_storage_bucket.bucket_1.name}/never-fetch/"
}
}
resource "null_resource" "upload_dog_image" {
provisioner "local-exec" {
command = "gcloud storage cp gs://gcp-external-http-lb-with-bucket/two-dogs.jpg gs://${google_storage_bucket.bucket_2.name}/love-to-fetch/"
}
}
在 Google Cloud 控制台,按一下各個 bucket 詳細資料頁面中的「Refresh」(重新整理),確認檔案已複製成功。
建立具備後端 bucket 的外部應用程式負載平衡器
這些操作說明涵蓋建立 HTTP 或 HTTPS 負載平衡器。如要建立 HTTPS 負載平衡器,您必須在負載平衡器的前端新增 SSL 憑證資源。詳情請參閱「SSL 憑證總覽」一文。
控制台
選取負載平衡器類型
前往 Google Cloud 控制台的「Load balancing」(負載平衡) 頁面。
- 按一下「Create load balancer」(建立負載平衡器)。
- 將「Type of load balancer」(負載平衡器類型) 設為「Application Load Balancer (HTTP/HTTPS)」(應用程式負載平衡器 (HTTP/HTTPS)),然後按一下「Next」(下一步)。
- 將「Public facing or internal」(公開或內部) 設為「Public facing (external)」(公開 (外部)),然後按一下「Next」(下一步)。
- 將「Global or single region deployment」(全域或單一區域部署) 設為「Best for global workloads」(最適合全域工作負載),然後按一下「Next」(下一步)。
- 將「Load balancer generation」(負載平衡器代別) 設為「Classic Application Load Balancer」(傳統版應用程式負載平衡器),然後按一下「Next」(下一步)。
- 按一下「Configure」(設定)。
基本設定
- 在「Name」(名稱) 方塊中輸入
http-lb。
設定後端
按一下「後端設定」。
按一下「Backend services and backend buckets」(後端服務和後端 bucket) 方塊,然後點選「Create a backend bucket」(建立後端 bucket)。
在「Backend bucket name」(後端 bucket 名稱) 方塊中輸入
cats。按一下「Cloud Storage bucket」(Cloud Storage 值區) 方塊中的「Browse」(瀏覽)。
選取「BUCKET_1_NAME」,然後按一下「Select」(選取)。如果先建立
cats後端 bucket,系統就會將其設為預設 bucket,並將所有不相符的流量要求導向該bucket。您無法在負載平衡器中變更預設後端 bucket 的重新導向規則。點選「建立」。
按照相同的程序建立名稱為
dogs的後端 bucket,然後選取「BUCKET_2_NAME」。按一下 [確定]。
設定路由規則
轉送規則會決定流量的導向方式,如要設定轉送,需設定主機規則和路徑比對器,這些是外部應用程式負載平衡器網址對應的設定元件。如要設定這個範例的規則,請按照下列指示操作:
- 按一下「Host and path rules」(主機與路徑規則)。
- 在
dogs的「Hosts」(主機) 欄位中輸入*,並在「Paths」(路徑) 欄位中輸入/love-to-fetch/*。
設定前端
點選「前端設定」。
確認下列選項已設為指定的值:
屬性 值 (依指示輸入值或選取選項) 通訊協定 HTTP 網路服務級別 Premium IP 版本 IPv4 IP 位址 example-ip通訊埠 80如要建立 HTTPS 負載平衡器,而非 HTTP 負載平衡器,您必須具備 SSL 憑證。請務必按照下列指示填寫欄位:
屬性 值 (依指示輸入值或選取選項) 通訊協定 HTTP(S) 網路服務級別 Premium IP 版本 IPv4 IP 位址 example-ip通訊埠 443憑證 在「Choose certificate repository」(選擇憑證存放區) 部分,選取「Use certificate map」(使用憑證對應組合) 或「Use classic certificates」(使用傳統版憑證)。視所選項目而定,選取憑證對應組合或傳統版憑證。 選用:啟用從 HTTP 重新導向至 HTTPS 的功能 勾選這個核取方塊,即可啟用重新導向功能。 勾選這個核取方塊後,系統會額外建立部分 HTTP 負載平衡器,使用的 IP 位址與 HTTPS 負載平衡器相同,且會將 HTTP 要求重新導向至負載平衡器的 HTTPS 前端。
只有在選取 HTTPS 通訊協定並使用預留的 IP 位址時,才能勾選這個核取方塊。
按一下「完成」。
檢查設定
點選「檢查並完成」。
檢查「Frontend」(前端)、「Host and path rules」(主機與路徑規則) 和「Backend buckets」(後端 bucket)。
按一下「Create」(建立),等待負載平衡器建立完成。
按一下負載平衡器的名稱 (http-lb)。
記下負載平衡器的 IP 位址,下一項任務中會用到。在本指南中,這個 IP 位址稱為 IP_ADDRESS。
gcloud
設定後端
gcloud compute backend-buckets create cats \ --gcs-bucket-name=BUCKET_1_NAME
gcloud compute backend-buckets create dogs \ --gcs-bucket-name=BUCKET_2_NAME
設定網址對應
gcloud compute url-maps create http-lb \ --default-backend-bucket=cats
gcloud compute url-maps add-path-matcher http-lb \ --path-matcher-name=path-matcher-2 \ --new-hosts=* \ --backend-bucket-path-rules="/love-to-fetch/*=dogs" \ --default-backend-bucket=cats
設定目標 Proxy
如果是 HTTP 負載平衡器,請建立目標 HTTP Proxy,將要求轉送至網址對應:
gcloud compute target-http-proxies create http-lb-proxy \ --url-map=http-lb
如果是 HTTPS 負載平衡器,請建立目標 HTTPS Proxy,將要求轉送至網址對應。目標 Proxy 會保留 HTTPS 負載平衡器的 SSL 憑證資源,因此您必須在這個步驟附加憑證或憑證對應組合:
gcloud compute target-https-proxies create https-lb-proxy \ --url-map=http-lb \ --ssl-certificates=SSL_CERTIFICATE_NAME
將 SSL_CERTIFICATE_NAME 替換為 Compute Engine SSL 憑證名稱。如果您建立的是 Certificate Manager 憑證對應組合,請將 --ssl-certificates=SSL_CERTIFICATE_NAME 替換為 --certificate-map=CERTIFICATE_MAP_NAME。
設定轉送規則
如果是 HTTP 負載平衡器,請建立全域轉送規則,將通訊埠 80 上的傳入 HTTP 要求轉送至目標 HTTP Proxy:
gcloud compute forwarding-rules create http-lb-forwarding-rule \ --load-balancing-scheme=EXTERNAL \ --network-tier=PREMIUM \ --address=example-ip \ --global \ --target-http-proxy=http-lb-proxy \ --ports=80
如果是 HTTPS 負載平衡器,請建立全域轉送規則,將通訊埠 443 上的傳入 HTTPS 要求轉送至目標 HTTPS Proxy:
gcloud compute forwarding-rules create https-lb-forwarding-rule \ --load-balancing-scheme=EXTERNAL \ --network-tier=PREMIUM \ --address=example-ip \ --global \ --target-https-proxy=https-lb-proxy \ --ports=443
Terraform
如要建立負載平衡器,請使用下列 Terraform 資源。
設定後端
如要建立後端,請使用 google_compute_backend_bucket 資源。
設定網址對應
如要建立網址對應,請使用 google_compute_url_map 資源。
設定目標 Proxy
如要建立目標 HTTP Proxy,請使用 google_compute_target_http_proxy 資源。
設定轉送規則
如要建立轉送規則,請使用 google_compute_global_forwarding_rule 資源。
注意:如要將模式變更為傳統版應用程式負載平衡器,請將 load_balancing_scheme 屬性設為 "EXTERNAL",而非 "EXTERNAL_MANAGED"。
如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。
開放 Cloud Storage bucket 存取權
您可以將 Cloud Storage bucket 設為可公開讀取,或限制存取權。
將 Cloud Storage 值區設為可公開讀取
將 Cloud Storage bucket 設為可公開讀取之後,網際網路中的所有使用者都能列出及查看當中的物件,並檢視物件的中繼資料 (ACL 除外)。請勿在公開 bucket 中存放機密資訊。
為降低私密資訊意外曝光的可能性,請勿將公開物件和私密資料儲存在同一個 bucket。
控制台
如要向所有使用者授予 bucket 中物件的檢視權限,請為每個 bucket 重複執行下列程序:
前往 Google Cloud 控制台的「Cloud Storage bucket」頁面。
依序點選值區名稱和「Permissions」(權限) 分頁標籤。
按一下「新增」。
在「New principals」(新增主體) 方塊中輸入
allUsers。在「Select a role」(請選擇角色) 方塊中,依序選取「Cloud Storage」>「Storage Object Viewer」(Storage 物件檢視者)。
按一下「Save」(儲存)。
點選「允許公開存取」。
gcloud
如要向所有使用者授予 bucket 中物件的檢視權限,請執行下列指令:
gcloud storage buckets add-iam-policy-binding gs://BUCKET_1_NAME --member=allUsers --role=roles/storage.objectViewer
gcloud storage buckets add-iam-policy-binding gs://BUCKET_2_NAME --member=allUsers --role=roles/storage.objectViewer
Terraform
如要向所有使用者授予值區中物件的檢視權限,請使用 google_storage_bucket_iam_member 資源並指定 allUsers 成員。
將 Cloud Storage bucket 設為私人
如要啟用私人 bucket 的存取權,請將必要的 IAM 角色授予服務帳戶 service-PROJECT_NUM@https-lb.iam.gserviceaccount.com。
建立後端 bucket 時,系統會自動建立這個服務帳戶。
控制台
如要僅向服務帳戶授予 bucket 中物件的檢視權限,請為每個 bucket 重複執行下列程序:
前往 Google Cloud 控制台的「Bucket」頁面。
前往要啟用存取權的 bucket,然後按一下「Permissions」(權限) 分頁標籤。
在「Permissions」(權限) 區段的「View by principals」(按照主體查看) 分頁中,按一下 「Grant Access」(授予存取權)。
在「Add principals」(新增主體) 專區的「New principals」(新增主體) 欄位中,輸入呼叫服務帳戶的電子郵件地址:
service-PROJECT_NUM@https-lb.iam.gserviceaccount.com。在「Assign roles」(指派角色) 區段的「Select a role」(選取角色) 欄位中,依序選取「Cloud Storage」>「Storage Object Viewer」(Storage 物件檢視者)。這個角色提供唯讀存取權。
按一下 [儲存]。
此外,為快取 bucket 提供的所有內容,請將快取模式設為「Force cache all content」(強制快取所有內容),並指定存留時間上限值。
gcloud
如要僅授予服務帳戶檢視 bucket 物件的權限,請執行下列指令:
gcloud storage buckets add-iam-policy-binding gs://BUCKET_1_NAME \
--member=serviceAccount:service-PROJECT_NUM@https-lb.iam.gserviceaccount.com \
--role=roles/storage.objectViewer
gcloud storage buckets add-iam-policy-binding gs://BUCKET_2_NAME \
--member=serviceAccount:service-PROJECT_NUM@https-lb.iam.gserviceaccount.com \
--role=roles/storage.objectViewer
更改下列內容:
BUCKET_1_NAME和BUCKET_2_NAME:要使用的 Cloud Storage bucket 名稱PROJECT_NUM: Google Cloud 專案的編號
此外,為快取從 bucket 提供的所有內容,請將快取模式設為「Force cache all content」(強制快取所有內容),並指定存留時間上限值。
將流量傳送至負載平衡器
負載平衡器設定完畢的幾分鐘後,您就可以開始將流量傳送至其 IP 位址。
控制台
透過網路瀏覽器前往下列位址來測試負載平衡器,並將 IP_ADDRESS 替換為負載平衡器的 IP 位址:
http://IP_ADDRESS/love-to-fetch/two-dogs.jpg
http://IP_ADDRESS/never-fetch/three-cats.jpg
如果您已設定 HTTP 負載平衡器,請確認瀏覽器不會自動重新導向至 HTTPS。
gcloud
使用 curl 指令測試下列網址的回應。如果是 HTTP 負載平衡器,請將 IP_ADDRESS 替換為負載平衡器的 IPv4 位址。如果是 HTTPS 負載平衡器,請將 http://IP_ADDRESS 替換為 https://DOMAIN,其中 DOMAIN 是與 SSL 憑證相關聯的網域名稱,可解析為負載平衡器的 IP 位址:
curl http://IP_ADDRESS/love-to-fetch/two-dogs.jpg
curl http://IP_ADDRESS/never-fetch/three-cats.jpg
Cloud Storage XML API 的查詢字串參數
如果透過應用程式負載平衡器傳送至後端 bucket 的要求包含特定查詢字串參數,用戶端會收到 HTTP 404 回應,並顯示「Unsupported query parameter」(不支援的查詢參數) 錯誤。這是因為當要求來自應用程式負載平衡器時,Cloud Storage XML API 不支援這些參數。
下表概述當要求透過應用程式負載平衡器轉送時,Cloud Storage XML API 如何回應各種查詢參數。參數會依觀察到的行為分組,協助您找出在此情境下,哪些參數會受到支援、忽略或拒絕。
| 參數類型 | 參數 | 觀察到的行為 |
|---|---|---|
| 支援的參數 |
generation、prefix、marker、max-keys |
新增這些參數 (並提供適當的值) 的運作方式,與 Cloud Storage XML API 說明文件所述相同。API 會傳回標準 HTTP 回應。 |
| 忽略的參數 |
acl、billing、compose、delimiter、encryption、encryptionConfig、response-content-disposition、response-content-type、tagging、versions、websiteConfig |
新增這些參數不會產生任何影響。 如果負載平衡器將這些參數傳遞至 Cloud Storage,Cloud Storage XML API 會忽略這些參數,並在回應時視為參數不存在。 |
| 遭拒的參數 |
cors、lifecycle、location、logging、storageClass、versioning |
Cloud Storage XML API 會傳回「Unsupported query parameter」(不支援的查詢參數) 錯誤。 |
限制
- 後端 bucket 僅適用於全域外部應用程式負載平衡器和傳統版應用程式負載平衡器。區域性外部應用程式負載平衡器或任何其他負載平衡器類型,都不支援這些功能。
- Identity-Aware Proxy 不支援後端 bucket。
- 傳統版應用程式負載平衡器不完全支援上傳至 Cloud Storage bucket。具體來說,上傳至 Cloud Storage 時,系統會捨棄要求中的所有查詢參數。
除非啟用 Cloud CDN,否則負載平衡器不支援使用已簽署的網址。