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.

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
- 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.



- 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_IDangegeben). 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
- 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
- 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
- Repository klonen und zum Verzeichnis wechseln
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service
- 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.
- 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].
- 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.

Sie erstellen eine Postgres Cloud SQL-Datenbank mit einer privaten IP-Adresse.
Datenbank und Nutzer erstellen
- 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
- 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
- SQL-Nutzer erstellen
gcloud sql users create ${DB_USER} \
--password=$DB_PASSWORD \
--instance=$DB_INSTANCE_NAME
Beispielausgabe
Created user [menu-user].
- IP-Adresse der Datenbank speichern
export DB_INSTANCE_IP=$(gcloud sql instances describe $DB_INSTANCE_NAME \
--format=json | jq \
--raw-output ".ipAddresses[].ipAddress")
- 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.

- 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.
- 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] ------------------------------------------------------------------------
- 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
- 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
- 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.
- 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")
- Menüdienst-URL überprüfen
echo $MENU_SERVICE_URL
Beispielausgabe
https://menu-service-g2mfphytdq-uk.a.run.app
7. Dienst testen
- 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"
}
- 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:
- Cloud Workflows mit Eventarc auslösen
- Ereignisverarbeitung über Cloud Storage auslösen
- Verbindung zu vollständig verwalteten Datenbanken über Cloud Run herstellen
- Serverlose Anwendung mit Identity-Aware Proxy (IAP) sichern
- Cloud Run-Jobs mit Cloud Scheduler auslösen
- Sichere Bereitstellung in Cloud Run
- Cloud Run-Ingress-Traffic sichern
- Verbindung zu privaten AlloyDB-Instanzen von GKE Autopilot herstellen
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.