設定網路設定 (第 1 代)

您可以透過 Cloud Run 函式的網路設定,控管個別函式與網路的進出流量。舉例來說,您可以將網路設定用於下列用途:

  • 實作網路型存取控管機制,確保函式安全無虞。
  • 讓函式輸出流量遵循與虛擬私有雲網路相關聯的防火牆、DNS 和轉送規則。
  • 將函式的傳出流量與靜態 IP 位址建立關聯。

如要進一步瞭解用途,請參閱「用途範例」一節。

輸入設定

Ingress 設定可控管 Google Cloud 專案或 VPC Service Controls 服務範圍以外的資源是否可以叫用函式。

資源必須屬於要受限制的服務,才能受到 VPC Service Controls 範圍的政策規範。對於 Cloud Run 函式 (第 1 代),受限制的服務是 Cloud Functions API。

限制

僅限內部使用、由 HTTP 觸發的函式只能由在 VPC 網路內建立的 HTTP 要求 (例如 Kubernetes EngineCompute EngineApp Engine 彈性環境 等) 或由 Cloud Scheduler、Cloud Tasks、Workflows 或 BigQuery 資源 (位於相同專案或 VPC Service Controls 範圍內) 所建立的 HTTP 要求所叫用。這表示透過 Pub/Sub 或 Eventarc 路由的 HTTP 要求無法觸發這些函式。事件觸發事件一律視為「內部」,無論輸入網路設定為何,系統都會允許。

設定輸入設定

如要限制專案或邊界以外的資源,請指定下列任一入口設定值:

  • 允許所有流量:預設值。允許所有傳入函式的內送要求,包括來自網際網路和同一個專案內的資源。
  • 僅允許內部流量:僅允許來自相同專案或 VPC Service Controls 範圍的 Cloud Scheduler、Cloud Tasks、Eventarc、Workflows、BigQuery 和 VPC 網路的流量。系統會拒絕所有其他要求,並顯示 404 錯誤。

    如果是來自共用虛擬私人雲端的請求,請注意下列注意事項:

    • 如果函式部署在共用虛擬私有雲主機專案中,則會視為內部流量。
    • 如果共用虛擬私有雲主機和所有服務專案都位於同一個 VPC Service Controls 範圍內,則流量視為內部流量。
    • 共用虛擬私有雲網路的所有其他流量都會遭到拒絕。
  • 允許內部流量和 Cloud Load Balancing 流量:允許 Cloud Scheduler、Cloud Tasks、Eventarc、Workflows、BigQuery 和相同專案或 VPC Service Controls 範圍內的虛擬私有雲網路流量。允許 Cloud Load Balancing 產生的流量。

您可以在部署或更新函式時,使用 Google Cloud 控制台、Google Cloud CLI 或 Terraform 指定入口設定:

控制台

  1. 在 Google Cloud 控制台中開啟「Functions Overview」(函式總覽) 頁面:

    前往「Cloud Run functions」(Cloud Run 函式) 總覽頁面

  2. 按一下 [建立函式]。或者,您也可以點選現有函式前往其詳細資料頁面,然後按一下「Edit」(編輯)

  3. 按一下「執行階段、建構作業」展開進階設定。

  4. 在「Connections」部分,選取「Ingress settings」的值。

gcloud

使用 gcloud functions deploy 指令部署或更新函式,並指定 --ingress-settings 標記:

  gcloud functions deploy FUNCTION_NAME 
--trigger-http
--ingress-settings INGRESS_SETTINGS
FLAGS...

其中:

  • FUNCTION_NAME 是函式名稱。
  • INGRESS_SETTINGS入口設定支援的值之一。可能的值如下:

    • all
    • internal-only
    • internal-and-gclb:允許內部流量,以及傳送至 Cloud Load Balancing 公開 IP 的流量。封鎖傳送至 cloudfunctions.net 或透過 Cloud Run 函式設定的任何自訂網域的流量。可防止使用者規避透過 Cloud Load Balancing 設定的任何存取控制項 (Cloud Armor、IAP)。
  • FLAGS... 是您傳遞至 deploy 指令的其他標記。

Terraform

