1. Panoramica
In questo lab creerai il servizio di menu Cymbal Eats, che espone le API RESTful per aggiungere, aggiornare, eliminare ed elencare le voci di menu. Creerai un database Cloud SQL come database di backend per il servizio del menu, che verrà eseguito in Cloud Run. Poiché Cloud Run non risiede nello stesso VPC del database Cloud SQL, devi configurare un connettore di accesso VPC serverless per consentire a Cloud Run di comunicare con Cloud SQL tramite un indirizzo IP privato.
Cosa imparerai a fare
In questo lab imparerai a:
- Configura rete VPC privata
- Crea un database Cloud SQL Postgres privato
- Connetti CloudRun 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 autogestito
- Accedi alla console Google Cloud e crea un nuovo progetto o riutilizzane uno esistente. Se non hai ancora un account Gmail o Google Workspace, devi crearne uno.
- Il Nome progetto è il nome visualizzato dei partecipanti del progetto. Si tratta di 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 essere stato impostato). La console Cloud genera automaticamente una stringa univoca. di solito non ti importa cosa sia. Nella maggior parte dei codelab, dovrai fare riferimento all'ID progetto (in genere è identificato come
PROJECT_ID
). Se l'ID generato non ti soddisfa, puoi generarne un altro casuale. In alternativa, puoi provarne una personalizzata per verificare se è disponibile. Non può essere modificato dopo questo passaggio e rimarrà per tutta la durata del progetto. - Per informazione, c'è un terzo valore, un numero di progetto, utilizzato da alcune API. Scopri di più su tutti e tre questi valori nella documentazione.
- Successivamente, dovrai abilitare la fatturazione nella console Cloud per utilizzare risorse/API Cloud. Eseguire questo codelab non dovrebbe costare molto. Per arrestare le risorse in modo da non incorrere in fatturazione oltre questo tutorial, puoi eliminare le risorse che hai creato o eliminare l'intero progetto. I nuovi utenti di Google Cloud sono idonei al programma prova senza costi di 300$.
Configurazione dell'ambiente
- Crea variabili di ambiente relative 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
- clona il repository e vai alla directory
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service
- 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 tua rete VPC e ai servizi che utilizzi di comunicare esclusivamente tramite indirizzi IP interni. Per accedere ai servizi disponibili mediante l'accesso privato ai servizi, le istanze VM non richiedono la connettività a internet o indirizzi IP esterni.
- 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].
- 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 è alimentata da una macchina virtuale (VM) in esecuzione su un server host Google Cloud. L'opzione per l'alta disponibilità include anche una VM in standby in un'altra zona con la stessa configurazione della VM principale. Il database è conservato su un dispositivo di archiviazione di rete scalabile e di lunga durata, 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 per tutta la durata dell'istanza Cloud SQL.
Creerai un database Postgres Cloud SQL con un indirizzo IP privato.
Crea un database e un utente
- 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
- Aggiungi un database all'istanza di 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
- Crea un utente SQL
gcloud sql users create ${DB_USER} \
--password=$DB_PASSWORD \
--instance=$DB_INSTANCE_NAME
Output di esempio
Created user [menu-user].
- Archivia l'indirizzo IP del database
export DB_INSTANCE_IP=$(gcloud sql instances describe $DB_INSTANCE_NAME \
--format=json | jq \
--raw-output ".ipAddresses[].ipAddress")
- Aggiungi il ruolo Client Cloud SQL all'account di servizio 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 tua rete VPC utilizzando il DNS interno e gli indirizzi IP interni (come definiti da RFC 1918 e RFC 6598). Le risposte a queste richieste utilizzano anche la tua rete interna.
Creerai un connettore di accesso VPC serverless per il servizio Cloud Run per la connessione a Cloud SQL.
- Crea un connettore di accesso VPC serverless nella stessa rete VPC della tua 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.
- 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] ------------------------------------------------------------------------
- Crea 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
- 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
- Esegui il deployment del servizio 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.
- URL del servizio menu del negozio:
MENU_SERVICE_URL=$(gcloud run services describe menu-service \
--platform managed \
--region $REGION \
--format=json | jq \
--raw-output ".status.url")
- Verifica l'URL del servizio del menù
echo $MENU_SERVICE_URL
Output di esempio
https://menu-service-g2mfphytdq-uk.a.run.app
7. Test del servizio
- 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" }
- 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.
Passaggi successivi
Esplora altri codelab di Cymbal Eats:
- Attivazione di Cloud Workflows con Eventarc
- Attivazione dell'elaborazione degli eventi da Cloud Storage
- Connessione a database completamente gestiti da Cloud Run
- Applicazione serverless sicura con Identity-Aware Proxy (IAP)
- Attivazione di job Cloud Run con Cloud Scheduler
- Deployment sicuro su Cloud Run
- Protezione del traffico in entrata di Cloud Run
- Connessione ad AlloyDB privata da GKE Autopilot
Esegui la pulizia
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 è quello di eliminare il progetto che hai creato per il tutorial.