設定後端值區

Cloud CDN 會利用您選擇的全域外部應用程式負載平衡器或傳統版應用程式負載平衡器,提供轉送、健康狀態檢查和 Anycast IP 支援。由於全域外部應用程式負載平衡器可以有多種後端執行個體類型,包括 Compute Engine VM 執行個體、Google Kubernetes Engine Pod、Cloud Storage 儲存桶,或是 Google Cloud以外的外部後端,因此您可以選擇要為哪些後端 (來源) 啟用 Cloud CDN。

本設定指南說明如何建立外部應用程式負載平衡器,並啟用 Cloud CDN。本範例使用下列資源:

  • 預設的虛擬私有雲 (VPC) 網路
  • 預設網址對應
  • 預留的外部 IP 位址
  • 使用 Cloud Storage 值區做為後端
  • 單一負載平衡器後端值區,用來做為 Cloud Storage 值區的包裝函式

後端值區支援下列功能:

如要瞭解 Cloud CDN 的運作方式,請參閱 Cloud CDN 總覽

根據預設,Cloud Storage 會使用 Cloud CDN 使用的快取。如果您在後端值區啟用 Cloud CDN,就可以在內容上使用 Cloud CDN 控管功能。Cloud CDN 控制項包括快取模式、已簽署網址和撤銷。Cloud CDN 也能快取大型內容 (超過 10 MB)。如果您未在後端值區中啟用 Cloud CDN,就只能使用來源 Cache-Control 標頭,依 Cloud Storage 中繼資料設定,控制較小內容的快取。

負載平衡器後端

外部應用程式負載平衡器會利用網址對應,將來自指定網址的流量導向指定服務。下表列出可代管內容和服務的後端類型。

負載平衡器後端設定 一般媒體類型 後端類型
後端服務 動態 (例如資料)
  • 非代管執行個體群組
  • 代管執行個體群組
  • Google Cloud內部的網路端點群組
  • Google Cloud以外的網路端點群組
後端值區 靜態 (例如圖片)
  • Cloud Storage 值區 (本頁討論)

事前準備

主控台

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

    前往 Google Cloud 首頁

  2. 在「 Google Cloud」右側,從下拉式選單中選取專案。

gcloud

     gcloud config set project PROJECT_ID
   

PROJECT_ID 替換為您的 Google Cloud專案 ID。

Terraform

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID
   

建立 Cloud Storage 值區

如果您有尚未指派給負載平衡器的 Cloud Storage 值區,可以直接跳到下一個步驟

建立 Cloud Storage 值區做為 Cloud CDN 外部應用程式負載平衡器的後端時,建議您選擇多區域值區,這樣系統就會自動在多個 Google Cloud 區域複製物件。這麼做可以提升內容的可用性,並改善應用程式的容錯能力。

主控台

  1. 在 Google Cloud 控制台,開啟「Cloud Storage 值區」頁面。

    開啟「值區間」頁面

  2. 點選「建立值區」
  3. 在下表中指定欄位的值,其他欄位則保留預設值。

    屬性 值 (依指示輸入值或選取選項)
    名稱 為每個值區輸入全域不重複的名稱。如果輸入的名稱不具唯一性,系統會顯示訊息,提示您嘗試其他名稱。
    位置類型 多區域
    位置 選取區域,例如「美國 (多個美國地區)」
    預設儲存空間級別 標準
    存取權控管 Uniform
  4. 按一下 [建立]。

  5. 請記下新建立的 Cloud Storage 值區名稱,以便在後續步驟中使用。

gcloud

gcloud storage buckets create gs://BUCKET_NAME --project=PROJECT_ID --default-storage-class=standard --location=us-east1 --uniform-bucket-level-access

Terraform

如要建立值區,請使用 google_storage_bucket 資源

# Cloud Storage bucket
resource "random_id" "bucket_prefix" {
  byte_length = 8
}

resource "google_storage_bucket" "default" {
  name                        = "${random_id.bucket_prefix.hex}-my-bucket"
  location                    = "us-east1"
  uniform_bucket_level_access = true
  storage_class               = "STANDARD"
  // delete bucket and contents on destroy.
  force_destroy = true
  // Assign specialty files
  website {
    main_page_suffix = "index.html"
    not_found_page   = "404.html"
  }
}

