服務來自多個區域的流量

在多個區域部署服務,並將使用者路由至最近的區域,即可更快回應全球各地的使用者。部署到多個區域可降低延遲時間,並在區域服務中斷時提供更高的可用性。

由於 Cloud Run 服務會部署到個別區域,因此您必須將服務部署到多個區域,然後為服務設定全域負載平衡

您可以使用 Cloud Run 服務健康狀態,自動執行跨區域容錯移轉。

事前準備

  1. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Verify that billing is enabled for your Google Cloud project.

  3. 在 Google Cloud 專案中設定 Cloud Run 開發環境
  4. 安裝並初始化 gcloud CLI
  5. 確認您的帳戶具備下列 IAM 角色:
  6. 授予角色

    控制台

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

      前往「IAM」頁面
    2. 選取專案。
    3. 按一下「Grant access」(授予存取權)
    4. 在「New principals」(新增主體) 欄位中,輸入您的使用者 ID。這通常是部署 Cloud Run 服務時使用的 Google 帳戶電子郵件地址。

    5. 在「Select a role」(選取角色) 清單中,選取角色。
    6. 如要授予其他角色,請按一下「Add another role」(新增其他角色),然後選取其他角色。
    7. 按一下「Save」(儲存)

    gcloud

    如要在專案中將必要的 IAM 角色授予帳戶,請按照下列步驟操作:

            gcloud projects add-iam-policy-binding PROJECT_ID \
                --member=PRINCIPAL \
                --role=ROLE
            

    更改項目:

    • PROJECT_NUMBER 改成您的 Google Cloud 專案編號。
    • PROJECT_ID 替換為 Google Cloud 專案 ID。
    • PRINCIPAL,您要為該帳戶新增繫結。這通常是部署 Cloud Run 服務時使用的 Google 帳戶電子郵件地址。
    • ROLE,並將角色新增至部署者帳戶。
  7. 請參閱 Cloud Run 定價頁面。您可以使用 Pricing Calculator 根據預測用量估算費用。
  8. 執行下列指令,啟用 Artifact Registry、Cloud Build、Cloud Run Admin API、Compute Engine 和 Network Services API:
  9.   gcloud services enable artifactregistry.googleapis.com \
        cloudbuild.googleapis.com \
        run.googleapis.com \
        compute.googleapis.com \
        networkservices.googleapis.com
      

將服務部署至多個區域

您設定的資源調度參數會套用至多個區域。舉例來說,在多區域部署作業中,每個區域的執行個體數量下限值都適用。

您可以使用下列其中一種方法,將相同服務部署至多個區域:

部署多區域服務

本節說明如何透過單一 gcloud CLI 指令,或使用 YAML 或 Terraform 檔案,部署及設定多區域服務。

gcloud

  • 如要建立及部署多區域服務,請使用 --regions 旗標執行 gcloud run deploy 指令:

    gcloud run deploy SERVICE_NAME \
      --image=IMAGE_URL \
      --regions=REGIONS

    更改下列內容:

    • SERVICE_NAME:要部署的多區域服務名稱。
    • IMAGE_URL:容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/hello:latest
    • REGIONS:要部署的多個區域清單。例如:europe-west1,asia-east1

YAML

  1. 使用 run.googleapis.com/regions 屬性設定要部署服務的多個區域,為服務建立 YAML 檔案

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE_NAME
      annotations:
        run.googleapis.com/regions: REGIONS
    spec:
      template:
        spec:
          containers:
          - image: IMAGE_URL

    更改下列內容:

    • SERVICE_NAME:要部署至的多區域服務名稱。
    • REGIONS:要更新的多個區域清單。例如:europe-west1,asia-east1
    • IMAGE_URL:容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/hello:latest
  2. 使用下列指令建立服務:

    gcloud run multi-region-services replace service.yaml

Terraform

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

在 Terraform 設定的 google_cloud_run_v2_service 資源中新增下列項目。

resource "google_cloud_run_v2_service" "default" {
  name     = "cloudrun-service-multi-region"
  location = "global"

  multi_region_settings {
    regions = [
      "REGION_1",
      "REGION_2",
    ]
  }

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
  }
}

