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

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.

19c7b05f35789fda.png

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

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

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

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

219cb722c2dd1b82.png

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

Tworzenie bazy danych i użytkownika

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

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, a następnie 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ą 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] ------------------------------------------------------------------------
  1. 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
  1. 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
  1. 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.

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

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

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.