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.
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
- 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 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 auf die Projekt-ID verweisen, 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.
- Als Nächstes müssen Sie in der Cloud Console die Abrechnung aktivieren, um Cloud-Ressourcen/APIs verwenden zu können. Dieses Codelab sollte möglichst wenig kosten. 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 mit 300$Guthaben.
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
- Klonen Sie das Repository und rufen Sie das Verzeichnis auf
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 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.
- 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, 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.
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
- 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
- SQL-Nutzer erstellen
gcloud sql users create ${DB_USER} \
--password=$DB_PASSWORD \
--instance=$DB_INSTANCE_NAME
Beispielausgabe
Created user [menu-user].
- Datenbank-IP-Adresse speichern
export DB_INSTANCE_IP=$(gcloud sql instances describe $DB_INSTANCE_NAME \
--format=json | jq \
--raw-output ".ipAddresses[].ipAddress")
- 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.
- 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.
- 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] ------------------------------------------------------------------------
- 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
- Ü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
- 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.
- URL des Speisekartenservice:
MENU_SERVICE_URL=$(gcloud run services describe menu-service \
--platform managed \
--region $REGION \
--format=json | jq \
--raw-output ".status.url")
- URL für Speisekarte prüfen
echo $MENU_SERVICE_URL
Beispielausgabe
https://menu-service-g2mfphytdq-uk.a.run.app
7. Dienst testen
- 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" }
- Ä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:
- Cloud Workflows mit Eventarc auslösen
- Ereignisverarbeitung aus Cloud Storage auslösen
- Verbindung zu vollständig verwalteten Datenbanken über Cloud Run herstellen
- Sichere serverlose Anwendung mit Identity-Aware Proxy (IAP)
- Cloud Run-Jobs mit Cloud Scheduler auslösen
- Sichere Bereitstellung in Cloud Run
- Eingehenden Cloud Run-Traffic sichern
- Verbindung zu privater AlloyDB über 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.