"REGION_1""REGION_2" 替換為所需的每個Google Cloud 區域。例如 europe-west1us-central1

更新多區域服務

本節說明如何透過單一 gcloud CLI 指令或 YAML 檔案,在多區域服務中新增或移除區域。

gcloud

如要從多區域服務新增或移除區域,請執行 gcloud run multi-region-services update 指令。

  • 如要將多區域服務新增至其他區域,請使用 --add-regions 旗標:

    gcloud run multi-region-services update SERVICE_NAME \
      --add-regions=REGIONS
  • 如要從一或多個區域移除多區域服務,請使用 --remove-regions 旗標:

    gcloud run multi-region-services update SERVICE_NAME \
      --remove-regions=REGIONS

    更改下列內容:

    • SERVICE_NAME:要更新的多區域服務名稱。
    • REGIONS:要新增或移除服務的區域。例如:us-central1,asia-east1

YAML

  1. 如要更新現有的多區域服務,請下載其 YAML 設定

    gcloud run multi-region-services describe SERVICE_NAME --format export > service.yaml
  2. 更新 run.googleapis.com/regions 屬性,新增或移除要部署服務的地區清單:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE_NAME
      annotations:
        run.googleapis.com/regions: REGIONS

    更改下列內容:

    • SERVICE_NAME:要部署至的多區域服務名稱。
    • REGIONS:您要將服務修訂版本部署至的新多個區域清單。
  3. 使用下列指令更新服務:

    gcloud run multi-region-services replace service.yaml

刪除多區域服務

  • 如要刪除多區域服務,請執行 gcloud run multi-region-services delete 指令:

    gcloud run multi-region-services delete SERVICE_NAME

    SERVICE_NAME 替換為要刪除的多區域服務名稱。

設定全域外部應用程式負載平衡器

本節說明如何設定全域外部應用程式負載平衡器,並使用代管 TLS 憑證保護網域,指向全域任播 IP 位址,將使用者導向部署服務的最近 Google 資料中心。

如果區域性 Cloud Run 服務停止回應或傳回錯誤,下列各節所述的架構不會自動將要求轉送至其他區域。

如要提高多區域服務的可用性,請採取下列做法:

設定區域網路端點群組

針對上一個步驟中部署的每個區域,您必須按照下列操作說明建立無伺服器網路端點群組 (NEG)

gcloud CLI

  1. REGION 中為 Cloud Run 服務建立網路端點群組:

    gcloud compute network-endpoint-groups create NEG_NAME \
      --region=REGION \
      --network-endpoint-type=serverless \
      --cloud-run-service=SERVICE_NAME

    更改下列內容:

    • NEG_NAME,例如 myservice-neg-uscentral1
    • REGION 改為服務部署的區域。
    • SERVICE_NAME 改為您的服務名稱。
  2. 針對每個區域重複上述步驟

Terraform

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

  1. run_regions 變數中指定的每個區域,設定 Cloud Run 服務的網路端點群組,並命名為 myservice-neg

    resource "google_compute_region_network_endpoint_group" "lb_default" {
      provider              = google-beta
      count                 = length(local.run_regions)
      name                  = "myservice-neg"
      network_endpoint_type = "SERVERLESS"
      region                = local.run_regions[count.index]
      cloud_run {
        service = google_cloud_run_v2_service.run_default[count.index].name
      }
    }

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

建立全域外部應用程式負載平衡器時,需要建立各種網路資源,並將這些資源連結在一起:

gcloud

  1. 預留靜態 IP 位址,這樣在重新建立負載平衡器時,就不必更新 DNS 記錄。
    gcloud compute addresses create --global SERVICE_IP
    在上述指令中,請將 SERVICE_IP 替換為 IP 位址資源的名稱 (例如 myservice-ip)。

    這個 IP 位址是全域任播 IPv4 位址,會將流量轉送至最靠近訪客的 Google 資料中心或服務點。

  2. 建立後端服務。
    gcloud compute backend-services create \
      --global BACKEND_NAME \
      --load-balancing-scheme=EXTERNAL_MANAGED

    BACKEND_NAME 替換為您要授予後端服務的名稱。例如:myservice-backend

  3. 將網路端點群組新增至後端服務:

    gcloud compute backend-services add-backend --global BACKEND_NAME 
    --network-endpoint-group-region=REGION
    --network-endpoint-group=NEG_NAME

    為區域指定您在上一個步驟中建立的 NEG_NAME

  4. 建立網址對應。
    gcloud compute url-maps create URLMAP_NAME --default-service=BACKEND_NAME

    URLMAP_NAME 替換為您要為網址對應指定的名稱 (例如 myservice-urlmap)。

  5. 為網域建立代管的傳輸層安全標準 (TLS) 憑證,以提供 HTTPS 流量。(將 example.com 替換成您的網域名稱)。
    gcloud compute ssl-certificates create CERT_NAME \
      --domains=example.com

    CERT_NAME 替換為您要為代管 SSL 憑證設定的名稱 (例如 myservice-cert)。

  6. 建立目標 HTTPS Proxy。
    gcloud compute target-https-proxies create HTTPS_PROXY_NAME \
      --ssl-certificates=CERT_NAME \
      --url-map=URLMAP_NAME

    HTTPS_PROXY_NAME 替換為要授予目標 HTTPS Proxy 的名稱 (例如 myservice-https)。

  7. 建立轉送規則,將您建立的網路資源連結至 IP 位址。
    gcloud compute forwarding-rules create --global FORWARDING_RULE_NAME \
      --target-https-proxy=HTTPS_PROXY_NAME \
      --address=SERVICE_IP \
      --ports=443 \
      --load-balancing-scheme=EXTERNAL_MANAGED 

    FORWARDING_RULE_NAME 替換為要建立的轉送規則資源名稱。例如:myservice-lb

Terraform