(非必要) 如要更新 Terraform 資源main.tf 檔案 ingress 設定欄位,請加入要部署或更新的 ingress_settings 引數。變更入口設定會重新建立函式。

  1. main.tf 檔案中,找出要限制入口設定的資源,然後更新為所需設定,例如:

    resource "google_cloudfunctions_function" "function" {
      name             = "function"
      location         = "us-central1"
      description      = "Sample function"
      ingress_settings = "INGRESS_SETTINGS"
    }

    其中 INGRESS_SETTINGS入口設定支援的值之一。可能的值如下:

    • ALLOW_ALL (預設):允許所有函式內送要求,包括來自網際網路和同一個專案內的資源。
    • ALLOW_INTERNAL_ONLY:僅允許相同專案或 VPC Service Controls 範圍中的 Cloud Scheduler、Cloud Tasks、Eventarc、Workflows 和 VPC 網路流量。
    • ALLOW_INTERNAL_AND_GCLB:允許內部流量,以及傳送至 Cloud Load Balancing 公開 IP 的流量。封鎖傳送至 cloudfunctions.net 或透過 Cloud Run 函式設定的任何自訂網域的流量。禁止使用者規避透過 Cloud Load Balancing 設定的任何存取控制項 (Cloud Armor、IAP)。

如果您將 Google Cloud Armor 與 Cloud Load Balancing 搭配使用,可以建立安全性政策,篩選以流量為依據的條件,例如傳入要求的 IP 位址、IP 範圍、區域代碼或要求標頭。詳情請參閱「Google Cloud Armor 安全性政策總覽」。

輸出設定

傳出設定可控管函式傳出 HTTP 要求的路由。如要指定輸出設定,您必須使用無伺服器虛擬私有雲存取連接器,將函式連線至虛擬私有雲網路。輸出設定可控管流量何時透過虛擬私有雲端網路中的連接器轉送。

限制

  • 無伺服器虛擬私有雲存取僅支援路由 IPv4 流量。即使 VPC 網路中有 IPv6 路由,也不支援 IPv6 流量。

  • 為提升安全性, Google Cloud 會封鎖 TCP 目的地通訊埠 25 上的外部 IP 位址輸出封包。

  • 使用者函式或服務若要叫用由虛擬私有雲端網路保護的函式或服務,就必須透過 VPC 連接器將這些叫用作業重新導向。

設定輸出設定

針對出口設定,您可以指定下列項目:

  • 僅將要求透過虛擬私有雲連接器轉送至私人 IP:預設值。只有在承載流量的封包目的地符合下列條件時,系統才會將流量轉送至虛擬私有雲網路:

    傳送至任何其他目的地的封包會從 Cloud Run 函式轉送至網際網路,而不會透過任何 VPC 網路。

  • 透過虛擬私有雲連接器轉送所有流量:對於所有封包目的地,流量一律會透過與連接器相關聯的虛擬私有雲網路轉送。您必須在下列情況下使用這個選項:

    • 如果您需要將流量傳送至使用私用外部 IP 位址範圍的 VPC 子網路範圍,如要進一步瞭解 VPC 子網路範圍,請參閱「子網路總覽」中的「有效的 IPv4 範圍」。
    • 如果您需要將流量傳送至 Google API 的 Private Service Connect 端點,而該端點的位址是私人使用的外部 IP 位址。如要進一步瞭解 Google API 的 Private Service Connect 端點,請參閱「透過端點存取 Google API」。
    • 如果您需要將流量傳送至任何其他私人使用的外部 IP 位址目的地,且該目的地可在連接器的虛擬私有雲網路中進行路由。涵蓋私用外部 IP 位址的其他目的地範例包括對等子網路範圍、透過服務的已分配 IP 位址範圍建立的對等子網路範圍,以及可透過虛擬私有雲網路中的自訂路徑存取的目的地。

    如果您的 VPC 網路包含預設路徑,在連接器處理後,封包仍可轉送至網際網路,前提是您已設定 Cloud NAT 閘道,為連接器使用的子網路提供 NAT 服務。這些封包會受到 VPC 網路中的路徑和適用於 VPC 網路的防火牆規則的影響。您可以使用路由和防火牆設定,控制函式透過無伺服器虛擬私有雲端存取連接器傳送的所有傳出要求的網際網路輸出。

您可以使用 Google Cloud 控制台或 Google Cloud CLI,在部署或更新函式時指定出口設定。

