Ausgehenden Direct VPC-Traffic für Funktionen der 2. Generation konfigurieren
Mit ausgehendem Direct VPC-Traffic können Sie Traffic von Ihrer Cloud Run Functions-Funktion (2. Generation) direkt an Ihr VPC-Netzwerk weiterleiten.
Beschränkungen
- Ausgehender Direct VPC-Traffic ist für 1st gen-Funktionen nicht verfügbar.
- Sie können ausgehenden Direct VPC-Traffic und Connectors für Serverloser VPC-Zugriff nicht gleichzeitig verwenden. Weitere Informationen finden Sie unter Direkten ausgehenden VPC-Traffic und VPC-Connectors vergleichen.
Hinweise
- Wählen Sie die Cloud Functions API aus.
- Installieren Sie die Google Cloud CLI und initialisieren Sie sie mit dem Befehl
gcloud init. Aktualisieren Sie die
gcloud-Komponenten auf Version 545.0.0 oder höher:gcloud components update
Wenn Sie in Ihrem Projekt noch kein VPC-Netzwerk haben, erstellen Sie eins.
Optional: Wenn Ihre Funktion über die internen IP-Adressen auf Google APIs und ‑Dienste zugreifen muss, aktivieren Sie den privater Google-Zugriff für das Subnetz, das Sie für den direkten VPC-Ausgang verwenden.
IAM-Berechtigungen einrichten
Wenn Sie den direkten VPC-Ausgang autorisieren möchten, bitten Sie Ihren Administrator, dem Dienstkonto Ihrer Funktion die Rolle „Cloud Run Invoker“ (roles/run.invoker) zuzuweisen.
Achten Sie darauf, dass Cloud Run mit einer der folgenden Methoden Zugriff auf das VPC-Netzwerk hat:
Rolle „Cloud Run-Dienst-Agent“: Standardmäßig hat der Cloud Run-Dienst-Agent die Rolle Cloud Run-Dienst-Agent (
roles/run.serviceAgent), die die erforderlichen Berechtigungen enthält.Benutzerdefinierte Berechtigungen: Für eine detaillierte Kontrolle erteilen Sie dem Cloud Run-Dienst-Agent die folgenden zusätzlichen Berechtigungen für das Projekt:
compute.networks.getcompute.subnetworks.getcompute.subnetworks.usefür das Projekt oder das jeweilige Subnetzcompute.addresses.getcompute.addresses.listcompute.addresses.create(nur für Dual-Stack-Subnetze mit externen IPv6-Adressen erforderlich)compute.addresses.delete(nur für Dual-Stack-Subnetze mit externen IPv6-Adressen erforderlich)compute.addresses.createInternalcompute.addresses.deleteInternalcompute.regionOperations.get
Rolle „Compute-Netzwerknutzer“: Wenn Sie die Standardrolle „Cloud Run-Dienst-Agent“ oder die benutzerdefinierten Berechtigungen nicht verwenden, weisen Sie die Rolle Compute-Netzwerknutzer (
roles/compute.networkUser) für das Dienstkonto von Cloud Run-Dienst-Agent zu. Für Subnetze mit externen IPv6-Adressen ist auch die Rolle Administrator öffentlicher IP-Adressen für Compute Engine (roles/compute.publicIpAdmin) erforderlich.Wenn Sie beispielsweise die Rolle „Compute Network User“ zuweisen möchten, führen Sie den folgenden Befehl aus:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:service-PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com" \ --role "roles/compute.networkUser"
Ersetzen Sie Folgendes:
- PROJECT_ID: die Projekt-ID.
- PROJECT_NUMBER: Die Projektnummer, in der Sie Ihre Cloud Run-Funktion bereitstellen.
Ausgehenden Direct VPC-Traffic konfigurieren
Ausgehenden Direct VPC-Traffic für neue oder vorhandene Funktionen der 2. Generation konfigurieren
gcloud
Wenn Sie beim Bereitstellen einer Funktion ausgehenden VPC-Traffic konfigurieren möchten, verwenden Sie den Befehl
gcloud beta functions deploymit Flags für Ihre Netzwerkeinstellungen.gcloud beta functions deploy FUNCTION_NAME \ --source . \ --runtime RUNTIME \ --trigger-http \ --region REGION \ --network=NETWORK \ --subnet=SUBNET \ --network-tags=NETWORK_TAG_NAMES \ --direct-vpc-egress=EGRESS_SETTINGErsetzen Sie Folgendes:
- FUNCTION_NAME: Der Name Ihrer Funktion.
- RUNTIME: Die Laufzeit für Ihre Funktion, z. B.
nodejs20. - REGION: die Region, in der Sie Ihre Funktion bereitstellen.
- Optional: NETWORK durch den Namen Ihres VPC-Netzwerks. Geben Sie entweder ein VPC-Netzwerk oder ein Subnetz oder beides an. Wenn Sie nur ein Netzwerk angeben, hat das Subnetz denselben Namen wie das Netzwerk.
- Optional: SUBNET durch den Namen Ihres Subnetzes. Geben Sie entweder ein VPC-Netzwerk oder ein Subnetz oder beides an. Wenn Sie nur ein Netzwerk angeben, verwendet das Subnetz denselben Namen wie das Netzwerk. Sie können mehrere Funktionen im selben Subnetz bereitstellen oder ausführen.
- Optional: NETWORK_TAG_NAMES durch die durch Kommas getrennten Namen der Netzwerk-Tags ersetzen, die Sie mit einer Funktion verknüpfen möchten. Jede Funktion kann unterschiedliche Netzwerk-Tags haben, z. B.
network-tag-2. - EGRESS_SETTING durch einen Wert für die Einstellung für ausgehenden Traffic:
all: Standard. Sendet den gesamten ausgehenden Traffic über das VPC-Netzwerk.private-ranges-only: Sendet nur Traffic an interne Adressen über das VPC-Netzwerk.
Optional: Wenn Sie alle Einstellungen für ausgehenden Direct VPC-Traffic aus einer Funktion entfernen möchten, stellen Sie die Funktion mit den Flags
--clear-networkund--clear-network-tagsneu bereit.
Terraform
Informationen zum Anwenden oder Entfernen einer Terraform-Konfiguration finden Sie unter Grundlegende Terraform-Befehle.
Verwenden Sie den Terraform-Provider google-beta, um ausgehenden Direct VPC-Traffic zu konfigurieren.
Aktualisieren Sie die folgenden Felder. Verwenden Sie dazu das Beispiel für ausgehenden Direct VPC-Traffic für Cloud Run-Funktionen (2. Generation) als Ausgangspunkt:
service_config.network: der Name des VPC-Netzwerksservice_config.subnetwork: der Name des VPC-Subnetzwerks.service_config.direct_vpc_egress: welcher Traffic an das VPC-Netzwerk gesendet werden soll.VPC_EGRESS_ALL_TRAFFICleitet den gesamten ausgehenden Traffic über das VPC-Netzwerk weiter.VPC_EGRESS_PRIVATE_RANGES_ONLYsendet Traffic nur an private IP-Adressbereiche im VPC-Netzwerk.
Beispiel: Internen Dienst über eine Funktion aufrufen
In diesem Beispiel wird gezeigt, wie Sie einen internen Cloud Run-Dienst erstellen und ihn dann über eine Cloud Run Functions-Funktion (2. Generation) aufrufen, die Direct VPC Egress verwendet.
Internen Back-End-Dienst erstellen
Erstellen Sie ein neues Verzeichnis für den Backend-Dienst und wechseln Sie dorthin:
mkdir backend-service cd backend-serviceErstellen Sie eine
package.json-Datei mit folgendem Inhalt:{ "name": "backend-service", "version": "1.0.0", "description": "", "scripts": { "start": "node index.js" }, "dependencies": { "express": "^4.18.1" } }Erstellen Sie eine
index.js-Datei mit folgendem Inhalt:const express = require('express'); const app = express(); app.get('/', (req, res) => { res.send("hello world"); }); const port = parseInt(process.env.PORT) || 8080; app.listen(port, () => { console.log(`helloworld: listening on port ${port}`); });Stellen Sie den Dienst in Cloud Run mit internem Ingress bereit:
gcloud run deploy backend \ --source . \ --no-allow-unauthenticated \ --region=REGION \ --ingress internalErsetzen Sie
REGIONdurch Ihre Region, z. B.us-west1.Speichern Sie die URL des neuen Dienstes. Sie benötigen sie im nächsten Abschnitt.
Funktion erstellen und bereitstellen
Erstellen Sie ein neues Verzeichnis für die Funktion und wechseln Sie dorthin:
cd .. mkdir dvpc-function cd dvpc-functionErstellen Sie eine
package.json-Datei mit folgendem Inhalt:{ "name": "sample-http", "version": "0.0.1", "dependencies": { "axios": "0.21.1", "@google-cloud/functions-framework": "^3.0.0" } }Erstellen Sie eine
index.js-Datei mit folgendem Inhalt: Mit diesem Code wird eine authentifizierte Anfrage an den internen Back-End-Dienst gesendet.const axios = require('axios'); const functions = require('@google-cloud/functions-framework'); const callVPCService = async (req, res) => { const backendUrl = process.env.BACKEND_URL; if (!backendUrl) { console.error('BACKEND_URL environment variable not set.'); res.status(500).send('BACKEND_URL not configured.'); return; } try { const metadataServerURL = 'http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience='; const tokenUrl = metadataServerURL + backendUrl; const tokenResponse = await axios.get(tokenUrl, { headers: { 'Metadata-Flavor': 'Google', }, }); const token = tokenResponse.data; const response = await axios.get(backendUrl, { headers: { Authorization: `bearer ${token}`, }, }); res.status(200).send(`Response from backend: ${response.data}`); } catch (error) { console.error(`Error calling backend service: ${error.message}`); res.status(500).send(`Error calling backend: ${error.message}`); } }; functions.http('callVPCService', callVPCService);Stellen Sie die Funktion mit konfiguriertem ausgehenden VPC-Traffic bereit, um den gesamten Traffic an Ihr Standard-VPC-Netzwerk weiterzuleiten:
gcloud beta functions deploy my-2ndgen-function \ --source . \ --runtime nodejs20 \ --trigger-http \ --entry-point callVPCService \ --network=default \ --subnet=default \ --direct-vpc-egress=all \ --region=REGION \ --allow-unauthenticated \ --set-env-vars BACKEND_URL=BACKEND_URLErsetzen Sie Folgendes:
REGION: die Region, in der Sie den Backend-Dienst bereitgestellt haben.BACKEND_URL: die URL des von Ihnen erstellten Backend-Dienstes.
Nachdem die Funktion bereitgestellt wurde, können Sie sie aufrufen, indem Sie ihre URL aufrufen. Die Funktion ruft den internen Backend-Dienst auf und gibt dessen Antwort zurück.
Nächste Schritte
- Ausgehender Direct VPC-Traffic und IP-Zuweisung
- Tipps zur Fehlerbehebung
- Vergleich der Methoden für ausgehenden Traffic unter Verbindung zu einem VPC-Netzwerk herstellen
- Weitere Informationen finden Sie in der
gcloud beta functions deploy-Befehlsreferenz.