如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。

將圖形檔案複製到 Cloud Storage 值區

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

gcloud

在 Cloud Shell 中執行下列指令。將 BUCKET_NAME 替換為專屬的 Cloud Storage 值區名稱:

gcloud storage cp gs://gcp-external-http-lb-with-bucket/three-cats.jpg gs://BUCKET_NAME/never-fetch/

Terraform

如要複製物件,請搭配使用 gcloud storage cp 指令的 local-exec Provisioner

resource "null_resource" "upload_image" {
  provisioner "local-exec" {
    command = "gcloud storage cp gs://gcp-external-http-lb-with-bucket/three-cats.jpg gs://${google_storage_bucket.default.name}/never-fetch/ --recursive"
  }
}

或者,如要上傳物件,請使用 google_storage_bucket_object 資源

# image object for testing, try to access http://<your_lb_ip_address>/test.jpg
resource "google_storage_bucket_object" "test_image" {
  name = "test-object"
  # Uncomment and add valid path to an object.
  #  source       = "/path/to/an/object"
  #  content_type = "image/jpeg"

  # Delete after uncommenting above source and content_type attributes
  content      = "Data as string to be uploaded"
  content_type = "text/plain"

  bucket = google_storage_bucket.default.name
}

如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。

在 Google Cloud 控制台中按一下「Refresh」,確認已複製圖形檔案。

將 Cloud Storage 值區設為公開

這個範例會將 Cloud Storage 值區設為可公開讀取。這是建議的公開內容處理方式。設定這個選項後,網際網路上的任何使用者都能查看及列出您的物件和中繼資料,但 ACL 除外。為降低意外洩漏資料的風險,您通常應為公開物件專用特定 Cloud Storage 值區。

以下是將整個 Cloud Storage 值區設為公開的替代做法:

下列程序會向所有使用者授予 Cloud Storage 值區中物件的檢視權限,讓值區可供公開讀取。

主控台

  1. 在 Google Cloud 控制台,開啟「Cloud Storage 值區」頁面。

    開啟「值區間」頁面

  2. 前往值區,然後按一下「Permissions」分頁標籤。
  3. 按一下「新增主體」
  4. 在「New principals」(新增主體) 中輸入 allUsers
  5. 在「請選擇角色」選單中,依序選取「Cloud Storage」>「Storage 物件檢視者」
  6. 按一下 [儲存]

gcloud

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

Terraform

如要將 Cloud Storage bucket 設為公開,請使用 google_storage_bucket_iam_member 資源

# make bucket public
resource "google_storage_bucket_iam_member" "default" {
  bucket = google_storage_bucket.default.name
  role   = "roles/storage.objectViewer"
  member = "allUsers"
}

如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。

保留外部 IP 位址

您的 Cloud Storage 值區已啟用並開始執行,請設定全域靜態外部 IP 位址,讓客戶可透過該位址連線至負載平衡器。

這個步驟為選用步驟,但建議您執行,因為靜態外部 IP 位址可提供單一位址,讓您將網域指向該位址。

主控台

  1. 在 Google Cloud 控制台中,前往「External IP addresses」(外部 IP 位址) 頁面。

    前往外部 IP 位址頁面

  2. 如要預留 IPv4 位址,請按一下「預約靜態位址」
  3. example-ip 的「Name」 指派給 example-ip
  4. 將「Network Service Tier」(網路服務級別) 設為「Premium」(進階級)
  5. 將「IP version」(IP 版本) 設為「IPv4」
  6. 將「Type」(類型) 設為「Global」(通用)
  7. 按一下「保留」

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 資源

# reserve IP address
resource "google_compute_global_address" "default" {
  name = "example-ip"
}

如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。

建立外部應用程式負載平衡器

在這個程序中,您會建立負載平衡器的後端值區,做為 Cloud Storage 值區的包裝函式。建立或編輯後端值區時,您可以啟用 Cloud CDN。

