1. Omówienie
W tym module utworzysz usługę menu Cymbal Eats i udostępnisz interfejsy API RESTowe 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 uruchamiana w Cloud Run. Cloud Run nie znajduje się w tej samej sieci VPC co baza danych Cloud SQL, dlatego musisz skonfigurować oprogramowanie sprzęgające bezserwerowego dostępu do VPC, aby umożliwić Cloud Run komunikowanie się z Cloud SQL przez prywatny adres IP.
Czego się nauczysz
Z tego modułu nauczysz się:
- Skonfiguruj prywatną sieć VPC
- Tworzenie prywatnej bazy danych Postgres Cloud SQL
- Łączenie Cloud Run z prywatną siecią VPC
- Wdrażanie w Cloud Run usługi łączącej 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 wykorzystaj już istniejący. Jeśli nie masz jeszcze konta Gmail ani Google Workspace, musisz je utworzyć.
- Nazwa projektu jest wyświetlaną nazwą uczestników tego projektu. To ciąg znaków, który nie jest używany przez interfejsy API Google. W każdej chwili możesz ją zmienić.
- Identyfikator projektu jest unikalny we wszystkich projektach Google Cloud i nie można go zmienić (po jego ustawieniu nie można go zmienić). Cloud Console automatycznie wygeneruje unikalny ciąg znaków. zwykle nieważne, co ona jest. W większości ćwiczeń z programowania konieczne jest odwołanie się do identyfikatora projektu (zwykle nazywa się on
PROJECT_ID
). Jeśli nie podoba Ci się wygenerowany identyfikator, możesz wygenerować kolejny losowy. Możesz też spróbować własnych sił i sprawdzić, czy jest dostępna. Potem nie będzie można go zmienić. Pozostanie ono przez czas trwania projektu. - Dostępna jest trzecia wartość, numer projektu, z którego korzystają niektóre interfejsy API. Więcej informacji o wszystkich 3 wartościach znajdziesz w dokumentacji.
- Następnie musisz włączyć płatności w Cloud Console, aby korzystać z zasobów Cloud/interfejsów API. Ukończenie tego ćwiczenia z programowania nie powinno kosztować zbyt wiele. Aby wyłączyć zasoby, aby nie naliczać opłat po zakończeniu tego samouczka, możesz usunąć utworzone zasoby lub cały projekt. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego o wartoś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
- Skopiuj repozytorium i przejdź do katalogu
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service
- Włączanie usług
gcloud services enable \
sqladmin.googleapis.com \
run.googleapis.com \
vpcaccess.googleapis.com \
servicenetworking.googleapis.com
3. Skonfiguruj dostęp prywatny
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. Połączenie prywatne umożliwia instancjom maszyn wirtualnych w Twojej sieci VPC i usługom, których używasz, na komunikację wyłącznie przez wewnętrzne adresy IP. Aby można było korzystać z usług dostępnych w ramach dostępu do usług prywatnych, instancje maszyn wirtualnych nie wymagają połączenia z internetem ani zewnętrznych adresów IP.
- Przydziel zakres 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 ułatwiająca konfigurację i obsługę relacyjnych baz danych PostgreSQL i MySQL w chmurze oraz zarządzanie i administrowanie nimi. Każda instancja Cloud SQL jest obsługiwana przez maszynę wirtualną, która działa na serwerze hosta Google Cloud. Opcja wysokiej dostępności obejmuje też gotową maszynę wirtualną w innej strefie z tą samą konfiguracją co podstawowa maszyna wirtualna. Baza danych jest przechowywana na skalowalnym, trwałym sieciowym urządzeniu pamięci masowej nazywanym dyskiem stałym, który jest połączony z maszyną wirtualną. Do każdej maszyny wirtualnej jest przypisywany statyczny adres IP, aby adres IP, z którym łączy się aplikacja, pozostaje niezmieniony przez cały okres użytkowania instancji Cloud SQL.
Utworzysz bazę danych Postgres Cloud SQL z prywatnym adresem IP.
Tworzenie bazy danych i użytkownika
- Tworzenie instancji Postgres Cloud SQL 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].
- Zapisywanie adresu 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. Bezserwerowe środowisko VPC
Bezserwerowy dostęp do VPC umożliwia łączenie się bezpośrednio 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 bezserwerowemu środowisku wysyłania żądań do Twojej sieci VPC przy użyciu wewnętrznych adresów DNS i wewnętrznych adresów IP (zgodnie z definicją w dokumentach RFC 1918 i RFC 6598). Odpowiedzi na te żądania będą też przesyłane do Twojej sieci wewnętrznej.
Utworzysz oprogramowanie sprzęgające bezserwerowego dostępu do VPC dla usługi Cloud Run, aby połą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, a następnie połączysz Cloud Run z bezserwerowym oprogramowaniem sprzęgającym VPC, aby uzyskać dostęp do bazy danych Cloud SQL.
- Kompilowanie aplikacji za pomocą narzędzia 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] ------------------------------------------------------------------------
- Obraz Dockera kompilacji:
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
- Przenieś 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
- Usługa menu wdrażania:
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 korzystanie z usługi Secret Manager do przechowywania informacji poufnych, takich jak dane logowania SQL. Cloud Run pozwala przekazywać obiekty tajne jako zmienne środowiskowe lub podłączyć 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")
- Sprawdzanie 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 nową pozycję 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" }
- Zmienianie stanu pozycji menu przez wysłanie żądania 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. Udało Ci się ukończyć ćwiczenia z programowania.
Co dalej:
Poznaj inne ćwiczenia z programowania Cymbal Eats:
- Aktywowanie przepływów pracy w Cloud za pomocą Eventarc
- Aktywowanie przetwarzania zdarzeń z Cloud Storage
- Łączenie z w pełni zarządzanymi bazami danych z Cloud Run
- Bezpieczna aplikacja bezserwerowa z serwerem proxy identyfikującym tożsamość (IAP)
- Aktywowanie zadań Cloud Run za pomocą usługi Cloud Scheduler
- Bezpieczne wdrażanie w Cloud Run
- Zabezpieczanie ruchu przychodzącego w Cloud Run
- Łączenie z prywatnym 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.
Usuwam projekt
Najprostszym sposobem na uniknięcie płatności jest usunięcie projektu utworzonego na potrzeby samouczka.