限制 Cloud Run 的網路輸入

本頁說明如何使用輸入設定,限制對 Cloud Run 服務的網路存取權。

在網路層級,Cloud Run 服務的端點可透過下列網路傳入路徑存取:

  • 預設 run.app 網址,您可以停用
  • 任何已設定的網域對應
  • 任何已設定的外部應用程式負載平衡器或內部應用程式負載平衡器

所有網路輸入路徑均須遵守服務的輸入設定。 根據預設,輸入路徑和輸入設定允許網際網路上的任何資源連線至 Cloud Run 服務。您可以使用自訂限制,為機構或一組專案限制 Ingress 設定。從上述任一網路傳入路徑抵達服務端點的要求,仍適用 IAM 驗證。如要以分層方式管理存取權,請同時使用網路連入設定和 IAM 驗證。

使用網路標記限制連接器 VM 對 VPC 資源的存取權

可用的網路進入設定

可用的設定如下:

設定 說明
內部 最嚴格的限制。允許來自下列來源的要求:
  • 內部應用程式負載平衡器,包括透過內部應用程式負載平衡器轉送時,來自共用 VPC 網路的要求。
  • 任何包含 Cloud Run 服務的 VPC Service Controls 範圍允許的資源。Cloud Run 必須設定為受限服務。
  • 與 Cloud Run 服務位於相同專案的虛擬私有雲網路。
  • 共用虛擬私有雲輸入:修訂版本設定為傳送流量的共用虛擬私有雲網路。如要瞭解共用虛擬私有雲流量何時會被視為「內部」流量,請參閱共用虛擬私有雲的特殊注意事項
  • 如果下列 Google Cloud 產品與 Cloud Run 服務位於同一個專案或 VPC Service Controls 範圍內,且使用預設的 run.app 網址而非自訂網域:
即使這些來源透過 run.app 網址存取您的服務,相關要求仍會留在 Google 網路內。來自其他來源 (包括網際網路) 的要求,無法透過 run.app 網址或自訂網域連線至您的服務。

內部和 Cloud Load Balancing 這項設定允許下列資源提出要求:
  • 較嚴格的「內部」設定允許的資源
  • 外部應用程式負載平衡器
這項設定可讓您執行下列操作:
  • 透過外部應用程式負載平衡器接受網際網路的要求。禁止從網際網路直接要求存取 run.app 網址。
  • 確保來自網際網路的要求會受到外部應用程式負載平衡器功能 (例如 Identity-Aware ProxyGoogle Cloud ArmorCloud CDN) 的限制。

注意:如要在 gcloud CLI 中啟用這項設定,請使用 internal-and-cloud-load-balancing。 如要在 Google Cloud 控制台中啟用這項設定,請選取「內部」>「允許外部應用程式負載平衡器傳出的流量」
全部 最寬鬆的設定。允許所有要求,包括直接從網際網路傳送至 run.app 網址的要求。

存取內部服務

其他注意事項如下:

  • 存取內部服務時,請照常使用服務的網址呼叫服務,可以是預設的 run.app 網址,也可以是在 Cloud Run 中設定的自訂網域

  • 如果是來自 Compute Engine VM 執行個體的要求,只要機器有外部 IP 位址或使用 Cloud NAT,就不需要進一步設定。否則,請參閱「接收來自 VPC 網路的要求」。

  • 從 Cloud Run 或 App Engine 呼叫設為「內部」或「內部和 Cloud Load Balancing」的 Cloud Run 服務時,流量必須透過視為內部的 VPC 網路轉送。請參閱「接收來自其他 Cloud Run 服務或 App Engine 的要求」。

  • 即使資源具有外部 IP 位址,來自相同專案中虛擬私有雲網路內資源的要求仍視為「內部」要求。

  • 透過 Cloud VPN 和 Cloud Interconnect 連線至 VPC 網路的內部部署資源所發出的要求屬於「內部」要求。

設定 Ingress

您可以使用 Google Cloud 控制台、Google Cloud CLI、YAML 或 Terraform 設定 Ingress。

控制台

  1. 前往 Google Cloud 控制台的 Cloud Run 頁面:

    前往 Cloud Run

  2. 如要設定新服務,請從選單中選取「服務」,然後按一下「部署容器」,顯示「建立服務」表單。填寫初始服務設定頁面。

  3. 如要設定現有服務,請按一下該服務,然後按一下「網路」分頁標籤。

  4. 選取要允許的輸入流量

    圖片

  5. 按一下「建立」或「儲存」