主控台

開始外部應用程式負載平衡器設定程序

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

    前往「負載平衡」頁面

  2. 在「HTTP(S) load balancing」(HTTP(S) 負載平衡) 之下,按一下 [Start configuration] (啟動設定)
  3. 選取「From Internet to my VMs」(從網際網路到我的 VM),然後按一下「Continue」(繼續)
  4. 在「進階流量管理」下方,選取下列任一選項:
    • 如果是傳統版應用程式負載平衡器,請選取「傳統版 HTTP(S) 負載平衡器」
    • 如果是全域外部應用程式負載平衡器,請選取「具備進階流量管理的 HTTP(S) 負載平衡器」
  5. 將「Name」設為 http-lb,然後繼續下一個步驟。

設定後端並啟用 Cloud CDN

建立負載平衡器的後端值區,做為 Cloud Storage 值區的包裝函式。建立或編輯後端值區時,您可以啟用 Cloud CDN。

  1. 按一下「後端設定」
  2. 在「後端服務和後端值區」下方,依序點選「建立或選擇後端服務與後端值區」和「後端值區 > 建立後端值區」
  3. 將「Name」設為 cat-backend-bucket。這個名稱在全域範圍內不必唯一,且可以與實際 Cloud Storage 值區的名稱不同。
  4. 在「Cloud Storage bucket」(Cloud Storage 值區) 下方,按一下「Browse」(瀏覽)
  5. 選取您建立的 Cloud Storage 全域專屬 BUCKET_NAME,然後按一下「選取」
  6. 按一下「啟用 Cloud CDN」

  7. (選用) 修改快取模式TTL 設定。

  8. 按一下 [建立]。

設定主機規則和路徑比對器

主機規則和路徑比對器是外部應用程式負載平衡器的網址對應設定元件。

在「Host and path rules」(主機與路徑規則) 中,您可以保留預設設定。

如需自訂設定範例,請參閱「將後端值區新增至負載平衡器」。

如要進一步瞭解主機規則和路徑比對器,請參閱網址對應簡介

設定前端

  1. 按一下「前端設定」
  2. 確認選項已設為指定的值。

    屬性 值 (輸入值或選取指定的選項)
    通訊協定 HTTP
    網路服務級別 進階級
    IP 版本 IPv4
    IP 位址 example-ip
    通訊埠 80

    如果您想建立 HTTPS 負載平衡器而非 HTTP 負載平衡器,則必須具備 SSL 憑證 (gcloud compute ssl-certificates list),並按照下列方式填寫欄位。

    屬性 值 (輸入值或選取指定的選項)
    通訊協定 HTTPS
    網路服務級別 進階級
    IP 版本 IPv4
    IP 位址 example-ip
    通訊埠 443
    憑證 選取憑證建立新憑證
  3. 按一下 [完成]

檢閱設定

  1. 按一下「檢查並完成」
  2. 查看「後端值區」、「主機與路徑規則」和「前端」部分。
  3. 按一下 [建立]。
  4. 等待負載平衡器建立完成。
  5. 按一下負載平衡器的名稱 (http-lb)。
  6. 記下負載平衡器的 IP 位址,以便在下一項工作中使用。這個位置稱為 IP_ADDRESS

gcloud

設定後端

gcloud compute backend-buckets create cat-backend-bucket \
    --gcs-bucket-name=BUCKET_NAME \
    --enable-cdn \
    --cache-mode=CACHE_MODE

CACHE_MODE 替換為下列任一項目,藉此設定快取模式

  • CACHE_ALL_STATICUSE_ORIGIN_HEADERS:使用根據 Cloud Storage 中的快取控制中繼資料設定的標頭。Cloud Storage 一律會向 Cloud CDN 提供 Cache-Control 標頭。如未明確選擇值,則會傳送預設值。

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

設定網址對應

gcloud compute url-maps create http-lb \
    --default-backend-bucket=cat-backend-bucket

設定目標 Proxy

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