除了本節所述步驟,您也可以使用全域 HTTP 負載平衡器 Terraform 模組

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

  1. 設定 IP 位址:

    resource "google_compute_global_address" "lb_default" {
      provider = google-beta
      name     = "myservice-service-ip"
    
      # Use an explicit depends_on clause to wait until API is enabled
      depends_on = [
        google_project_service.compute_api
      ]
    }
    output "load_balancer_ip_addr" {
      value = google_compute_global_address.lb_default.address
    }

    將 IP 位址資源名稱設為 myservice-service-ip。你可以將這個值變更為自己的值。 這個 IP 位址是全域任播 IPv4 位址,會將流量轉送至最靠近訪客的 Google 資料中心或服務點。

  2. 建立及設定後端服務:

    resource "google_compute_backend_service" "lb_default" {
      provider              = google-beta
      name                  = "myservice-backend"
      load_balancing_scheme = "EXTERNAL_MANAGED"
    
      backend {
        group = google_compute_region_network_endpoint_group.lb_default[0].id
      }
    
      backend {
        group = google_compute_region_network_endpoint_group.lb_default[1].id
      }
    
      # Use an explicit depends_on clause to wait until API is enabled
      depends_on = [
        google_project_service.compute_api,
      ]
    }

    這項資源會將後端服務的名稱設為 myservice-backend。你可以將這個值變更為自己的值。

  3. 設定網址對應:

    resource "google_compute_url_map" "lb_default" {
      provider        = google-beta
      name            = "myservice-lb-urlmap"
      default_service = google_compute_backend_service.lb_default.id
    
      path_matcher {
        name            = "allpaths"
        default_service = google_compute_backend_service.lb_default.id
        route_rules {
          priority = 1
          url_redirect {
            https_redirect         = true
            redirect_response_code = "MOVED_PERMANENTLY_DEFAULT"
          }
        }
      }
    }

    將後端服務資源 (myservice-backend) 連線至新的網址對應資源 (myservice-lb-urlmap)。您可以將這些值變更為自己的值。

  4. 為網域建立代管的傳輸層安全標準 (TLS) 憑證,以提供 HTTPS 流量。在 google_compute_managed_ssl_certificate 資源中,將 example.com 替換成您的網域名稱:

    resource "google_compute_managed_ssl_certificate" "lb_default" {
      provider = google-beta
      name     = "myservice-ssl-cert"
    
      managed {
        domains = ["example.com"]
      }
    }
  5. 設定 HTTPS Proxy:

    resource "google_compute_target_https_proxy" "lb_default" {
      provider = google-beta
      name     = "myservice-https-proxy"
      url_map  = google_compute_url_map.lb_default.id
      ssl_certificates = [
        google_compute_managed_ssl_certificate.lb_default.name
      ]
      depends_on = [
        google_compute_managed_ssl_certificate.lb_default
      ]
    }

    建立 google_compute_target_https_proxy 資源,目標名稱為 myservice-https-proxy,並連結先前建立的 TLS 憑證 (myservice-ssl-cert) 和網址對應資源 (myservice-lb-urlmap)。您可以將這些值變更為自己的值。

  6. 設定轉送規則:

    resource "google_compute_global_forwarding_rule" "lb_default" {
      provider              = google-beta
      name                  = "myservice-lb-fr"
      load_balancing_scheme = "EXTERNAL_MANAGED"
      target                = google_compute_target_https_proxy.lb_default.id
      ip_address            = google_compute_global_address.lb_default.id
      port_range            = "443"
      depends_on            = [google_compute_target_https_proxy.lb_default]
    }

    建立 google_compute_global_forwarding_rule 資源,目標名稱為 myservice-https-proxy,並連結先前建立的 HTTPS Proxy 目標 (myservice-https-proxy) 和 IP 位址資源 (myservice-service-ip)。您可以將這些值變更為自己的值。

  7. 套用這項設定:

    如要在 Google Cloud 專案中套用 Terraform 設定,請完成下列各節的步驟。

    準備 Cloud Shell

    1. 啟動 Cloud Shell
    2. 設定要套用 Terraform 設定的預設 Google Cloud 專案。

      每項專案只需要執行一次這個指令,且可以在任何目錄中執行。

      export GOOGLE_CLOUD_PROJECT=PROJECT_ID

      如果您在 Terraform 設定檔中設定明確值,環境變數就會遭到覆寫。

    準備目錄

    每個 Terraform 設定檔都必須有自己的目錄 (也稱為根模組)。

    1. Cloud Shell 中建立目錄,並在該目錄中建立新檔案。檔案名稱的副檔名必須是 .tf,例如 main.tf。在本教學課程中,這個檔案稱為 main.tf
      mkdir DIRECTORY && cd DIRECTORY && touch main.tf
    2. 如果您正在學習教學課程,可以複製每個章節或步驟中的程式碼範例。

      將程式碼範例複製到新建立的 main.tf 中。

      視需要從 GitHub 複製程式碼。如果 Terraform 程式碼片段是端對端解決方案的一部分,建議您使用這個方法。

    3. 查看並修改範例參數,套用至您的環境。
    4. 儲存變更。
    5. 初始化 Terraform。每個目錄只需執行一次這項操作。
      terraform init

      如要使用最新版 Google 供應商,請加入 -upgrade 選項:

      terraform init -upgrade

    套用變更

    1. 查看設定,確認 Terraform 即將建立或更新的資源符合您的預期:
      terraform plan

      視需要修正設定。

    2. 執行下列指令並在提示中輸入 yes,套用 Terraform 設定:
      terraform apply

      等待 Terraform 顯示「Apply complete!」訊息。

    3. 開啟 Google Cloud 專案即可查看結果。在 Google Cloud 控制台中,前往 UI 中的資源,確認 Terraform 已建立或更新這些資源。

設定區域網路端點群組

針對上個步驟中部署的每個區域,您必須建立無伺服器網路端點群組 (NEG),並按照下列操作說明將其新增至後端服務:

