1. Przegląd
W tym module utworzysz usługę menu Cymbal Eats, udostępniając interfejsy API RESTful do dodawania, aktualizowania, usuwania i wyświetlania pozycji menu. Utworzysz bazę danych Cloud SQL jako bazę danych backendu dla usługi menu, która będzie działać w Cloud Run. Cloud Run nie znajduje się w tym samym VPC co baza danych Cloud SQL, dlatego musisz skonfigurować oprogramowanie sprzęgające bezserwerowy dostęp do VPC, aby umożliwić Cloud Run komunikację z Cloud SQL za pomocą prywatnego adresu IP.

Czego się nauczysz
W tym module nauczysz się:
- Konfigurowanie prywatnej sieci VPC
- Tworzenie prywatnej bazy danych Postgres Cloud SQL
- Łączenie Cloud Run z prywatną siecią VPC
- Wdrażanie usługi w Cloud Run, która łączy się z bazą danych Cloud SQL
2. Konfiguracja i wymagania
Samodzielne konfigurowanie środowiska
- Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub użyj istniejącego. Jeśli nie masz jeszcze konta Gmail ani Google Workspace, musisz je utworzyć.



- Nazwa projektu to wyświetlana nazwa uczestników tego projektu. Jest to ciąg znaków, który nie jest używany przez interfejsy API Google. Możesz ją zaktualizować w dowolnym momencie.
- Identyfikator projektu jest unikalny we wszystkich projektach Google Cloud i nie można go zmienić po ustawieniu. Konsola Cloud automatycznie generuje unikalny ciąg znaków. Zwykle nie musisz się nim przejmować. W większości ćwiczeń z programowania musisz odwoływać się do identyfikatora projektu (zwykle jest on oznaczony jako
PROJECT_ID). Jeśli wygenerowany identyfikator Ci się nie podoba, możesz wygenerować inny losowy identyfikator. Możesz też spróbować własnej nazwy i sprawdzić, czy jest dostępna. Po tym kroku nie można go zmienić i będzie obowiązywać przez cały czas trwania projektu. - Warto wiedzieć, że istnieje też trzecia wartość, czyli numer projektu, z której korzystają niektóre interfejsy API. Więcej informacji o tych 3 wartościach znajdziesz w dokumentacji.
- Następnie musisz włączyć płatności w konsoli Cloud, aby korzystać z zasobów i interfejsów API Google Cloud. Ukończenie tego laboratorium nie powinno wiązać się z dużymi kosztami, a nawet z żadnymi. Aby wyłączyć zasoby i uniknąć naliczania opłat po zakończeniu tego samouczka, możesz usunąć utworzone zasoby lub cały projekt. Nowi użytkownicy Google Cloud mogą skorzystać z bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.
Konfiguracja środowiska
- Tworzenie zmiennych środowiskowych związanych z projektami i zasobami
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
- Klonowanie repozytorium i przechodzenie do katalogu
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service
- Włącz usługi
gcloud services enable \
sqladmin.googleapis.com \
run.googleapis.com \
vpcaccess.googleapis.com \
servicenetworking.googleapis.com
3. Konfigurowanie dostępu prywatnego
Dostęp do usług prywatnych jest udostępniany jako połączenie równorzędne VPC między siecią VPC a bazową siecią VPC Google Cloud, w której znajduje się instancja Cloud SQL. Prywatne połączenie pozwala instancjom maszyn wirtualnych w sieci VPC i usługom, z których korzystasz, komunikować się wyłącznie z użyciem wewnętrznych adresów IP. Aby uzyskać dostęp do usług dostępnych za pomocą prywatnego dostępu do usług, instancje maszyn wirtualnych nie wymagają połączenia z internetem ani zewnętrznych adresów IP.
- Przydzielanie zakresu adresów IP
gcloud compute addresses create google-managed-services-default \
--global \
--purpose=VPC_PEERING \
--prefix-length=20 \
--network=projects/$PROJECT_ID/global/networks/default
Przykładowe dane wyjściowe
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-2-348215/global/addresses/google-managed-services-default].
- Utwórz połączenie prywatne.
gcloud services vpc-peerings connect \
--service=servicenetworking.googleapis.com \
--ranges=google-managed-services-default \
--network=default \
--project=$PROJECT_ID
Przykładowe dane wyjściowe
Operation "operations/pssn.p24-528514492617-2f2b507f-e4e5-4d53-a4de-9ddaceb4e92f" finished successfully.
4. Konfigurowanie Cloud SQL
Cloud SQL to w pełni zarządzana usługa bazy danych, która ułatwia konfigurowanie, obsługę, zarządzanie i administrowanie relacyjnymi bazami danych PostgreSQL i MySQL w chmurze. Każda instancja Cloud SQL jest obsługiwana przez maszynę wirtualną działającą na serwerze hosta Google Cloud. Opcja wysokiej dostępności obejmuje też maszynę wirtualną w trybie gotowości w innej strefie, która ma taką samą konfigurację jak maszyna wirtualna podstawowa. Baza danych jest przechowywana na skalowalnym, trwałym sieciowym urządzeniu do przechowywania danych, zwanym dyskiem stałym, który jest połączony z maszyną wirtualną. Do każdej maszyny wirtualnej jest przypisany statyczny adres IP, aby adres IP, z którym łączy się aplikacja, pozostawał stały przez cały okres istnienia instancji Cloud SQL.

