Verbindung zu Private CloudSQL über Cloud Run herstellen

1. Übersicht

In diesem Lab erstellen Sie den Menüdienst für Cymbal Eats und stellen RESTful APIs zum Hinzufügen, Aktualisieren, Löschen und Auflisten von Menüpunkten bereit. Sie erstellen eine Cloud SQL-Datenbank als Backend-Datenbank für den Menüdienst, der in Cloud Run ausgeführt wird. Da sich Cloud Run nicht in derselben VPC wie die Cloud SQL-Datenbank befindet, müssen Sie einen Connector für serverlosen VPC-Zugriff konfigurieren, damit Cloud Run über eine private IP-Adresse mit Cloud SQL kommunizieren kann.

19c7b05f35789fda.png

Lerninhalte

In diesem Lab lernen Sie Folgendes:

  • Privates VPC-Netzwerk konfigurieren
  • Private Postgres-Cloud SQL-Datenbank erstellen
  • Cloud Run mit privater VPC verbinden
  • Dienst in Cloud Run bereitstellen, der eine Verbindung zur Cloud SQL-Datenbank herstellt

2. Einrichtung und Anforderungen

Umgebung zum selbstbestimmten Lernen einrichten

  1. Melden Sie sich in der Google Cloud Console an und erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes Projekt. Wenn Sie noch kein Gmail- oder Google Workspace-Konto haben, müssen Sie eines erstellen.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Der Projektname ist der Anzeigename für die Teilnehmer dieses Projekts. Es handelt sich um einen String, der nicht von Google APIs verwendet wird. Sie können ihn jederzeit aktualisieren.
  • Die Projekt-ID ist für alle Google Cloud-Projekte eindeutig und unveränderlich (kann nach dem Festlegen nicht mehr geändert werden). In der Cloud Console wird automatisch ein eindeutiger String generiert. Normalerweise ist es nicht wichtig, wie dieser String aussieht. In den meisten Codelabs müssen Sie auf die Projekt-ID verweisen (sie wird in der Regel als PROJECT_ID angegeben). Wenn Ihnen die generierte ID nicht gefällt, können Sie eine andere zufällige ID generieren. Alternativ können Sie es mit einem eigenen versuchen und sehen, ob es verfügbar ist. Sie kann nach diesem Schritt nicht mehr geändert werden und bleibt für die Dauer des Projekts bestehen.
  • Zur Information: Es gibt einen dritten Wert, die Projektnummer, die von einigen APIs verwendet wird. Weitere Informationen zu diesen drei Werten
  1. Als Nächstes müssen Sie die Abrechnung in der Cloud Console aktivieren, um Cloud-Ressourcen/-APIs zu verwenden. Die Durchführung dieses Codelabs sollte keine oder nur geringe Kosten verursachen. Wenn Sie Ressourcen herunterfahren möchten, damit Ihnen nach Abschluss dieser Anleitung keine Kosten mehr in Rechnung gestellt werden, können Sie die von Ihnen erstellten Ressourcen oder das gesamte Projekt löschen. Neue Nutzer von Google Cloud kommen für das Programm für kostenlose Testversionen mit einem Guthaben von 300$ infrage.

Umgebung einrichten

  1. Projekt- und ressourcenbezogene Umgebungsvariablen erstellen
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export PROJECT_NAME=$(gcloud projects describe $PROJECT_ID --format='value(name)')
export REGION=us-east1
export MENU_SERVICE_NAME=menu-service

export SERVERLESS_VPC_CONNECTOR=cymbalconnector
export DB_INSTANCE_NAME=menu-catalog
export DB_INSTANCE_PASSWORD=password123
export DB_DATABASE=menu-db
export DB_USER=menu-user
export DB_PASSWORD=menupassword123
  1. Repository klonen und zum Verzeichnis wechseln
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service
  1. Dienste aktivieren
gcloud services enable \
    sqladmin.googleapis.com \
    run.googleapis.com \
    vpcaccess.googleapis.com \
    servicenetworking.googleapis.com

3. Privaten Zugriff konfigurieren

Der Zugriff auf private Dienste wird als VPC-Peering-Verbindung zwischen Ihrem VPC-Netzwerk und dem zugrunde liegenden Google Cloud-VPC-Netzwerk bereitgestellt, in dem sich Ihre Cloud SQL-Instanz befindet. Über die private Verbindung können VM-Instanzen in Ihrem VPC-Netzwerk und die von Ihnen verwendeten Dienste ausschließlich über interne IP-Adressen kommunizieren. Für den Zugriff auf Dienste, die über den Zugriff auf private Dienste verfügbar sind, benötigen VM-Instanzen keine Internetverbindung oder externen IP-Adressen.

  1. IP-Adressbereich zuweisen
gcloud compute addresses create google-managed-services-default \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=20 \
    --network=projects/$PROJECT_ID/global/networks/default

