Łączenie się z prywatnym Cloud SQL z Cloud Run

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.

19c7b05f35789fda.png

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

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

  1. 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
  1. Klonowanie repozytorium i przechodzenie do katalogu
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service
  1. 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.

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

219cb722c2dd1b82.png

Utworzysz bazę danych Postgres Cloud SQL z prywatnym adresem IP.

Tworzenie bazy danych i użytkownika

  1. 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
  1. 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
  1. 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].
  1. Zapisz adres IP bazy danych
export DB_INSTANCE_IP=$(gcloud sql instances describe $DB_INSTANCE_NAME \
    --format=json | jq \
    --raw-output ".ipAddresses[].ipAddress")
  1. 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.

19c7b05f35789fda.png

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

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

  1. 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")
  1. 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

  1. 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"
}
  1. 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:

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.