Utworzysz bazę danych Postgres Cloud SQL z prywatnym adresem IP.
Tworzenie bazy danych i użytkownika
- Tworzenie instancji Cloud SQL dla PostgreSQL do używania prywatnego adresu IP
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}
Przykładowe dane wyjściowe
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
- Dodawanie bazy danych do instancji bazy danych
gcloud sql databases create $DB_DATABASE --instance=$DB_INSTANCE_NAME
Przykładowe dane wyjściowe
Created database [menu-db]. instance: menu-catalog name: menu-db project: cymbal1
- Tworzenie użytkownika SQL
gcloud sql users create ${DB_USER} \
--password=$DB_PASSWORD \
--instance=$DB_INSTANCE_NAME
Przykładowe dane wyjściowe
Created user [menu-user].
- Zapisz adres IP bazy danych
export DB_INSTANCE_IP=$(gcloud sql instances describe $DB_INSTANCE_NAME \
--format=json | jq \
--raw-output ".ipAddresses[].ipAddress")
- Dodawanie roli Klienta Cloud SQL do konta usługi Compute Engine
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/cloudsql.client"
Przykładowe dane wyjściowe
Updated IAM policy for project [cymbal1]. [...]
5. Bezserwerowa sieć VPC
Bezserwerowy dostęp do VPC umożliwia bezpośrednie łączenie się z siecią prywatnego środowiska wirtualnego w chmurze ze środowisk bezserwerowych, takich jak Cloud Run, App Engine czy Cloud Functions. Skonfigurowanie bezserwerowego dostępu do VPC umożliwia środowisku bezserwerowemu wysyłanie żądań do sieci VPC za pomocą wewnętrznego DNS i wewnętrznych adresów IP (zgodnie z definicjami w RFC 1918 i RFC 6598). Odpowiedzi na te żądania również korzystają z Twojej sieci wewnętrznej.
Utworzysz oprogramowanie sprzęgające bezserwerowy dostęp do VPC, aby usługa Cloud Run mogła łączyć się z Cloud SQL.

- Utwórz oprogramowanie sprzęgające bezserwerowego dostępu do VPC w tej samej sieci VPC co instancja Cloud SQL.
gcloud compute networks vpc-access connectors create ${SERVERLESS_VPC_CONNECTOR} \
--region=${REGION} \
--range=10.8.0.0/28
Przykładowe dane wyjściowe
Created connector [cymbalconnector].
6. Wdrażanie w Cloud Run
Utworzysz i wdrożysz obraz Dockera w Cloud Run oraz połączysz Cloud Run z bezserwerowym oprogramowaniem sprzęgającym VPC, aby uzyskać dostęp do bazy danych Cloud SQL.
- Kompilowanie aplikacji za pomocą Maven
./mvnw package -DskipTests
Przykładowe dane wyjściowe
[...] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 42.864 s [INFO] Finished at: 2022-04-28T16:15:33Z [INFO] ------------------------------------------------------------------------
- Utwórz obraz Dockera:
docker build -f src/main/docker/Dockerfile.jvm \
--tag gcr.io/$PROJECT_NAME/menu-service .
Przykładowe dane wyjściowe
[...] Successfully built 4ef5d7a3befc Successfully tagged gcr.io/cymbal1/menu-service:latest
- Prześlij obraz Dockera do rejestru kontenerów:
docker push gcr.io/$PROJECT_NAME/menu-service
Przykładowe dane wyjściowe
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
- Wdróż usługę menu:
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
Przykładowe dane wyjściowe
[...] 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 zaleca używanie usługi Secret Manager do przechowywania informacji poufnych, takich jak dane logowania SQL. W Cloud Run możesz przekazywać obiekty tajne jako zmienne środowiskowe lub podłączać je jako wolumin.
- Adres URL usługi Menu sklepu:
MENU_SERVICE_URL=$(gcloud run services describe menu-service \
--platform managed \
--region $REGION \
--format=json | jq \
--raw-output ".status.url")
- Weryfikowanie adresu URL usługi menu
echo $MENU_SERVICE_URL
Przykładowe dane wyjściowe
https://menu-service-g2mfphytdq-uk.a.run.app
7. Testowanie usługi
- Utwórz nowy element menu, wysyłając żądanie POST:
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!!"
}'
Przykładowe dane wyjściowe
{
"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"
}
- Zmień stan pozycji menu, wysyłając żądanie PUT:
curl -X PUT "${MENU_SERVICE_URL}/menu/1" \
-H 'Content-Type: application/json' \
-d '{"status": "Ready"}'
Przykładowe dane wyjściowe
{
"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. Gratulacje!
Gratulacje! Codelab został ukończony.
Co dalej?
Zapoznaj się z innymi ćwiczeniami z programowania dotyczącymi Cymbal Eats:
- Aktywowanie Cloud Workflows za pomocą Eventarc
- Aktywowanie przetwarzania zdarzeń z Cloud Storage
- Łączenie się z w pełni zarządzanymi bazami danych z usługi Cloud Run
- Zabezpieczanie aplikacji bezserwerowej za pomocą serwera proxy identyfikującego tożsamość (IAP)
- Wywoływanie zadań Cloud Run za pomocą Cloud Scheduler
- Bezpieczne wdrażanie w Cloud Run
- Zabezpieczanie ruchu przychodzącego w Cloud Run
- Łączenie się z prywatną bazą danych AlloyDB z Autopilota w GKE
Czyszczenie danych
Aby uniknąć obciążenia konta Google Cloud opłatami za zasoby zużyte w tym samouczku, możesz usunąć projekt zawierający te zasoby lub zachować projekt i usunąć poszczególne zasoby.
Usuwanie projektu
Najprostszym sposobem na uniknięcie płatności jest usunięcie projektu utworzonego w tym samouczku.