gcloud

  1. 如要部署新服務,請使用 --ingress 旗標部署服務:

    gcloud run deploy SERVICE --image IMAGE_URL --ingress INGRESS

    取代

    • INGRESS,並使用可用的 Ingress 設定
      • all
      • internal
      • internal-and-cloud-load-balancing
    • SERVICE 改為您的服務名稱
    • IMAGE_URL,並參照容器映像檔,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。如果您使用 Artifact Registry,則必須先建立存放區 REPO_NAME。網址的格式為 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
  2. 如果要變更現有服務的 Ingress:

    gcloud run services update SERVICE --ingress INGRESS

    取代

    • INGRESS,並使用可用的 Ingress 設定
      • all
      • internal
      • internal-and-cloud-load-balancing
    • SERVICE 改為您的服務名稱

YAML

  1. 如要建立新服務,請略過這個步驟。 如要更新現有服務,請下載其 YAML 設定

    gcloud run services describe SERVICE --format export > service.yaml
  2. 更新 run.googleapis.com/ingress: 註解:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      annotations:
        run.googleapis.com/ingress: INGRESS
      name: SERVICE
    spec:
      template:
        metadata:
          name: REVISION

    取代

    • SERVICE 改為您的 Cloud Run 服務名稱。
    • INGRESS,並使用可用的 Ingress 設定
      • all
      • internal
      • internal-and-cloud-load-balancing
    • REVISION,並提供新的修訂版本名稱,或刪除該名稱 (如有)。如果您提供新的修訂版本名稱,則必須符合下列條件:
      • 開頭為「SERVICE-
      • 只能包含小寫字母、數字和 -
      • 結尾不是 -
      • 不超過 63 個半形字元
  3. 使用下列指令,以新設定取代服務:

    gcloud run services replace service.yaml

Terraform

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

在 Terraform 設定中,將下列內容新增至 google_cloud_run_v2_service 資源:

resource "google_cloud_run_v2_service" "default" {
  provider = google-beta
  name     = "ingress-service"
  location = "us-central1"

  deletion_protection = false # set to "true" in production

  # For valid annotation values and descriptions, see
  # https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/cloud_run_v2_service#ingress
  ingress = "INGRESS_TRAFFIC_INTERNAL_ONLY"

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello" #public image for your service
    }
  }
}

停用預設網址

停用 Cloud Run 服務的預設 run.app 網址,只允許來自服務其他輸入路徑的流量:Cloud Load Balancing 和任何已設定的網域對應

如要停用預設網址,請使用 Google Cloud CLI、YAML 或 Terraform 執行下列步驟。

指令列

  • 如要停用服務的 run.app 網址,請執行 gcloud beta run services update 指令並加上 --no-default-url 旗標,或將 --no-default-url 旗標傳遞至 gcloud run deploy 指令:

    gcloud beta run services update SERVICE_NAME --no-default-url

    其中 SERVICE_NAME 是 Cloud Run 服務的名稱。

輸出內容會顯示網址,如 None

如要還原預設網址,請使用 --default-url 旗標。

YAML

  1. 如要建立新服務,請略過這個步驟。 如要更新現有服務,請下載其 YAML 設定

    gcloud run services describe SERVICE --format export > service.yaml
  2. 如要停用 run.app 網址,請使用 run.googleapis.com/default-url-disabled 註解:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      annotations:
        run.googleapis.com/default-url-disabled: true
        run.googleapis.com/launch-stage: BETA
      name: SERVICE
    spec:
      template:
        metadata:
          name: REVISION

    取代

    • SERVICE 改為您的 Cloud Run 服務名稱。
    • REVISION,並提供新的修訂版本名稱,或刪除該名稱 (如有)。如果您提供新的修訂版本名稱,則必須符合下列條件:
      • 開頭為「SERVICE-
      • 只能包含小寫字母、數字和 -
      • 結尾不是 -
      • 不超過 63 個半形字元
  3. 使用下列指令建立或更新服務:

    gcloud run services replace service.yaml

如要還原預設網址,請移除 run.googleapis.com/default-url-disabled 註解。

Terraform

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

在 Terraform 設定中,將下列內容新增至 google_cloud_run_v2_service 資源:
  resource "google_cloud_run_v2_service" "disable_default_url_service" {
    name     = "cloudrun-service"
    location = "europe-west1"
    launch_stage = "BETA"
    default_uri_disabled = true

    template {
      containers {
        image = "us-docker.pkg.dev/cloudrun/container/hello"
      }
      annotations = {
        "run.googleapis.com/ingress" = "all"   # "all" or "internal-only"
      }

    }
  }

確認 launch_stagedefault_uri_disabled 行位於 main.tf 檔案中。上述 google_cloud_run_v2_service 資源會指定 Cloud Run 服務,並在預覽版中停用預設網址。

如要還原預設網址,請移除 default_uri_disabledlaunch_stage 引數。

下列 Google Cloud 服務使用預設 run.appURL 叫用 Cloud Run。停用預設 run.app 網址會導致下列服務無法正常運作:

後續步驟