設定後端 bucket

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

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

  • 預設虛擬私有雲 (VPC) 網路
  • 一個預設網址對應
  • 一個預留的外部 IP 位址
  • 一個 Cloud Storage bucket,設為後端
  • 單一負載平衡器後端 bucket,設為 Cloud Storage bucket 的 wrapper

後端 bucket 支援下列項目:

  • 任何儲存空間級別的 Cloud Storage bucket,包括多區域 bucket
  • 在 Google 全球邊緣快取內容的相關 Cloud CDN 政策

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

根據預設,Cloud Storage 會使用與 Cloud CDN 相同的快取。在後端 bucket 啟用 Cloud CDN 後,就能使用 Cloud CDN 控制項來管理內容。Cloud CDN 控制項包括快取模式、已簽署的網址和撤銷。Cloud CDN 也可快取大型內容 (大於 10 MB)。如果沒有在後端 bucket 啟用 Cloud CDN,您只能依 Cloud Storage 中繼資料的設定,使用來源 Cache-Control 標頭控管小型內容的快取。

負載平衡器後端

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

負載平衡器後端設定 常見媒體類型 後端類型
後端服務 動態 (例如資料)
  • 非代管執行個體群組
  • 代管執行個體群組
  • Google Cloud內部網路端點群組
  • Google Cloud外部網路端點群組
後端 bucket 靜態 (例如圖片)
  • Cloud Storage bucket (如本頁所說明)

事前準備

控制台

  1. 前往 Google Cloud 控制台的「Home」(首頁)

    前往 Google Cloud 首頁

  2. 從 Google Cloud右邊的下拉式選單中選取專案。

gcloud

     gcloud config set project PROJECT_ID
   

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

Terraform

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID
   

選用:使用 BYOIP 位址

如要使用自己的 IP (BYOIP),可將您的公開位址匯入Google Cloud ,與 Google Cloud 資源搭配使用。舉例來說,如果您匯入了多個自己的 IPv4 位址,設定負載平衡器時,就可以將其中一個位址指派給轉送規則。按照本文的操作說明建立外部應用程式負載平衡器時,請在「IP 位址」欄位提供 BYOIP 位址

如要進一步瞭解如何使用 BYOIP,請參閱「使用自己的 IP 位址」。

建立 Cloud Storage bucket

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

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

控制台

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

    開啟「bucket」頁面

  2. 點選「Create bucket」(建立 bucket)
  3. 為下表中的欄位指定值,其他欄位請保留預設值。

    屬性 值 (依指示輸入值或選取選項)
    名稱 為每個 bucket 輸入全域不重複的名稱。請注意,如果輸入的名稱重複,系統會顯示訊息,要求改用其他名稱。
    位置類型 Multi-region
    位置 選取區域,例如「us (multiple regions in United States)」(us (多個美國區域))
    預設儲存空間級別 Standard
    存取控管 Uniform
  4. 按一下「Create」(建立)

  5. 請記下新建立的 Cloud Storage bucket 名稱,後續步驟中會用到。

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 bucket 名稱:

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

Terraform

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

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」頁面。

    開啟「bucket」頁面

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

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 bucket 已開始運作,請設定全域靜態外部 IP 位址,方便客戶透過該位址連線至負載平衡器。

這是選用步驟,但建議您執行,因為靜態外部 IP 位址可將您的網域固定指向單一位址。

控制台

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

    前往「External IP addresses」(外部 IP 位址) 頁面

  2. 如要預留 IPv4 位址,請點選「Reserve static address」(預留靜態位址)
  3. 將「Name」(名稱) 設為 example-ip
  4. 將「Network Service Tier」(網路服務級別) 設為「Premium」
  5. 將「IP version」(IP 版本) 設為「IPv4」
  6. 將「Type」(類型) 設為「Global」(通用)
  7. 按一下「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 資源

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

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

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

您將透過這個程序建立負載平衡器的後端 bucket,並設為 Cloud Storage bucket 的 wrapper。建立或編輯後端 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. 在「Advanced traffic management」(進階流量管理) 下方,選取下列任一做法:
    • 如果使用傳統版應用程式負載平衡器,請選取「Classic HTTP(S) Load Balancer」(傳統版 HTTP(S) 負載平衡器)
    • 如果使用全域外部應用程式負載平衡器,請選取「HTTP(S) Load Balancer with Advanced Traffic Management」(具備進階流量管理功能的 HTTP(S) 負載平衡器)
  5. 將「Name」(名稱) 設為 http-lb,然後執行下一個步驟。

