本文說明如何建立外部應用程式負載平衡器,將靜態內容的要求轉送至 Cloud Storage 值區。透過後端值區設定負載平衡器後,系統會將網址路徑開頭為 /love-to-fetch 的要求傳送至 us-east1 Cloud Storage 值區,而所有其他要求則會傳送至 europe-north1 Cloud Storage 值區,不論使用者位於哪個區域。
如果後端透過 HTTP(S) 提供動態內容,建議使用後端服務,而非後端值區。
如要直接在 Google Cloud 控制台按照逐步指南操作,請按一下「Guide me」(逐步引導):
Cloud Storage 值區做為負載平衡器後端
外部應用程式負載平衡器會利用網址對應,將來自指定網址路徑的流量導向後端。
在下圖中,負載平衡器將路徑為 /love-to-fetch/ 的流量傳送至 us-east1 區域的 Cloud Storage 值區,並將所有其他要求傳送至位於 europe-north1 區域的 Cloud Storage 值區。
根據預設,Cloud Storage 會使用與 Cloud CDN 相同的快取。在後端值區啟用 Cloud CDN 後,您就能使用 Cloud CDN 控制項管理內容。Cloud CDN 控制項包括快取模式、已簽署網址和撤銷。Cloud CDN 也可快取大型內容 (超過 10 MB)。如果未在後端值區啟用 Cloud CDN,您只能使用來源 Cache-Control 標頭,控管較小內容的快取,如 Cloud Storage 中繼資料所設定。
事前準備
請確認設定符合下列先決條件。如果您使用 gcloud storage 公用程式,可以按照「使用 gcloud 工具探索物件儲存空間」一文中的操作說明安裝。
設定預設專案
控制台
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
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
(
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
(
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 身分與存取權管理角色:
| 工作 | 必要角色 |
|---|---|
| 建立負載平衡器元件 | 網路管理員 |
| 建立 Cloud Storage 值區 | Storage 物件管理員 |
詳情請參閱下列指南:
設定 SSL 憑證資源
如為 HTTPS 負載平衡器,請按照下列文件說明建立 SSL 憑證資源:
建議使用 Google 代管的憑證。
這個範例假設您已有名為 www-ssl-cert 的 SSL 憑證資源。
準備 Cloud Storage 值區和內容
準備 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」(為值區命名) 方塊中,輸入符合命名規範的全域不重複名稱。
按一下「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
如要建立 buckets,請使用 google_storage_bucket 資源。
如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。
將內容轉移至 Cloud Storage 值區
這樣一來,您就能測試設定,並將下列映像檔從公開 Cloud Storage bucket 複製到自己的 Cloud Storage bucket。
gcloud
按一下「Activate Cloud Shell」(啟用 Cloud Shell)。
在 Cloud Shell 中執行下列指令,並將值區名稱變數改為您的 Cloud Storage 值區名稱:
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
如要將項目複製到值區,可以使用 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」(重新整理),藉此確認檔案已複製成功。
將 Cloud Storage 值區設為可公開讀取
將 Cloud Storage bucket 設為可公開讀取之後,網際網路中的所有使用者都能列出及查看當中的物件,並檢視物件的中繼資料 (ACL 除外)。請勿在公開 bucket 中存放機密資訊。
為降低機密資訊意外曝光的可能性,請勿在同一個值區中儲存公開物件和機密資料。
主控台
如要向所有使用者授予 bucket 中物件的檢視權限,請為每個 bucket 重複執行下列程序:
前往 Google Cloud 控制台的「Cloud Storage bucket」頁面。
依序點選值區名稱和「Permissions」(權限) 分頁標籤。
按一下「新增」。
在「New principals」(新增主體) 方塊中輸入
allUsers。在「Select a role」(請選擇角色) 方塊中,依序選取「Cloud Storage」>「Storage Object Viewer」(Storage 物件檢視者)。
按一下「Save」(儲存)。
按一下「Allow public access」(允許公開存取)。
gcloud
如要向所有使用者授予值區中物件的檢視權限,請執行下列指令:
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 成員。
保留外部 IP 位址
設定 Cloud Storage 值區後,您可以保留全域靜態外部 IP 位址,供觀眾連上負載平衡器。
這個步驟為選用,但建議您執行,因為靜態外部 IP 位址會提供單一地址,讓網域指向該地址。
主控台
前往 Google Cloud 控制台的「External IP addresses」(外部 IP 位址) 頁面。
按一下 [Reserve static address] (保留靜態位址)。
在「Name」(名稱) 方塊中輸入
example-ip。將「Network Service Tier」(網路服務級別) 設為「Premium」(進階級)。
將「IP version」(IP 版本) 設為「IPv4」。
將「Type」(類型) 設為「Global」(通用)。
按一下「保留」。
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 資源。
建立具備後端 bucket 的外部應用程式負載平衡器
這些操作說明涵蓋建立 HTTP 或 HTTPS 負載平衡器。如要建立 HTTPS 負載平衡器,必須在負載平衡器的前端新增 SSL 憑證資源。詳情請參閱「安全資料傳輸層 (SSL) 憑證總覽」。
主控台
選取負載平衡器類型
前往 Google Cloud 控制台的「Load balancing」(負載平衡)頁面。
- 點選「建立負載平衡器」。
- 在「Type of load balancer」(負載平衡器類型) 部分,選取「Application Load Balancer (HTTP/HTTPS)」(應用程式負載平衡器 (HTTP/HTTPS)),然後點選「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_2_NAME」。按一下 [確定]。
設定轉送規則
轉送規則會決定流量的導向方式,如要設定轉送,請設定主機規則和路徑比對器,這些是外部應用程式負載平衡器網址對應的設定元件。如要設定這個範例的規則,請按照下列指示操作:
- 按一下「Host and path rules」(主機與路徑規則)。
- 在
dogs的「Hosts」(主機) 欄位中輸入*,並在「Paths」(路徑) 欄位中輸入/love-to-fetch/*。
設定前端
按一下「前端設定」。
確認下列選項已設為指定的值:
屬性 值 (按照指示輸入值或選取選項) 通訊協定 HTTP 網路服務級別 進階 IP 版本 IPv4 IP 位址 example-ip 通訊埠 80 如要建立 HTTPS 負載平衡器,而非 HTTP 負載平衡器,您必須具備 SSL 憑證 (
gcloud compute ssl-certificates list),並填寫下列欄位:按一下 [完成]。
檢閱設定
按一下「檢查並完成」。
檢查「Frontend」(前端)、「Host and path rules」(主機與路徑規則) 和「Backend buckets」(後端值區)。
按一下「建立」,然後等待負載平衡器建立完成。
按一下負載平衡器的名稱 (http-lb)。
記下負載平衡器的 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
gcloud compute target-http-proxies create http-lb-proxy \ --url-map=http-lb
設定轉送規則
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
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 指令」。
將流量傳送至負載平衡器
負載平衡器設定完畢的幾分鐘後,您就可以開始將流量傳送至負載平衡器的 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 指令測試下列網址的回覆。請將 IP_ADDRESS 替換為負載平衡器的 IPv4 位址:
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 不支援這些參數。
下表摘要說明透過 Application Load Balancer 路由傳送要求時,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」(不支援的查詢參數) 錯誤。 |
限制
- 後端儲存空間僅適用於全域外部應用程式負載平衡器和傳統版應用程式負載平衡器。區域外部應用程式負載平衡器或任何其他負載平衡器類型都不支援這些功能。
- Identity-Aware Proxy 不支援後端 bucket。
* 傳統版應用程式負載平衡器不完全支援上傳至 Cloud Storage 值區。特別是上傳至 Cloud Storage 時,要求中的所有查詢參數都會遭到捨棄。
後續步驟