控制台

  1. 在 Google Cloud 控制台中開啟「Functions Overview」(函式總覽) 頁面:

    前往「Cloud Run functions」(Cloud Run 函式) 總覽頁面

  2. 按一下 [建立函式]。或者,您也可以點選現有函式前往其詳細資料頁面,然後按一下「Edit」(編輯)

  3. 按一下「執行階段、建構作業」展開進階設定。

  4. 在「連線」部分的「傳出設定」下方,選取無伺服器虛擬私有雲存取連接器。

  5. 請根據您要如何透過連接器將出站流量路由,選取適當的出口設定。

gcloud

使用 gcloud functions deploy 指令部署或更新函式,並指定 --egress-settings 標記:

  gcloud functions deploy FUNCTION_NAME 
--vpc-connector CONNECTOR_NAME
--egress-settings EGRESS_SETTINGS
FLAGS...

其中:

  • FUNCTION_NAME 是函式名稱。
  • CONNECTOR_NAME 是所要使用的無伺服器虛擬私有雲端存取連接器名稱。詳情請參閱 gcloud 說明文件

  • EGRESS_SETTINGS 是出口設定支援的值之一:請參閱 gcloud 說明文件

  • FLAGS... 是您傳遞至 deploy 指令的其他標記。

應用實例

以下範例說明如何在幾種常見情境中設定網路存取權。

建立外部用戶無法呼叫的函式

您可以只允許同一個 Google Cloud 專案或 VPC Service Controls 服務範圍內的資源呼叫 HTTP 函式,藉此保護 HTTP 函式。

  1. 部署函式,並只允許內部流量。使用Google Cloud 控制台或 Google Cloud CLI:

    控制台

    1. 在 Google Cloud 控制台中開啟「Functions Overview」(函式總覽) 頁面:

      前往「Cloud Run functions」(Cloud Run 函式) 總覽頁面

    2. 按一下 [建立函式]。或者,您也可以點選現有函式前往其詳細資料頁面,然後按一下「編輯」

    3. 按一下「執行階段、建構作業」展開進階設定。

    4. 在「Connections」專區的「Ingress settings」下方,選取「Allow internal traffic only」

    gcloud

    使用 gcloud functions deploy 指令:

    gcloud functions deploy FUNCTION_NAME \
    --ingress-settings internal-only \
    FLAGS...
    

部署函式後,來自Google Cloud 專案以外的請求會遭到封鎖,無法存取函式。如果您使用 VPC Service Controls,系統會封鎖來自服務範圍外的請求。專案或服務範圍內的 VM 執行個體仍可透過向 HTTPS 端點提出要求的方式存取您的函式。

如果您想從其他函式呼叫此受限制的函式,呼叫函式必須透過虛擬私有雲網路轉送輸出資料

使用輸出和輸入設定限制存取

您可以將輸入和輸出納入服務,以便再加一層限制。

  1. 複製 cloud-run-sample 存放區,並變更為 vpc-sample 目錄:

    git clone https://github.com/GoogleCloudPlatform/cloud-run-samples
    cd vpc-sample

  2. 安裝 Python 依附元件:

    pip3 install -r requirements.txt

  3. 您可以在 vpc-sample 目錄中開啟 main.py 檔案,查看要部署的函式:

    def hello_world(request):
        return "Hello World!"

  4. 部署函式:

    gcloud functions deploy restricted-function 
    --runtime=python38
    --trigger-http
    --no-allow-unauthenticated
    --ingress-settings=internal-only
    --entry-point=hello_world

  5. 設定無伺服器虛擬私有雲存取連接器:

    gcloud compute networks vpc-access connectors create serverless-connector 
    --region=SERVICE_REGION
    --range=10.8.0.0/28

    其中 SERVICE_REGION 是連接器的地區,必須與無伺服器服務的地區相符。如果您的服務位於 us-centraleurope-west 區域,請使用 us-central1europe-west1

  6. 建構容器映像檔:

    gcloud builds submit --tag=gcr.io/PROJECT_ID/restricted-function-caller .

    其中 PROJECT_ID 是專案 ID。

    這項操作會建構從 main.py 檔案部署時叫用 get_hello_world 的容器映像檔:

    import os
    import urllib
    
    import google.auth.transport.requests
    import google.oauth2.id_token
    
    
    def get_hello_world(request):
        try:
            url = os.environ.get("URL")
            req = urllib.request.Request(url)
    
            auth_req = google.auth.transport.requests.Request()
            id_token = google.oauth2.id_token.fetch_id_token(auth_req, url)
            req.add_header("Authorization", f"Bearer {id_token}")
    
            response = urllib.request.urlopen(req)
            return response.read()
    
        except Exception as e:
            print(e)
            return str(e)

  7. 使用 gcloud run deploy run-function 指令部署 Cloud Run 容器:

      gcloud run deploy run-function 
    --image gcr.io/PROJECT_ID/restricted-function-caller
    --no-allow-unauthenticated
    --update-env-vars=URL=https://SERVICE_REGION-PROJECT_ID.cloudfunctions.net/restricted-function-caller
    --vpc-egress=all
    --vpc-connector=serverless-connector
    --region=SERVICE_REGION

    其中:

    • PROJECT_ID 是專案 ID。
    • SERVICE_REGION 是連接器的地區,必須與無伺服器服務的地區相符。如果您的服務位於 us-centraleurope-west 區域,請使用 us-central1europe-west1

    Cloud Run run-function 服務現在已設為從 VPC 連接器傳送 GET 要求至網路受限函式。