設定轉送規則

  • 如為全域外部應用程式負載平衡器,請使用 gcloud CLI 指令搭配 load-balancing-scheme=EXTERNAL_MANAGED。這項設定提供進階流量管理功能
  • 如果是傳統版應用程式負載平衡器,請使用 load-balancing-scheme=EXTERNAL
gcloud compute forwarding-rules create http-lb-forwarding-rule \
    --load-balancing-scheme=LOAD_BALANCING_SCHEME \
    --network-tier=PREMIUM \
    --address=example-ip \
    --global \
    --target-http-proxy=http-lb-proxy \
    --ports=80

Terraform

設定後端

如要設定後端,請使用 google_compute_backend_bucket 資源

# backend bucket with CDN policy with default ttl settings
resource "google_compute_backend_bucket" "default" {
  name        = "cat-backend-bucket"
  description = "Contains beautiful images"
  bucket_name = google_storage_bucket.default.name
  enable_cdn  = true
  cdn_policy {
    cache_mode        = "CACHE_ALL_STATIC"
    client_ttl        = 3600
    default_ttl       = 3600
    max_ttl           = 86400
    negative_caching  = true
    serve_while_stale = 86400
  }
}

設定網址對應

如要設定後端,請使用 google_compute_url_map 資源

# url map
resource "google_compute_url_map" "default" {
  name            = "http-lb"
  default_service = google_compute_backend_bucket.default.id
}

設定目標 Proxy

如要設定目標 Proxy,請使用 google_compute_target_http_proxy 資源google_compute_target_https_proxy 資源

# http proxy
resource "google_compute_target_http_proxy" "default" {
  name    = "http-lb-proxy"
  url_map = google_compute_url_map.default.id
}

設定轉送規則

如要設定轉送規則,請使用 google_compute_global_forwarding_rule 資源

# forwarding rule
resource "google_compute_global_forwarding_rule" "default" {
  name                  = "http-lb-forwarding-rule"
  ip_protocol           = "TCP"
  load_balancing_scheme = "EXTERNAL"
  port_range            = "80"
  target                = google_compute_target_http_proxy.default.id
  ip_address            = google_compute_global_address.default.id
}
  • 如為全域外部應用程式負載平衡器,請搭配使用 load_balancing_scheme="EXTERNAL_MANAGED"。這項設定可提供進階流量管理功能
  • 如果是傳統版應用程式負載平衡器,請使用 load_balancing_scheme="EXTERNAL"

如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。

將流量傳送至後端 bucket

建立全域轉送規則後,可能需等待數分鐘時間,才能讓您的設定傳播到全世界。幾分鐘後,您就可以開始將流量傳送至負載平衡器的 IP 位址。

主控台

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

    前往「負載平衡」頁面

  2. 按一下 http-lb,即可展開您剛建立的負載平衡器。

    在「Backend」(後端) 區段中,確認後端值區健康狀態良好。後端桶旁應會顯示綠色勾號。如果看到其他資訊,請先嘗試重新載入頁面。 Google Cloud 控制台可能需要一段時間才會顯示後端的健康狀態良好。

  3. 在 Google Cloud 控制台顯示後端值區健康後,您可以前往 http://IP_ADDRESS/never-fetch/three-cats.jpg,使用網路瀏覽器測試負載平衡器。將 IP_ADDRESS 替換為負載平衡器的 IP 位址。瀏覽器應會顯示頁面,並於其中顯示圖形檔案。

gcloud

使用 curl 指令測試網址的回應。將 IP_ADDRESS 替換為負載平衡器的 IPv4 位址

請注意預留的 IPv4 位址:

gcloud compute addresses describe example-ip \
    --format="get(address)" \
    --global

傳送 curl 要求:

curl http://IP_ADDRESS/never-fetch/three-cats.jpg

確認 Cloud CDN 是否運作正常

如果您快速連續重新載入 http://IP_ADDRESS/never-fetch/three-cats.jpg 頁面多次,應會出現多個快取命中。

以下記錄項目顯示快取命中。如要在Google Cloud 主控台中查看快取命中,請開啟「記錄檔探索工具」,並依轉送規則名稱篩選。

開啟 Logs Explorer

記錄檔探索工具