Beispielausgabe

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-2-348215/global/addresses/google-managed-services-default].
  1. Erstellen Sie eine private Verbindung.
gcloud services vpc-peerings connect \
    --service=servicenetworking.googleapis.com \
    --ranges=google-managed-services-default \
    --network=default \
    --project=$PROJECT_ID

Beispielausgabe

Operation "operations/pssn.p24-528514492617-2f2b507f-e4e5-4d53-a4de-9ddaceb4e92f" finished successfully.

4. Cloud SQL einrichten

Cloud SQL ist ein vollständig verwalteter Datenbankdienst, mit dem Sie Ihre relationalen PostgreSQL- und MySQL-Datenbanken ganz einfach in der Cloud einrichten, warten und verwalten können. Jede Cloud SQL-Instanz wird von einer virtuellen Maschine (VM) betrieben, die auf einem Google Cloud-Hostserver ausgeführt wird. Die Hochverfügbarkeitsoption umfasst auch eine Standby-VM in einer anderen Zone mit derselben Einrichtung wie die primäre VM. Die Datenbank wird auf einem skalierbaren, langlebigen Netzwerkspeichergerät namens nichtflüchtiger Speicher gespeichert, das mit der VM verbunden ist. Jeder VM wird eine statische IP-Adresse zugewiesen, damit die IP-Adresse, zu der eine Anwendung eine Verbindung herstellt, während der Lebensdauer der Cloud SQL-Instanz konstant bleibt.

219cb722c2dd1b82.png

Sie erstellen eine Postgres Cloud SQL-Datenbank mit einer privaten IP-Adresse.

Datenbank und Nutzer erstellen

  1. Postgres Cloud SQL-Instanz für die Verwendung einer privaten IP-Adresse erstellen
gcloud sql instances create $DB_INSTANCE_NAME \
    --project=$PROJECT_ID \
    --network=projects/$PROJECT_ID/global/networks/default \
    --no-assign-ip \
    --database-version=POSTGRES_12 \
    --cpu=2 \
    --memory=4GB \
    --region=$REGION \
    --root-password=${DB_INSTANCE_PASSWORD}

Beispielausgabe