設定後端並啟用 Cloud CDN

建立負載平衡器的後端 bucket,並設為 Cloud Storage bucket 的 wrapper。建立或編輯後端 bucket 時,您可以啟用 Cloud CDN。

  1. 按一下「Backend configuration」(後端設定)
  2. 在「Backend services & backend buckets」(後端服務和後端 bucket) 下方,依序點選「Create or select backend services & backend buckets」(建立或選取後端服務和後端 bucket) >「Backend buckets」(後端 bucket) >「Create a backend bucket」(建立後端 bucket)
  3. 將「Name」(名稱) 設為 cat-backend-bucket。這個名稱無需全域不重複,也不必與實際的 Cloud Storage bucket 名稱相同。
  4. 在「Cloud Storage bucket」下方,按一下「Browse」(瀏覽)
  5. 選取您建立的 Cloud Storage 全域不重複 BUCKET_NAME,然後按一下「Select」(選取)
  6. 按一下「Enable Cloud CDN」(啟用 Cloud CDN)

  7. (選用) 修改快取模式存留時間設定。

  8. 按一下「Create」(建立)

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

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

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

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

如要進一步瞭解主機規則和路徑比對器,請參閱「網址對應總覽」。

設定前端

  1. 按一下「Frontend configuration」(前端設定)
  2. 確認各選項已設為下列值。

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

    如要建立 HTTPS 負載平衡器,而非 HTTP 負載平衡器,您必須具備 SSL 憑證 (gcloud compute ssl-certificates list),並填入下列欄位。

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

檢查設定

  1. 按一下「Review and finalize」(檢查並完成)
  2. 檢查「Backend buckets」(後端 bucket)、「Host and path rules」(主機與路徑規則) 和「Frontend」(前端) 的設定。
  3. 按一下「Create」(建立)
  4. 等待負載平衡器建立完成。
  5. 按一下負載平衡器的名稱 (http-lb)。
  6. 記下負載平衡器的 IP 位址,下一項任務中會用到。之後會用 IP_ADDRESS 來稱呼這個 IP 位址。

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

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

  2. 點選 http-lb,展開剛才建立的負載平衡器。

    在「Backend」(後端) 部分,確認後端 bucket 健康狀態良好,後端 bucket 旁應該會顯示綠色勾號。如果顯示其他內容,請先嘗試重新載入頁面。 Google Cloud 控制台可能需要一段時間,才會顯示後端健康狀態良好。

  3. Google Cloud 控制台顯示後端 bucket 健康狀態良好後,您可以前往 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,然後依轉送規則名稱篩選。

開啟 Logs Explorer

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

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

  2. 點選 http-lb,展開剛才建立的負載平衡器。

    在「Backend」(後端) 部分,確認後端 bucket 健康狀態良好,後端 bucket 旁應該會顯示綠色勾號。如果顯示其他內容,請先嘗試重新載入頁面。 Google Cloud 控制台可能需要一段時間,才會顯示後端健康狀態良好。

  3. Google Cloud 控制台顯示後端 bucket 健康狀態良好後,您可以前往 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 標頭大於零。

如果需要在存留時間之前更新內容,可以設為失效再從 Cloud Storage 重新擷取。

停用 Cloud CDN

控制台

為單一後端 bucket 停用 Cloud CDN

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

    前往「Cloud CDN」頁面

  2. 點選來源列右側的「Menu」(選單) ,然後選取「Edit」(編輯)
  3. 找到要停止使用 Cloud CDN 的後端 bucket,取消勾選其核取方塊。
  4. 按一下「Update」(更新)

為特定來源的所有後端 bucket 移除 Cloud CDN

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

    前往「Cloud CDN」頁面

  2. 點選來源列右側的「Menu」(選單) ,然後選取「Remove」(移除)
  3. 按一下「Remove」(移除) 確認操作。

gcloud

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

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

後續步驟

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