Connessione a Private Cloud SQL da Cloud Run

1. Panoramica

In questo lab, creerai il servizio di menu Cymbal Eats, esponendo API RESTful per aggiungere, aggiornare, eliminare ed elencare le voci di menu. Creerai un database Cloud SQL come database di backend per il servizio di menu, che verrà eseguito in Cloud Run. Poiché Cloud Run non si trova nello stesso VPC del database Cloud SQL, dovrai configurare un connettore di accesso VPC serverless per consentire a Cloud Run di comunicare con Cloud SQL tramite un indirizzo IP privato.

19c7b05f35789fda.png

Cosa imparerai a fare

In questo lab imparerai a:

  • Configurare la rete VPC privata
  • Creare un database Cloud SQL Postgres privato
  • Connettere Cloud Run al VPC privato
  • Eseguire il deployment di un servizio su Cloud Run che si connette al database Cloud SQL

2. Configurazione e requisiti

Configurazione dell'ambiente autonomo

  1. Accedi alla console Google Cloud e crea un nuovo progetto o riutilizzane uno esistente. Se non hai già un account Gmail o Google Workspace, devi crearne uno.

b35bf95b8bf3d5d8.pnga99b7ace416376c4.pngbd84a6d3004737c5.png

  • Il nome del progetto è il nome visualizzato per i partecipanti a questo progetto. È una stringa di caratteri non utilizzata dalle API di Google. Puoi aggiornarla in qualsiasi momento.
  • L'ID progetto è univoco in tutti i progetti Google Cloud ed è immutabile (non può essere modificato dopo l'impostazione). La console Cloud genera automaticamente una stringa univoca; in genere non ti interessa quale sia. Nella maggior parte dei codelab, dovrai fare riferimento all'ID progetto (in genere è identificato come PROJECT_ID). Se non ti piace l'ID generato, puoi generarne un altro casuale. In alternativa, puoi provare a crearne uno e verificare se è disponibile. Non può essere modificato dopo questo passaggio e rimarrà per tutta la durata del progetto.
  • Per tua informazione, esiste un terzo valore, un numero di progetto , utilizzato da alcune API. Scopri di più su tutti e tre questi valori nella documentazione.
  1. Dopodiché, dovrai abilitare la fatturazione nella console Cloud per utilizzare le risorse/API Cloud. Completare questo codelab non dovrebbe costare molto, se non nulla. Per arrestare le risorse in modo da non incorrere in costi di fatturazione oltre questo tutorial, puoi eliminare le risorse create o l'intero progetto. I nuovi utenti di Google Cloud hanno diritto al programma di prova senza costi di 300$.

Configurazione dell'ambiente

  1. Crea variabili di ambiente correlate a progetti e risorse
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. Clona il repository e vai alla directory
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service
  1. Abilita i servizi
gcloud services enable \
    sqladmin.googleapis.com \
    run.googleapis.com \
    vpcaccess.googleapis.com \
    servicenetworking.googleapis.com

3. Configura l'accesso privato

L'accesso privato ai servizi viene fornito come link di peering VPC tra la rete VPC e la rete VPC Google Cloud sottostante in cui si trova l'istanza Cloud SQL. La connessione privata consente alle istanze VM nella rete VPC e ai servizi che utilizzi di comunicare esclusivamente tramite indirizzi IP interni. Per accedere ai servizi disponibili tramite l'accesso privato ai servizi, le istanze VM non richiedono la connettività internet o indirizzi IP esterni.

  1. Alloca un intervallo di indirizzi IP
gcloud compute addresses create google-managed-services-default \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=20 \
    --network=projects/$PROJECT_ID/global/networks/default

Output di esempio

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-2-348215/global/addresses/google-managed-services-default].
  1. Crea una connessione privata.
gcloud services vpc-peerings connect \
    --service=servicenetworking.googleapis.com \
    --ranges=google-managed-services-default \
    --network=default \
    --project=$PROJECT_ID

Output di esempio

Operation "operations/pssn.p24-528514492617-2f2b507f-e4e5-4d53-a4de-9ddaceb4e92f" finished successfully.

4. Configurazione di Cloud SQL

Cloud SQL è un servizio di database completamente gestito che semplifica la configurazione, la manutenzione, la gestione e l'amministrazione dei database relazionali PostgreSQL e MySQL nel cloud. Ogni istanza Cloud SQL è basata su una macchina virtuale (VM) in esecuzione su un server host Google Cloud. L'opzione ad alta affidabilità include anche una VM di standby in un'altra zona con la stessa configurazione della VM principale. Il database viene mantenuto su un dispositivo di archiviazione di rete scalabile e duraturo noto come disco permanente, collegato alla VM. A ogni VM viene assegnato un indirizzo IP statico per garantire che l'indirizzo IP a cui si connette un'applicazione rimanga costante durante la durata dell'istanza Cloud SQL.