gcloud CLI

  1. REGION 中為 Cloud Run 服務建立網路端點群組:

    gcloud compute network-endpoint-groups create NEG_NAME \
      --region=REGION \
      --network-endpoint-type=serverless \
      --cloud-run-service=SERVICE_NAME

    更改下列內容:

    • NEG_NAME 替換為網路端點群組資源的名稱。 (例如 myservice-neg-uscentral1)
    • REGION 改為服務部署的區域。
    • SERVICE_NAME 改為您的服務名稱。
  2. 將網路端點群組新增至後端服務:

    gcloud compute backend-services add-backend --global BACKEND_NAME \
      --network-endpoint-group-region=REGION \
      --network-endpoint-group=NEG_NAME

    為區域指定您在上一個步驟中建立的 NEG_NAME

  3. 針對每個區域重複上述步驟。

Terraform

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

  1. run_regions 變數中指定的每個區域,設定 Cloud Run 服務的網路端點群組,並命名為 myservice-neg

    resource "google_compute_region_network_endpoint_group" "lb_default" {
      provider              = google-beta
      count                 = length(local.run_regions)
      name                  = "myservice-neg"
      network_endpoint_type = "SERVERLESS"
      region                = local.run_regions[count.index]
      cloud_run {
        service = google_cloud_run_v2_service.run_default[count.index].name
      }
    }
  2. 設定後端服務,附加網路端點群組 (myservice-neg):

    resource "google_compute_backend_service" "lb_default" {
      provider              = google-beta
      name                  = "myservice-backend"
      load_balancing_scheme = "EXTERNAL_MANAGED"
    
      backend {
        group = google_compute_region_network_endpoint_group.lb_default[0].id
      }
    
      backend {
        group = google_compute_region_network_endpoint_group.lb_default[1].id
      }
    
      # Use an explicit depends_on clause to wait until API is enabled
      depends_on = [
        google_project_service.compute_api,
      ]
    }

設定網域的 DNS 記錄

如要將網域名稱指向您建立的轉送規則,請使用您建立的 IP 位址更新網域名稱的 DNS 記錄。

  1. 執行下列指令,找出負載平衡器的預留 IP 位址:

    gcloud compute addresses describe SERVICE_IP \
      --global \
      --format='value(address)'

    SERVICE_IP 替換為您先前建立的 IP 位址名稱。這個指令會將 IP 位址輸出至畫面。

  2. 新增含有這個 IP 位址的 A 記錄,更新網域的 DNS 記錄。

如果使用已驗證的服務,請設定自訂目標對象

已驗證的服務受到 IAM 保護。 這類 Cloud Run 服務需要用戶端驗證,在產生憑證時聲明要求的預期收件者 (對象)。

目標服務的完整網址通常是目標對象,Cloud Run 服務的預設目標對象是結尾為 的產生網址。不過,在多區域部署中,用戶端無法預先得知要求會傳送至哪個區域服務。因此,如果是多區域部署,請將服務設定為使用自訂目標對象

等待負載平衡器佈建完成

使用負載平衡器 IP 位址設定網域後,請等待 DNS 記錄傳播。同樣地,請等待系統為網域核發受管理的 TLS 憑證,並準備好在全球提供 HTTPS 流量。

負載平衡器最多可能需要 30 分鐘才會開始放送流量。

準備就緒後,請前往網站網址並加上 https:// 前置字元,即可試用。

核對狀態

  1. 如要檢查 DNS 記錄的傳播狀態,請使用 dig 指令列公用程式:

    dig A +short example.com

    輸出內容會顯示您在 DNS 記錄中設定的 IP 位址。

  2. 執行下列指令,檢查受管理憑證的核發狀態:

    gcloud compute ssl-certificates describe CERT_NAME

    CERT_NAME 替換成您先前為 SSL 憑證資源選擇的名稱。

    輸出結果會顯示包含 status: ACTIVE 的一行。

設定 HTTP 至 HTTPS 的重新導向

根據預設,轉送規則只會處理單一通訊協定,因此對 http:// 端點的要求會收到「404 Not Found」回應。如需將對 http:// 網址的要求重新導向至 https:// 通訊協定,請按照下列操作說明建立額外的網址對應和轉送規則:

