1. Einführung
Übersicht
Viele Organisationen verwenden in Google Cloud ein VCP-Netzwerk (Virtual Private Cloud) mit Perimeterkontrollen, um die Daten-Exfiltration zu verhindern, um den Netzwerktraffic für ihre Dienste und Anwendungen zu sichern. Ein VPC-Netzwerk ist eine virtuelle Version eines physischen Netzwerks, das innerhalb des Produktionsnetzwerks von Google implementiert ist. Ein VPC-Netzwerk stellt die Konnektivität für Ihre Compute Engine-VM-Instanzen bereit, bietet native interne Passthrough-Network Load Balancer und Proxysysteme für interne Application Load Balancer, stellt über Cloud VPN-Tunnel und VLAN-Anhänge für Cloud Interconnect eine Verbindung zu lokalen Netzwerken her und verteilt den Traffic von externen Google Cloud-Load-Balancern auf Back-Ends.
Im Gegensatz zu VMs sind Cloud Run-Dienste standardmäßig nicht mit einem bestimmten VPC-Netzwerk verknüpft. In diesem Codelab wird gezeigt, wie Sie die Einstellungen für eingehenden Traffic (Verbindungen für eingehende Verbindungen) so ändern, dass nur Traffic aus einer VPC auf einen Cloud Run-Dienst (z.B. einen Back-End-Dienst) zugreifen kann. Darüber hinaus erfahren Sie in diesem Codelab, wie ein zweiter Dienst (z.B. ein Frontend-Dienst) sowohl über eine VPC auf den Cloud Run-Backend-Dienst als auch auf den öffentlichen Internetzugriff zugreifen kann.
In diesem Beispiel gibt der Cloud Run-Dienst für das Back-End "hello world" zurück. Der Cloud Run-Dienst für das Frontend bietet in der UI ein Eingabefeld zum Erfassen einer URL. Dann stellt der Front-End-Dienst eine GET-Anfrage an diese URL (z.B. den Back-End-Dienst) und macht daraus einen Dienst-zu-Dienst-Anfrage (anstatt einen Browser-zu-Dienst-Anfrage). Wenn der Front-End-Dienst das Backend erreichen kann, wird im Browser die Nachricht "hello world" angezeigt. Anschließend erfahren Sie, wie Sie https://curlmyip.org aufrufen können, um die IP-Adresse Ihres Front-End-Dienstes abzurufen.
Aufgaben in diesem Lab
- Nur Traffic von einer VPC zu Ihrem Cloud Run-Dienst zulassen
- So konfigurieren Sie ausgehenden Traffic in einem Cloud Run-Dienst (z.B. Frontend) für die Kommunikation mit einem Cloud Run-Dienst für internen eingehenden Traffic (z.B. Backend) und behalten den öffentlichen Internetzugriff für den Frontend-Dienst bei.
2. Einrichtung und Anforderungen
Voraussetzungen
- Sie sind in der Cloud Console angemeldet.
- Sie haben zuvor eine Funktion der 2. Generation bereitgestellt. Für den Einstieg können Sie beispielsweise der Kurzanleitung zur Bereitstellung von Cloud Functions (2nd gen) folgen.
Cloud Shell aktivieren
- Klicken Sie in der Cloud Console auf Cloud Shell aktivieren
.
Wenn Sie Cloud Shell zum ersten Mal starten, wird ein Zwischenbildschirm mit einer Beschreibung der Funktion angezeigt. Wenn ein Zwischenbildschirm angezeigt wird, klicken Sie auf Weiter.
Die Bereitstellung und Verbindung mit Cloud Shell dauert nur einen Moment.
Diese virtuelle Maschine verfügt über alle erforderlichen Entwicklertools. Es bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und wird in Google Cloud ausgeführt. Dadurch werden die Netzwerkleistung und die Authentifizierung erheblich verbessert. Viele, wenn nicht sogar alle Arbeiten in diesem Codelab können mit einem Browser erledigt werden.
Sobald Sie mit Cloud Shell verbunden sind, sollten Sie sehen, dass Sie authentifiziert sind und das Projekt auf Ihre Projekt-ID eingestellt ist.
- Führen Sie in Cloud Shell den folgenden Befehl aus, um zu prüfen, ob Sie authentifiziert sind:
gcloud auth list
Befehlsausgabe
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- Führen Sie in Cloud Shell den folgenden Befehl aus, um zu prüfen, ob der gcloud-Befehl Ihr Projekt kennt:
gcloud config list project
Befehlsausgabe
[core] project = <PROJECT_ID>
Ist dies nicht der Fall, können Sie die Einstellung mit diesem Befehl vornehmen:
gcloud config set project <PROJECT_ID>
Befehlsausgabe
Updated property [core/project].
3. Cloud Run-Dienste erstellen
Umgebungsvariablen einrichten
Sie können Umgebungsvariablen festlegen, die in diesem Codelab verwendet werden.
PROJECT_ID=<YOUR_PROJECT_ID> REGION=<YOUR_REGION, e.g. us-central1> FRONTEND=frontend-with-internet BACKEND=backend SUBNET_NAME=default
Cloud Run-Back-End-Dienst erstellen
Erstellen Sie zunächst ein Verzeichnis für den Quellcode und speichern Sie das Verzeichnis mit cd.
mkdir -p egress-private-codelab/frontend-w-internet egress-private-codelab/backend && cd egress-private-codelab/backend
Erstellen Sie dann 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 als Nächstes eine index.js
-Quelldatei mit folgendem Inhalt. Diese Datei enthält den Einstiegspunkt für den Dienst und die Hauptlogik für die Anwendung.
const express = require('express'); const app = express(); app.use(express.urlencoded({ extended: true })); app.get('/', function (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 abschließend den Cloud Run-Dienst bereit, indem Sie den folgenden Befehl ausführen.
gcloud run deploy $BACKEND --source . --allow-unauthenticated --region $REGION
Cloud Run-Dienst für das Frontend erstellen
Zum Front-End-Verzeichnis wechseln
cd ../frontend-w-internet
Erstellen Sie dann eine package.json
-Datei mit folgendem Inhalt:
{ "name": "frontend", "version": "1.0.0", "description": "", "scripts": { "start": "node index.js" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "axios": "^1.6.6", "express": "^4.18.2", "htmx.org": "^1.9.10" } }
Erstellen Sie als Nächstes eine index.js
-Quelldatei mit folgendem Inhalt. Diese Datei enthält den Einstiegspunkt für den Dienst und die Hauptlogik für die Anwendung.
const express = require("express"); const app = express(); const port = 8080; const path = require('path'); const axios = require('axios'); // serve static content (index.html) using // built-in middleware function in Express app.use(express.static('public')); app.use(express.urlencoded({ extended: true })); // this endpoint receives a URL in the post body // and then makes a get request to that URL // results are sent back to the caller app.post('/callService', async (req, res) => { const url = req.body.url; let message = ""; try { console.log("url: ", url); const response = await axios.get(url); message = response.data; } catch (error) { message = error.message; console.error(error.message); } res.send(` ${message} <p> </p> `); }); app.listen(port, () => { console.log(`Example app listening on port ${port}`); });
Öffentliches Verzeichnis für die Datei „index.html“ erstellen
mkdir public touch public/index.html
Und aktualisieren Sie index.html
mit Folgendem:
<html> <script src="https://unpkg.com/htmx.org@1.9.10" integrity="sha384-D1Kt99CQMDuVetoL1lrYwg5t+9QdHe7NLX/SoJYkXDFfX37iInKRy5xLSi8nO7UC" crossorigin="anonymous" ></script> <body> <div style="margin-top: 100px; margin-left: 100px"> <h1>I'm the Request Tester service on the Internet</h1> <form hx-trigger="submit" hx-post="/callService" hx-target="#zen"> <label for="url"> URL:</label> <input style="width: 308px" type="text" id="url" name="url" placeholder="The backend service URL" required /> <button hx-indicator="#loading" type="submit">Submit</button> <p></p> <span class="htmx-indicator" id="loading"> Loading... </span> <div id="zen" style="white-space: pre-wrap"></div> <p></p> </form> </div> </body> </html>
Stellen Sie abschließend den Cloud Run-Dienst bereit, indem Sie den folgenden Befehl ausführen.
gcloud run deploy $FRONTEND --source . --allow-unauthenticated --region $REGION
Back-End-Dienst aufrufen
In diesem Abschnitt prüfen Sie, ob Sie zwei Cloud Run-Dienste erfolgreich bereitgestellt haben.
Öffnen Sie die URL des Front-End-Dienstes in Ihrem Webbrowser, z.B. https://frontend-your-hash-uc.a.run.app/
Geben Sie die URL für den Back-End-Dienst in das Textfeld ein. Beachten Sie, dass diese Anfrage von der Cloud Run-Front-End-Instanz an den Cloud Run-Back-End-Dienst weitergeleitet wird und nicht von Ihrem Browser.
Sie sehen „Hello World“
4. Back-End-Dienst nur für internen eingehenden Traffic festlegen
Mit dem folgenden gcloud-Befehl können Sie einen Cloud Run-Dienst in Ihr privates Netzwerk einbinden.
gcloud run services update $BACKEND --ingress internal --region $REGION
Wenn Sie versuchen, den Backend-Dienst vom Frontend-Dienst aus aufzurufen, erhalten Sie einen 404-Fehler. Die ausgehende Verbindung (oder ausgehender Traffic) des Cloud Run-Dienstes am Frontend geht zuerst ins Internet, sodass Google Cloud den Ursprung der Anfrage nicht kennt.
5. Front-End-Dienst für den Zugriff auf die VPC konfigurieren
In diesem Abschnitt konfigurieren Sie den Cloud Run-Dienst für das Front-End so, dass er über eine VPC mit dem Back-End-Dienst kommuniziert.
Dazu müssen Sie Ihrem Front-End-Cloud Run-Dienst direkten ausgehenden VPC-Traffic hinzufügen, damit er interne IP-Adressen im VPC-Netzwerk erreichen kann. Anschließend konfigurieren Sie den ausgehenden Traffic so, dass nur Anfragen an private IP-Adressen an die VPC weitergeleitet werden. Durch diese Konfiguration kann Ihr Front-End weiterhin das öffentliche Internet erreichen. Weitere Informationen finden Sie in der Dokumentation zum Empfangen von Anfragen von anderen Cloud Run-Diensten.
Ausgehenden direkten VPC-Traffic konfigurieren
Führen Sie zuerst diesen Befehl aus, um direkten ausgehenden VPC-Traffic für Ihren Front-End-Dienst zu verwenden:
gcloud beta run services update $FRONTEND \ --network=$SUBNET_NAME \ --subnet=$SUBNET_NAME \ --vpc-egress=private-ranges-only \ --region=$REGION
Sie können jetzt bestätigen, dass Ihr Front-End-Dienst Zugriff auf die VPC hat:
gcloud beta run services describe $FRONTEND \ --region=$REGION
Die Ausgabe sollte in etwa so aussehen:
VPC access: Network: default Subnet: default Egress: private-ranges-only
Privaten Google-Zugriff aktivieren
Als Nächstes aktivieren Sie den privaten Google-Zugriff für das Subnetz, indem Sie den folgenden Befehl ausführen:
gcloud compute networks subnets update $SUBNET_NAME \ --region=$REGION \ --enable-private-ip-google-access
Sie können prüfen, ob der private Google-Zugriff aktiviert wurde, indem Sie den folgenden Befehl ausführen:
gcloud compute networks subnets describe $SUBNET_NAME \ --region=$REGION \ --format="get(privateIpGoogleAccess)"
Cloud DNS-Zone für run.app-URLs erstellen
Erstellen Sie schließlich eine Cloud DNS-Zone für run.app-URLs, damit Google Cloud sie als interne IP-Adressen behandeln kann.
In einem vorherigen Schritt, wenn Sie ausgehenden VPC-Traffic zu „Nur private Bereiche“ konfiguriert haben. Das bedeutet, dass ausgehende Verbindungen von Ihrem Front-End-Dienst nur zum VPC-Netzwerk geleitet werden, wenn das Ziel eine interne IP-Adresse ist. Der Back-End-Dienst verwendet jedoch eine run.app-URL, die in eine öffentliche IP-Adresse aufgelöst wird.
In diesem Schritt erstellen Sie eine Cloud DNS-Zone für die run.app-URLs, die in die privaten.googleapis.com-IP-Adressbereiche aufgelöst werden sollen, die als interne IP-Adressen erkannt werden. Jetzt werden alle Anfragen an diese Bereiche über Ihr VPC-Netzwerk weitergeleitet.
Gehen Sie dazu so vor: https://cloud.google.com/run/docs/securing/private-networking#from-other-services
# do not include the https:// in your DNS Name # for example: backend-<hash>-uc.a.run.app DNS_NAME=<your backend service URL without the https://> gcloud dns --project=$PROJECT_ID managed-zones create codelab-backend-service \ --description="" \ --dns-name="a.run.app." \ --visibility="private" \ --networks=$SUBNET_NAME gcloud dns --project=$PROJECT_ID record-sets create $DNS_NAME. \ --zone="codelab-backend-service" \ --type="A" \ --ttl="60" \ --rrdatas="199.36.153.8,199.36.153.9,199.36.153.10,199.36.153.11"
Wenn Sie jetzt versuchen, den Back-End-Dienst für Ihre Website zu erreichen, sehen Sie "Hello World" zurückgegeben.
Wenn Sie versuchen, über https://curlmyip.org/ auf das Internet zuzugreifen, wird Ihre IP-Adresse angezeigt.
6. Fehlerbehebung
Im Folgenden finden Sie einige mögliche Fehlermeldungen, die auftreten können, wenn Einstellungen nicht richtig konfiguriert wurden.
- Wenn ein Fehler
getaddrinfo ENOTFOUND backend-your-hash-uc.a.run.app
angezeigt wird, prüfen Sie, ob Sie „https://“ nicht hinzugefügt haben den DNS-A-Eintrag hinzufügen, - Wenn Sie beim Versuch, nach der Konfiguration der Zone auf das Backend zuzugreifen, den Fehler 404 erhalten, können Sie entweder warten, bis der Cache im globalen run.app-Eintrag abläuft (z. B. nach 6 Stunden) oder eine neue Version erstellen und damit den Cache leeren. Führen Sie dazu den folgenden Befehl aus:
gcloud beta run services update $FRONTEND --network=$SUBNET_NAME --subnet=$SUBNET_NAME --vpc-egress=private-ranges-only --region=$REGION
7. Glückwunsch!
Herzlichen Glückwunsch zum Abschluss des Codelabs!
Weitere Informationen finden Sie in der Dokumentation zu Privaten Netzwerken in Cloud Run.
Behandelte Themen
- Nur Traffic von einer VPC zu Ihrem Cloud Run-Dienst zulassen
- So konfigurieren Sie ausgehenden Traffic in einem Cloud Run-Dienst (z.B. Frontend) für die Kommunikation mit einem Cloud Run-Dienst für internen eingehenden Traffic (z.B. Backend) und behalten den öffentlichen Internetzugriff für den Frontend-Dienst bei.
8. Bereinigen
Um versehentliche Gebühren zu vermeiden, z. B. wenn diese Cloud Run-Dienstleistung versehentlich mehr Mal aufgerufen wird als Ihre monatliche Zuweisung von Cloud Run-Aufrufen in der kostenlosen Stufe, können Sie entweder den Cloud Run-Dienst oder das in Schritt 2 erstellte Projekt löschen.
Wenn Sie die Cloud Run-Dienste löschen möchten, rufen Sie die Cloud Run-Cloud Console unter https://console.cloud.google.com/functions/ auf und löschen Sie die $FRONTEND- und $BACKEND-Dienste, die Sie in diesem Codelab erstellt haben.
Wenn Sie das gesamte Projekt löschen möchten, rufen Sie https://console.cloud.google.com/cloud-resource-manager auf, wählen Sie das in Schritt 2 erstellte Projekt aus und klicken Sie auf „Löschen“. Wenn Sie das Projekt löschen, müssen Sie die Projekte in Ihrem Cloud SDK ändern. Sie können die Liste aller verfügbaren Projekte mit dem Befehl gcloud projects list
aufrufen.