219cb722c2dd1b82.png

Creerai un database Cloud SQL Postgres con un indirizzo IP privato.

Crea un database e un utente

  1. Crea un'istanza Cloud SQL Postgres per utilizzare un IP privato
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}

Output di esempio

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. Aggiungi un database all'istanza del database
gcloud sql databases create $DB_DATABASE --instance=$DB_INSTANCE_NAME

Output di esempio

Created database [menu-db].
instance: menu-catalog
name: menu-db
project: cymbal1
  1. Crea un utente SQL
gcloud sql users create ${DB_USER} \
    --password=$DB_PASSWORD \
    --instance=$DB_INSTANCE_NAME

Output di esempio

Created user [menu-user].
  1. Memorizza l'indirizzo IP del database
export DB_INSTANCE_IP=$(gcloud sql instances describe $DB_INSTANCE_NAME \
    --format=json | jq \
    --raw-output ".ipAddresses[].ipAddress")
  1. Aggiungi il ruolo Client Cloud SQL al service account Compute Engine
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/cloudsql.client"

Output di esempio

Updated IAM policy for project [cymbal1].
[...]

5. VPC serverless

L'accesso VPC serverless consente di connetterti direttamente alla rete Virtual Private Cloud da ambienti serverless come Cloud Run, App Engine o Cloud Functions. La configurazione dell'accesso VPC serverless consente all'ambiente serverless di inviare richieste alla rete VPC utilizzando il DNS interno e gli indirizzi IP interni (come definiti da RFC 1918 e RFC 6598). Anche le risposte a queste richieste utilizzano la rete interna.

Creerai un connettore di accesso VPC serverless per il servizio Cloud Run per connetterti a Cloud SQL.

19c7b05f35789fda.png

  1. Crea un connettore di accesso VPC serverless nella stessa rete VPC dell'istanza Cloud SQL.
gcloud compute networks vpc-access connectors create ${SERVERLESS_VPC_CONNECTOR} \
    --region=${REGION} \
    --range=10.8.0.0/28

Output di esempio

Created connector [cymbalconnector].

6. Deployment in Cloud Run

Creerai ed eseguirai il deployment di un'immagine Docker in Cloud Run e connetterai Cloud Run al connettore VPC serverless per accedere al database Cloud SQL.

  1. Compila l'applicazione utilizzando Maven
./mvnw package -DskipTests

Output di esempio

[...]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  42.864 s
[INFO] Finished at: 2022-04-28T16:15:33Z
[INFO] ------------------------------------------------------------------------
  1. Crea l'immagine Docker:
docker build -f src/main/docker/Dockerfile.jvm \
    --tag gcr.io/$PROJECT_NAME/menu-service .

Output di esempio

[...]
Successfully built 4ef5d7a3befc
Successfully tagged gcr.io/cymbal1/menu-service:latest
  1. Esegui il push dell'immagine Docker in Container Registry:
docker push gcr.io/$PROJECT_NAME/menu-service

Output di esempio

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. Esegui il deployment del servizio di 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

Output di esempio

[...]
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 consiglia di utilizzare Secret Manager per archiviare informazioni sensibili come le credenziali SQL. Puoi passare i secret come variabili di ambiente o montarli come volume con Cloud Run.

  1. Memorizza l'URL del servizio di menu:
MENU_SERVICE_URL=$(gcloud run services describe menu-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")
  1. Verifica l'URL del servizio di menu
echo $MENU_SERVICE_URL

Output di esempio

https://menu-service-g2mfphytdq-uk.a.run.app

7. Testa il servizio

  1. Crea una nuova voce di menu inviando una richiesta 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!!"
   }'

Output di esempio

{
    "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. Modifica lo stato della voce di menu inviando una richiesta PUT:
curl -X PUT "${MENU_SERVICE_URL}/menu/1" \
  -H 'Content-Type: application/json' \
  -d '{"status": "Ready"}'

Output di esempio

{
    "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. Complimenti!

Complimenti! Hai completato il codelab.

Qual è il passaggio successivo?

Esplora altri codelab di Cymbal Eats:

Libera spazio

Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

Elimina il progetto

Il modo più semplice per eliminare la fatturazione è eliminare il progetto creato per il tutorial.