設定後端值區

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 值區的包裝函式

後端 bucket 支援下列項目:

如要瞭解 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 替換為專案 ID。 Google Cloud

Terraform

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID
   

建立 Cloud Storage 值區

如果您有現成但尚未指派給負載平衡器的 Cloud Storage bucket,可以跳到下一個步驟

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

主控台

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

    開啟「Buckets」(buckets) 頁面

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

    屬性 值 (按照指示輸入值或選取選項)
    名稱 為每個 bucket 輸入全域不重複的名稱。如果輸入的名稱不重複,系統會顯示訊息,請嘗試其他名稱。
    位置類型 多區域
    位置 選取區域,例如「美國 (多個美國地區)」
    預設儲存空間級別 標準
    存取權控管 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

如要建立 bucket,請使用 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 bucket

為了方便您測試設定,請將圖像檔案從公開的 Cloud Storage bucket 複製到自己的 Cloud Storage bucket。

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 bucket 設為公開

這個範例會將 Cloud Storage bucket 設為可公開讀取。建議您採用這種方式處理公開內容。設定完成後,網際網路上的任何使用者都能查看及列出您的物件和中繼資料 (ACL 除外)。為降低資料意外曝光的風險,您通常應為公開物件專門建立 Cloud Storage bucket。

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

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

主控台

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

    開啟「Buckets」(buckets) 頁面

  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 位址,請按一下「Reserve static address」(預約靜態位址)
  3. 將「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 指令」。

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

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

主控台

啟動外部應用程式負載平衡器設定程序

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

    前往「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. 檢查「Backend buckets」(後端值區)、「Host and path rules」(主機與路徑規則) 和「Frontend」(前端) 部分。
  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

設定轉送規則

  • 如果是全域外部應用程式負載平衡器,請使用 load-balancing-scheme=EXTERNAL_MANAGED 的 gcloud CLI 指令。這項設定提供進階流量管理功能
  • 如果是傳統版應用程式負載平衡器,請使用 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」(負載平衡) 頁面。

    前往「Load balancing」(負載平衡) 頁面

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

    在「Backend」(後端) 區段中,確認後端 bucket 健康狀態良好。後端 bucket 旁應會顯示綠色勾號。如看到其他資訊,請先嘗試重新載入頁面。 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頁面http://IP_ADDRESS/never-fetch/three-cats.jpg數次,應該會出現多次快取命中。

下列記錄項目顯示快取命中。如要查看快取命中次數,請開啟記錄檔探索工具,然後依轉送規則名稱篩選,即可在Google Cloud 控制台中查看。

開啟記錄檔探索工具

記錄檔探索工具

{
    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」(負載平衡) 頁面。

    前往「Load balancing」(負載平衡) 頁面

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

    在「Backend」(後端) 區段中,確認後端 bucket 健康狀態良好。後端 bucket 旁應會顯示綠色勾號。如看到其他資訊,請先嘗試重新載入頁面。 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 標頭。

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

停用 Cloud CDN

主控台

為單一後端 bucket 停用 Cloud CDN

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

    前往 Cloud CDN 頁面

  2. 在來源列的右側,按一下「選單」,然後選取「編輯」
  3. 取消勾選要停止使用 Cloud CDN 的任何後端值區。
  4. 按一下「更新」

為來源的所有後端 bucket 移除 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 是否從快取提供回應,請參閱查看記錄
  • 如要瞭解常見問題和解決方案,請參閱「疑難排解」一節。
  • 如要設定內容的篩選和存取權控管政策,請參閱邊緣安全政策