Blog
Wie man eine private Serverless-Verbindung mit CloudSQL erstellt

Private Verbindung
Standardmäßig sind die Dienste über öffentliche IPs miteinander verbunden. In den meisten Fällen ist es ratsam, stattdessen private IPs zu verwenden. Mit privaten IP-Adressen können sich Geräte innerhalb desselben Netzwerks verbinden, ohne eine Verbindung zum öffentlichen Internet herstellen zu müssen. Dies bietet eine zusätzliche Schutzebene, die es einem externen Host oder Benutzer erschwert, eine Verbindung herzustellen.
Das Problem
Das Zugriffsmuster Private IP wurde mit Blick auf Infrastructure as a Service (IaaS) entwickelt (d.h. virtuelle Maschinen, VPC usw.). Das bedeutet, dass dies nicht so einfach zu implementieren ist, wenn Sie Serverless-Dienste verwenden. Beispiele für Serverless Compute-Dienste innerhalb von Google Cloud sind:
- App Engine Standardumgebung
- Cloud-Funktionen
- Wolkenlauf
Die Lösung
Um dieses Problem zu lösen, hat Google eine Netzwerkkomponente veröffentlicht, die Serverless VPC Access heißt. Dieser Connector ermöglicht es Ihnen, aus Serverless-Umgebungen eine direkte Verbindung zu Ihrem VPC-Netzwerk herzustellen. Wir verwenden den Serverless VPC Access Connector, um eine Verbindung zu einer CloudSQL-Datenbank über Private IP herzustellen. Bitte beachten Sie, dass dies nicht auf CloudSQL beschränkt ist. Sobald Sie den Serverless VPC Access Connector eingerichtet haben, ist es möglich, eine Verbindung zu allen Ressourcen herzustellen, die in Ihrer VPC verfügbar sind. In diesem Blog-Beitrag führe ich Sie durch die Einrichtung dieser Funktion für die Google App Engine Standardumgebung.
Voraussetzungen:
- Authentifiziertes Google Cloud SDK, alternativ Cloud Shell.
- Ausreichende GCP-Berechtigungen, um Netzwerke zu erstellen und Implementierungen durchzuführen.
Schritt 1: Erstellen Sie eine VPC mit Netzwerken
Für diesen Blog-Beitrag werde ich eine neue VPC mit einem Subnetz in europe-west1 erstellen. Bitte beachten Sie, dass dies nicht erforderlich ist. Sie können auch Ihre eigene VPC oder die von Google bereitgestellte Standard-VPC wiederverwenden.
gcloud compute networks create private-cloud-sql
--subnet-mode custom
In Google Cloud ist eine VPC zwar global, aber wir müssen trotzdem Subnetze erstellen, um Ressourcen in den verschiedenen Cloud-Regionen bereitzustellen. Dieser Befehl erstellt ein Subnetz in der VPC, die wir zuvor für europe-west1 erstellt haben:
gcloud compute networks subnets create private-europe-west1
--description=europe-west1 subnet
--range=192.168.1.0/24
--network=private-cloud-sql
--region=europe-west1
Schritt 2: Erstellen Sie einen Serverless VPC Access Connector
Nachdem wir eine VPC mit einem Subnetz erstellt haben, können wir mit der Erstellung eines Serverless VPC Access Connector fortfahren. Dazu können wir den folgenden GCloud-Befehl verwenden.
gcloud compute networks vpc-access connectors create connector-europe-west1
--network=private-cloud-sql
--region=europe-west1
--range=10.8.0.0/28
Hinweis: Dieser Befehl verwendet einige Standardwerte für die Anzahl der Instanzen und den Instanztyp. Da dies den Netzwerkdurchsatz zwischen Ihrer VPC und den Serverless-Produkten einschränken könnte, wird empfohlen, diese Eigenschaften zu überschreiben.
Schritt 3: Private Zugangsverbindung einrichten
Die CloudSQL-Instanzen werden in einer VPC bereitgestellt, die von Google verwaltet wird. Um CloudSQL-Instanzen über eine private IP in Ihrer VPC zu nutzen, müssen wir eine VPC-Peering-Verbindung mit dem 'servicenetworking'-Netzwerk einrichten. Wenn dies das erste Mal ist, dass Sie mit dem Servicenetzwerk interagieren, müssen Sie die API über aktivieren:
gcloud services enable servicenetworking.googleapis.com
Um eine VPC-Peering-Verbindung einzurichten, müssen wir zunächst einen IP-Bereich reservieren, der verwendet werden kann. Dazu führen Sie den folgenden Befehl aus:
gcloud compute addresses create google-managed-services-private-cloud-sql
--global
--purpose=VPC_PEERING
--prefix-length=16
--network=private-cloud-sql
Damit wird ein automatisch generierter IP-Adressbereich auf der Grundlage eines Präfixes eingerichtet. Sie können den Bereich aber auch selbst festlegen. Da wir nun einen IP-Bereich haben, können wir diesen verwenden, um ein VPC-Peering einzurichten, das eine Verbindung mit dem Projekt 'Service Networking' herstellt:
gcloud services vpc-peerings connect
--service=servicenetworking.googleapis.com
--ranges=google-managed-services-private-cloud-sql
--network=private-cloud-sql
Hinweis: Dieser Schritt ist speziell für die Verbindung mit Cloud SQL über private IP gedacht. Er kann übersprungen werden, wenn Sie keine Verbindung mit CloudSQL herstellen.
Schritt 4: Erstellen einer Cloud SQL-Instanz
Nachdem wir nun die notwendige Netzwerkinfrastruktur geschaffen haben, können wir eine CloudSQL-Datenbankinstanz erstellen. Mit diesem Befehl erstellen wir eine neue PostgreSQL-Datenbank mit privater IP in dem VPC-Netzwerk, das wir zuvor eingerichtet haben. In diesem Beispiel habe ich 'secretpassword' als Root-Passwort verwendet. Für die Produktion empfehle ich die Verwendung von Google Secret Manager oder IAM-Authentifizierung.
gcloud beta sql instances create private-postgres
--region=europe-west1
--root-password=secretpassword
--database-version=POSTGRES_13
--no-assign-ip
--network=private-cloud-sql
--cpu=2
--memory=4GB
--async
Dieser Vorgang dauert ein paar Minuten. Danach kann eine Datenbank in der neu bereitgestellten CloudSQL-Instanz erstellt werden.
gcloud sql databases create test --instance private-postgres
Schritt 5: Konfigurieren Sie Ihre App Engine Anwendung
Nachdem wir nun die richtige Netzwerkkonfiguration erstellt haben und die (PostgreSQL) Datenbank angelegt wurde, ist es an der Zeit, die Konfiguration unserer App Engine Anwendung zu aktualisieren.
Eine Hallo Welt Anwendung kann hier geklont werden.
Um die Konfiguration einer App Engine Anwendung zu aktualisieren, müssen wir die Datei app.yaml ändern. Diese Datei befindet sich im Stammverzeichnis des Projekts.
Das Ergebnis könnte wie folgt aussehen (vergessen Sie nicht, die Werte für den VPC Connector und die Datenbank zu ersetzen):
runtime: nodejs14
vpc_access_connector:
name: projects/martijnsgcpproject/locations/europe-west1/connectors/connector-europe-west1
egress_setting: all-traffic
env_variables:
PGHOST: 10.39.16.5
PGUSER: postgres
PGDATABASE: test
PGPASSWORD: secretpassword
PGPORT: 5432
In diesem Beispiel werden die Informationen zur Datenbankverbindung über Umgebungsvariablen bereitgestellt. Je nach Bibliothek/Laufzeitumgebung, die Sie verwenden, müssen Sie diese möglicherweise ändern. Sie geben den Benutzernamen, die Datenbank und die in Schritt 4 verwendeten Passworteinstellungen an. Um die für Ihre CloudSQL reservierte private IP-Adresse zu erhalten, können Sie zur Google Cloud Console navigieren und die Seite Cloud SQL aufrufen. 
Schritt 6: Stellen Sie Ihre App Engine Anwendung bereit
Jetzt, wo wir unsere App Engine Spezifikation konfiguriert haben, können wir sie bereitstellen. Navigieren Sie zum Stammverzeichnis und führen Sie aus:
gcloud app deploy
Dadurch wird Ihre App verpackt, auf GCP hochgeladen und auf dem App Engine Service bereitgestellt. Nachdem die App bereitgestellt wurde, können Sie automatisch zur Anwendung navigieren, indem Sie sie ausführen:
gcloud app browse
Die Anwendung Hallo Welt hat nur einen Endpunkt. Sobald sie ausgelöst wird, stellt sie eine Verbindung mit der CloudSQL-Datenbank her und führt eine SELECT NOW() Abfrage aus.
Sobald Sie über den Befehl gcloud app browse zu dem generierten Link navigieren, sehen Sie:
Herzlichen Glückwunsch! Ihre Verbindung von Google App Engine zu einer privaten CloudSQL-Instanz ist erfolgreich!
Bonus: Wolkenlauf
In diesem Blogbeitrag geht es zwar um Google App Engine, aber es ist auch möglich, den Serverless VPC Connector mit Cloud Run zu verwenden, und zwar über:
gcloud run deploy SERVICE_NAME
--image IMAGE_URL
--vpc-connector CONNECTOR_NAME
Das Servicekonto, das Cloud Run verwendet, muss die folgende Rolle haben: roles/vpcaccess.serviceAgent.
Bonus 2: Cloud-Funktionen
Ähnlich wie bei Cloud Run können Sie eine Cloud-Funktion mit einem Serverless VPC Connector über einrichten:
gcloud functions deploy FUNCTION_NAME
--vpc-connector CONNECTOR_NAME
Das Servicekonto, das Cloud Function verwendet, muss die folgende Rolle haben: roles/vpcaccess.serviceAgent.
Fazit
Wir haben soeben gelernt, wie man die Serverless-Produkte von Google Cloud über den Serverless VPC Access Connector mit privaten IP-Instanzen kombiniert.
Das folgende Diagramm veranschaulicht alles, was wir in diesem Blogpost erstellt haben.
Verfasst von

Martijn van de Grift
Unsere Ideen
Weitere Blogs
Contact