Created [https://sqladmin.googleapis.com/sql/v1beta4/projects/cymbal1/instances/menu-instance].
NAME: menu-instance
DATABASE_VERSION: POSTGRES_12
LOCATION: us-east1-a
TIER: db-custom-2-4096
PRIMARY_ADDRESS: -
PRIVATE_ADDRESS: 10.8.80.5
STATUS: RUNNABLE
  1. Der Datenbankinstanz eine Datenbank hinzufügen
gcloud sql databases create $DB_DATABASE --instance=$DB_INSTANCE_NAME

Beispielausgabe

Created database [menu-db].
instance: menu-catalog
name: menu-db
project: cymbal1
  1. SQL-Nutzer erstellen
gcloud sql users create ${DB_USER} \
    --password=$DB_PASSWORD \
    --instance=$DB_INSTANCE_NAME

Beispielausgabe

Created user [menu-user].
  1. IP-Adresse der Datenbank speichern
export DB_INSTANCE_IP=$(gcloud sql instances describe $DB_INSTANCE_NAME \
    --format=json | jq \
    --raw-output ".ipAddresses[].ipAddress")
  1. Dem Compute Engine-Dienstkonto die Rolle „Cloud SQL-Client“ hinzufügen
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/cloudsql.client"

Beispielausgabe

Updated IAM policy for project [cymbal1].
[...]

5. Serverlose VPC

Mit dem serverlosen VPC-Zugriff können Sie eine Verbindung direkt zu Ihrem Virtual Private Cloud-Netzwerk aus serverlosen Umgebungen wie Cloud Run, App Engine oder Cloud Functions herstellen. Wenn Sie den serverlosen VPC-Zugriff konfigurieren, kann Ihre serverlose Umgebung Anfragen über interne DNS- und interne IP-Adressen (gemäß RFC 1918 und RFC 6598) an Ihr VPC-Netzwerk senden. Die Antworten auf diese Anfragen verwenden auch Ihr internes Netzwerk.

Sie erstellen einen Connector für serverlosen VPC-Zugriff, damit der Cloud Run-Dienst eine Verbindung zu Cloud SQL herstellen kann.

19c7b05f35789fda.png

  1. Erstellen Sie einen Connector für serverlosen VPC-Zugriff im selben VPC-Netzwerk wie Ihre Cloud SQL-Instanz.
gcloud compute networks vpc-access connectors create ${SERVERLESS_VPC_CONNECTOR} \
    --region=${REGION} \
    --range=10.8.0.0/28

Beispielausgabe

Created connector [cymbalconnector].

6. In Cloud Run bereitstellen

Sie erstellen und stellen ein Docker-Image in Cloud Run bereit und verbinden Cloud Run mit dem Connector für serverlosen VPC-Zugriff, um auf die Cloud SQL-Datenbank zuzugreifen.

  1. Anwendung mit Maven kompilieren
./mvnw package -DskipTests

Beispielausgabe

[...]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  42.864 s
[INFO] Finished at: 2022-04-28T16:15:33Z
[INFO] ------------------------------------------------------------------------
  1. Docker-Image erstellen:
docker build -f src/main/docker/Dockerfile.jvm \
    --tag gcr.io/$PROJECT_NAME/menu-service .

Beispielausgabe

[...]
Successfully built 4ef5d7a3befc
Successfully tagged gcr.io/cymbal1/menu-service:latest
  1. Docker-Image in Container Registry übertragen:
docker push gcr.io/$PROJECT_NAME/menu-service

Beispielausgabe

Using default tag: latest
The push refers to repository [gcr.io/cymbalsql/menu-service]
17b374963800: Pushed
d9a51c06430d: Pushed
fff5d2a2cfc9: Pushed
f21fceb558c6: Pushed
5ffbbbf218dd: Pushed
60609ec85f86: Layer already exists
f2c4302f03b8: Layer already exists
latest: digest: sha256:f64cb7c288dbf4ad9b12bd210c23c5aec1048dee040450ff2d9dbdf96e83a426 size: 1789
  1. Menüdienst bereitstellen:
gcloud run deploy $MENU_SERVICE_NAME \
    --image=gcr.io/$PROJECT_NAME/menu-service:latest \
    --region $REGION \
    --allow-unauthenticated \
    --set-env-vars DB_USER=$DB_USER \
    --set-env-vars DB_PASS=$DB_PASSWORD \
    --set-env-vars DB_DATABASE=$DB_DATABASE \
    --set-env-vars DB_HOST=$DB_INSTANCE_IP \
    --vpc-connector $SERVERLESS_VPC_CONNECTOR \
    --project=$PROJECT_ID \
    --quiet

Beispielausgabe

[...]
Done.
Service [menu-service] revision [menu-service-00002-xox] has been deployed and is serving 100 percent of traffic.
Service URL: https://menu-service-g2mfphytdq-uk.a.run.app

Google empfiehlt die Verwendung von Secret Manager zum Speichern vertraulicher Informationen wie SQL-Anmeldedaten. Mit Cloud Run können Sie Secrets als Umgebungsvariablen übergeben oder als Volume bereitstellen.

  1. URL des Store Menu-Dienstes:
MENU_SERVICE_URL=$(gcloud run services describe menu-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")
  1. Menüdienst-URL überprüfen
echo $MENU_SERVICE_URL

Beispielausgabe

https://menu-service-g2mfphytdq-uk.a.run.app

7. Dienst testen

  1. Neuen Menüpunkt durch Senden einer POST-Anfrage erstellen:
curl -X POST "${MENU_SERVICE_URL}/menu" \
  -H 'Content-Type: application/json' \
  -d '{
       "itemImageURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
       "itemName": "Curry Plate",
       "itemPrice": 12.5,
       "itemThumbnailURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
       "spiceLevel": 3,
       "status": "Ready",
       "tagLine": "Spicy touch for your taste buds!!"
   }'

Beispielausgabe

{
    "id": 16,
    "createDateTime": "2022-04-28T18:14:04.17225",
    "itemImageURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
    "itemName": "Curry Plate",
    "itemPrice": 12.5,
    "itemThumbnailURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
    "spiceLevel": 3,
    "status": "Processing",
    "tagLine": "Spicy touch for your taste buds!!",
    "updateDateTime": "2022-04-28T18:14:04.172298"
}
  1. Status für Menüpunkt durch Senden einer PUT-Anfrage ändern:
curl -X PUT "${MENU_SERVICE_URL}/menu/1" \
  -H 'Content-Type: application/json' \
  -d '{"status": "Ready"}'

Beispielausgabe

{
    "id": 1,
    "createDateTime": "2022-04-28T17:21:02.369093",
    "itemImageURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
    "itemName": "Curry Plate",
    "itemPrice": 12.50,
    "itemThumbnailURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
    "spiceLevel": 0,
    "status": "Ready",
    "tagLine": "Spicy touch for your taste buds!!",
    "updateDateTime": "2022-04-28T17:21:02.657636"
}

8. Glückwunsch!

Herzlichen Glückwunsch! Sie haben das Codelab abgeschlossen.

Nächste Schritte:

Weitere Codelabs zu Cymbal Eats:

Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, können Sie entweder das Projekt löschen, das die Ressourcen enthält, oder das Projekt beibehalten und die einzelnen Ressourcen löschen.

Projekt löschen

Am einfachsten vermeiden Sie weitere Kosten durch Löschen des für die Anleitung erstellten Projekts.