{
    insertId: "1oek5rg3l3fxj7"
    jsonPayload: {
        @type: "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry"
        cacheId: "SFO-fbae48ad"
        statusDetails: "response_from_cache"
    }
    httpRequest: {
        requestMethod: "GET"
        requestUrl: "http://LOAD_BALANCER_IP_ADDRESS/never-fetch/three-cats.jpg"
        requestSize: "577"
        status: 254
        responseSize: "157"
        userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"
        remoteIp: "CLIENT_IP_ADDRESS"
        cacheHit: true
        cacheLookup: true
    }
    resource: {
        type: "http_load_balancer"
        labels: {
            zone: "global"
            url_map_name: "URL_MAP_NAME"
            forwarding_rule_name: "FORWARDING_RULE_NAME"
            target_proxy_name: "TARGET_PROXY_NAME"
            backend_service_name: ""
            project_id: "PROJECT_ID"
        }
    }
    timestamp: "2020-06-08T23:41:25.078651Z"
    severity: "INFO"
    logName: "projects/PROJECT_ID/logs/requests"
    trace: "projects/PROJECT_ID/traces/241d69833e64b3bf83fabac8c873d992"
    receiveTimestamp: "2020-06-08T23:41:25.588272510Z"
    spanId: "7b6537d3672e08e1"
}

主控台

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

    前往「負載平衡」頁面

  2. 按一下 http-lb,即可展開您剛建立的負載平衡器。

    在「Backend」(後端) 區段中,確認後端值區健康狀態良好。後端桶旁應會顯示綠色勾號。如果看到其他資訊,請先嘗試重新載入頁面。 Google Cloud 控制台可能需要一段時間才會顯示後端的健康狀態良好。

  3. 在 Google Cloud 控制台顯示後端值區健康後,您可以前往 http://IP_ADDRESS/never-fetch/three-cats.jpg,使用網路瀏覽器測試負載平衡器。將 IP_ADDRESS 替換為負載平衡器的 IP 位址。瀏覽器應會顯示頁面,並於其中顯示圖形檔案。

gcloud

使用 curl 指令測試網址的回應。將 IP_ADDRESS 替換為負載平衡器的 IPv4 位址

請注意預留的 IPv4 位址:

gcloud compute addresses describe example-ip \
    --format="get(address)" \
    --global

傳送 curl 要求:

curl -D- -o /dev/null /dev/null http://IP_ADDRESS/never-fetch/three-cats.jpg

系統會從 Cloud Storage 擷取內容,並由 Cloud CDN 快取,然後在內容到期或從快取中移除時,驗證並重新擷取。

快取內容的 Age 標頭大於 0。

需要在 TTL 前重新整理的內容,可以失效,並從 Cloud Storage 重新擷取。

停用 Cloud CDN

主控台

為單一後端值區停用 Cloud CDN

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

    前往 Cloud CDN 頁面

  2. 在來源列的右側,按一下「Menu」圖示 ,然後選取「Edit」
  3. 取消勾選要停止使用 Cloud CDN 的所有後端值區。
  4. 按一下「更新」

為來源移除所有後端值區的 Cloud CDN

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

    前往 Cloud CDN 頁面

  2. 在來源列的右側,按一下「選單」圖示 ,然後選取「移除」
  3. 按一下 [移除] 加以確認。

gcloud

gcloud compute backend-buckets update BACKEND_BUCKET_NAME \
    --no-enable-cdn

停用 Cloud CDN 並不會撤銷或清除快取內容。如果您在停用 Cloud CDN 後重新啟用這項服務,原有的大部分或所有快取內容應仍會保留在快取中。如果您不希望快取使用這些內容,則必須撤銷快取內容

後續步驟

  • 如要瞭解快取的內容,請參閱快取總覽
  • 如要在 GKE 中使用 Cloud CDN,請參閱「Ingress 功能」。
  • 如要確認 Cloud CDN 是否從快取提供回應,請參閱「查看記錄」。
  • 如需常見問題和解決方案的相關資訊,請參閱疑難排解
  • 如要為內容設定篩選和存取權控管政策,請參閱Edge 安全政策