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

1. Przegląd

W tym module utworzysz usługę menu Cymbal Eats, która udostępnia 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 prywatnych usług 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 usługa bazy danych w pełni zarządzana, 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 podłączony do maszyny wirtualnej. Każdej maszynie wirtualnej przypisywany jest 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 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.