透過虛擬私有雲網路轉送函式輸出

Google Cloud 中的 VPC 網路支援多種設定和網路功能。將函式輸出流量轉送至 VPC 網路,可確保 Cloud Run 函式輸出流量遵循 VPC 網路的防火牆、DNS、路由和其他規則,並可使用 Cloud NAT 等產品。

  1. 設定虛擬私有雲網路。請按照「使用虛擬私有雲網路」一文中的指示設定現有虛擬私有雲網路,或建立新的虛擬私有雲網路。

  2. 設定無伺服器虛擬私有雲存取連接器。Cloud Run 函式需要無伺服器虛擬私有雲存取連接器,才能將流量轉送至虛擬私有雲網路。請按照「連線至虛擬私有雲網路」一文的說明建立連接器,並設定適當的權限。

  3. 部署使用連接器的函式,並透過連接器轉送所有輸出流量。使用 Google Cloud 主控台或 gcloud 指令列工具:

    控制台

    1. 在 Google Cloud 控制台中開啟「Functions Overview」(函式總覽) 頁面:

      前往「Cloud Run functions」(Cloud Run 函式) 總覽頁面

    2. 按一下 [建立函式]。或者,您也可以點選現有函式前往其詳細資料頁面,然後按一下「編輯」

    3. 按一下「Runtime, build ...」展開進階設定。

    4. 在「Connections」部分的「Egress settings」下方,選取無伺服器虛擬私有雲存取連接器,然後選取「Route all traffic through the VPC connector」

    gcloud

    使用 gcloud functions deploy 指令:

    gcloud functions deploy FUNCTION_NAME \
    --vpc-connector CONNECTOR_NAME \
    --egress-settings all \
    FLAGS...
    

函式部署完成後,源自函式的所有流量都會透過虛擬私有雲網路路由,並遵循虛擬私有雲網路的規則。請注意,除非您設定 Cloud NAT,否則函式無法存取公開網際網路。此外,您需要讓 Cloud NAT 將所有子網路的所有主要和次要 IP 範圍對應至 NAT 閘道,才能在對應中納入連接器的子網路。

將函式輸出連結至靜態 IP 位址

在某些情況下,您可能會希望將來自函式的流量與靜態 IP 位址建立關聯。舉例來說,如果您要呼叫的外部服務只允許明確指定 IP 位址的要求,這項功能就很實用。

  1. 將函式輸出路由設為透過虛擬私有雲網路。請參閱上一節的透過虛擬私有雲網路路由函式傳出資料

  2. 設定 Cloud NAT 並指定靜態 IP 位址。請按照「指定 NAT 的子網路範圍」和「指定 NAT 的 IP 位址」中的指南操作,為與函式無伺服器虛擬私有雲存取連接器相關聯的子網路設定 Cloud NAT。您的 Cloud NAT 必須將所有子網路的所有主要和次要 IP 範圍對應至 NAT 閘道,才能在對應中納入連接器的子網路。

多區域負載平衡

您可以將函式部署至不同區域,並允許將要求傳送至最近的健康區域。如要達成這項目標,您需要為函式設定無伺服器網路端點群組 (NEG),並將其連結至負載平衡器,如「使用無伺服器 NEG 設定 HTTP(S) 負載平衡器」一文所述。