Verbindung zu Private CloudSQL über Cloud Run herstellen

1. Übersicht

In diesem Lab erstellen Sie den Cymbal Eats-Menüdienst und stellen RESTful APIs bereit, um Menüelemente hinzuzufügen, zu aktualisieren, zu löschen und aufzulisten. Sie erstellen eine Cloud SQL-Datenbank als Back-End-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
  • CloudRun 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 Projektteilnehmer. Es handelt sich um eine Zeichenfolge, die von Google APIs nicht verwendet wird. Sie können sie jederzeit aktualisieren.
  • Die Projekt-ID ist für alle Google Cloud-Projekte eindeutig und unveränderlich. Sie kann nach dem Festlegen nicht mehr geändert werden. Die Cloud Console generiert automatisch einen eindeutigen String. ist Ihnen meist egal, was es ist. In den meisten Codelabs musst du dich auf die Projekt-ID beziehen, die üblicherweise als PROJECT_ID gekennzeichnet ist. Wenn Ihnen die generierte ID nicht gefällt, können Sie eine weitere zufällige ID erstellen. Alternativ können Sie einen eigenen verwenden und nachsehen, ob er verfügbar ist. Sie kann nach diesem Schritt nicht mehr geändert werden und bleibt für die Dauer des Projekts bestehen.
  • Zur Information gibt es noch einen dritten Wert, die Projektnummer, die von manchen APIs verwendet wird. Weitere Informationen zu allen drei Werten finden Sie in der Dokumentation.
  1. Als Nächstes müssen Sie in der Cloud Console die Abrechnung aktivieren, um Cloud-Ressourcen/APIs verwenden zu können. Dieses Codelab sollte ohne großen Aufwand betrieben werden. Wenn Sie Ressourcen herunterfahren möchten, um über diese Anleitung hinaus keine Kosten zu verursachen, können Sie die von Ihnen erstellten Ressourcen oder das gesamte Projekt löschen. Neue Google Cloud-Nutzer haben Anspruch auf eine kostenlose Testversion von 300$.

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. Klonen Sie das Repository und rufen Sie das Verzeichnis auf
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 erfolgt als VPC-Peering-Verbindung zwischen Ihrem VPC-Netzwerk und dem zugrunde liegenden Google Cloud-VPC-Netzwerk, 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 externe 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, die genauso eingerichtet ist 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, mit 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. Datenbank zur Datenbankinstanz 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. Datenbank-IP-Adresse speichern
export DB_INSTANCE_IP=$(gcloud sql instances describe $DB_INSTANCE_NAME \
    --format=json | jq \
    --raw-output ".ipAddresses[].ipAddress")
  1. 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

Über den serverlosen VPC-Zugriff können Sie in serverlosen Umgebungen wie Cloud Run, App Engine oder Cloud Functions eine direkte Verbindung zu Ihrem Virtual Private Cloud-Netzwerk 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. Für die Antworten auf diese Anfragen wird auch Ihr internes Netzwerk verwendet.

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 ein Docker-Image und stellen es in Cloud Run bereit. Außerdem verbinden Sie Cloud Run mit dem serverlosen VPC-Connector, 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. Erstellen Sie ein Docker-Image:
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. Übertragen Sie das Docker-Image per Push in die Container Registry:
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, vertrauliche Informationen wie SQL-Anmeldedaten in Secret Manager zu speichern. Sie können mit Cloud Run Secrets als Umgebungsvariablen übergeben oder als Volume bereitstellen.

  1. URL des Speisekartenservice:
MENU_SERVICE_URL=$(gcloud run services describe menu-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")
  1. URL für Speisekarte prüfen
echo $MENU_SERVICE_URL

Beispielausgabe

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

7. Dienst testen

  1. Erstellen Sie einen neuen Menüpunkt, indem Sie eine POST-Anfrage senden:
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. Ändern Sie den Status eines Menüpunkts durch Senden einer PUT-Anfrage:
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!

Glückwunsch, du hast das Codelab abgeschlossen.

Nächste Schritte:

Weitere Codelabs von 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.