gcloud CLI

  1. 建立含有重新導向規則的網址對應。

    gcloud compute url-maps import HTTP_URLMAP_NAME \
      --global \
      --source /dev/stdin <<EOF
            name: HTTP_URLMAP_NAME
            defaultUrlRedirect:
              redirectResponseCode: MOVED_PERMANENTLY_DEFAULT
              httpsRedirect: True
            EOF

    HTTP_URLMAP_NAME 替換成您要建立的網址對應資源名稱 (例如 myservice-httpredirect)。

  2. 使用網址對應建立目標 HTTP Proxy。

    gcloud compute target-http-proxies create HTTP_PROXY_NAME \
      --url-map=HTTP_URLMAP_NAME

    HTTP_PROXY_NAME 替換為您要建立的目標 HTTP Proxy 名稱 (例如 myservice-http)。

  3. 在通訊埠 80 上建立轉送規則,並使用相同的保留 IP 位址。

    gcloud compute forwarding-rules create --global HTTP_FORWARDING_RULE_NAME \
      --target-http-proxy=HTTP_PROXY_NAME \
      --address=SERVICE_IP \
      --ports=80
            

    HTTP_FORWARDING_RULE_NAME 替換成您要建立的新轉送規則名稱 (例如 myservice-httplb)。

Terraform

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

  1. 使用重新導向規則建立網址對應資源:

    resource "google_compute_url_map" "https_default" {
      provider = google-beta
      name     = "myservice-https-urlmap"
    
      default_url_redirect {
        redirect_response_code = "MOVED_PERMANENTLY_DEFAULT"
        https_redirect         = true
        strip_query            = false
      }
    }
  2. 使用新建立的網址對應資源 (myservice-https-urlmap) 建立目標 HTTP Proxy:

    resource "google_compute_target_http_proxy" "https_default" {
      provider = google-beta
      name     = "myservice-http-proxy"
      url_map  = google_compute_url_map.https_default.id
    
      depends_on = [
        google_compute_url_map.https_default
      ]
    }
  3. 在通訊埠 80 上建立轉送規則,並使用相同的保留 IP 位址資源 (myservice-http-proxy):

    resource "google_compute_global_forwarding_rule" "https_default" {
      provider   = google-beta
      name       = "myservice-https-fr"
      target     = google_compute_target_http_proxy.https_default.id
      ip_address = google_compute_global_address.lb_default.id
      port_range = "80"
      depends_on = [google_compute_target_http_proxy.https_default]
    }

如需其他設定選項,請參閱「設定具備 Cloud Run 的全域外部應用程式負載平衡器」。

透過 Cloud Run 服務健康狀態自動執行跨區域容錯移轉

如要設定多區域高可用性 Cloud Run 服務,並為內部或外部流量啟用自動容錯移轉和容錯回復功能,請參閱服務健康狀態指南

在多區域部署中,使用經過驗證的 Pub/Sub 推送訂閱項目

根據預設,Pub/Sub 服務會將訊息傳送至與 Pub/Sub 服務儲存訊息的 Google Cloud 區域相同的推送端點。如要解決這個問題,請參閱「搭配多區域 Cloud Run 部署作業使用已驗證的 Pub/Sub 推送訂閱項目」。

設定手動容錯移轉

如要手動設定流量,以便在某個區域發生故障時轉移至正常運作的區域,請修改全域外部應用程式負載平衡器網址對應。

  1. 如要更新全域外部應用程式負載平衡器網址對應,請使用 --global 旗標,從後端服務移除 NEG:

    gcloud compute backend-services remove-backend BACKEND_NAME \
    --network-endpoint-group=NEG_NAME \
    --network-endpoint-group-region=REGION \
    --global
    

    更改下列內容:

    • BACKEND_NAME:後端服務的名稱。
    • NEG_NAME:網路端點群組資源的名稱,例如 myservice-neg-uscentral1
    • REGION:建立 NEG 的區域,以及您要從中移除服務的區域。例如:us-central1,asia-east1
  2. 如要確認健康狀態良好的區域現在正在處理流量,請前往 https://<domain-name>

後續步驟

  • 查看以 Go 撰寫的 Cloud Run 準備狀態探查和服務健康狀態程式碼範例