Come connettere un'applicazione Node.js su Cloud Run a un database Cloud SQL per PostgreSQL

1. Panoramica

Il connettore Node.js Cloud SQL è il modo più semplice per connettere in modo sicuro l'applicazione Node.js al database Cloud SQL. Cloud Run è una piattaforma serverless completamente gestita che consente di eseguire container stateless richiamabili tramite richieste HTTP. Questo Codelab mostrerà come connettere un'applicazione Node.js su Cloud Run a un database Cloud SQL per PostgreSQL in modo sicuro con un service account utilizzando l'autenticazione IAM.

Cosa imparerai a fare

In questo lab imparerai a:

  • Crea un'istanza Cloud SQL per il database PostgreSQL
  • Esegui il deployment di un'applicazione Node.js in Cloud Run
  • Connetti l'applicazione al database utilizzando la libreria del connettore Node.js di Cloud SQL

Prerequisiti

  • Questo lab presuppone una certa familiarità con gli ambienti della console Cloud e di Cloud Shell.

2. Prima di iniziare

Configurazione del progetto Cloud

  1. Accedi alla console Google Cloud e crea un nuovo progetto o riutilizzane uno esistente. Se non hai ancora un Account Google, devi crearne uno.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.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 aggiornarlo 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, di solito non ti interessa di cosa si tratta. Nella maggior parte dei codelab, devi 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 vedere 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. Successivamente, devi abilitare la fatturazione in Cloud Console per utilizzare le risorse/API Cloud. L'esecuzione di questo codelab non dovrebbe costare molto, se non nulla. Per arrestare le risorse in modo da non incorrere in costi di fatturazione al termine di questo tutorial, puoi eliminare le risorse che hai creato o l'intero progetto. I nuovi utenti di Google Cloud possono beneficiare del programma prova senza costi di 300$.

Configurazione dell'ambiente

Attiva Cloud Shell facendo clic sull'icona a destra della barra di ricerca.

ecdc43ada29e91b.png

Da Cloud Shell, abilita le API:

gcloud services enable compute.googleapis.com sqladmin.googleapis.com \
  run.googleapis.com artifactregistry.googleapis.com \
  cloudbuild.googleapis.com servicenetworking.googleapis.com

Se ti viene richiesto di concedere l'autorizzazione, fai clic su "Autorizza" per continuare.

6356559df3eccdda.png

Il completamento di questo comando potrebbe richiedere alcuni minuti, ma alla fine dovrebbe essere visualizzato un messaggio di operazione riuscita simile a questo:

Operation "operations/acf.p2-327036483151-73d90d00-47ee-447a-b600-a6badf0eceae" finished successfully.

3. Configurare un service account

Crea e configura un service account Google Cloud da utilizzare con Cloud Run in modo che disponga delle autorizzazioni corrette per connettersi a Cloud SQL.

  1. Esegui il comando gcloud iam service-accounts create come segue per creare un nuovo service account:
    gcloud iam service-accounts create quickstart-service-account \
      --display-name="Quickstart Service Account"
    
  2. Esegui il comando gcloud projects add-iam-policy-binding come segue per aggiungere il ruolo Client Cloud SQL al service account Google Cloud appena creato. In Cloud Shell, l'espressione ${GOOGLE_CLOUD_PROJECT} verrà sostituita dal nome del tuo progetto. Puoi anche eseguire questa sostituzione manualmente se ti senti più a tuo agio.
    gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
      --member="serviceAccount:quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
      --role="roles/cloudsql.client"
    
  3. Esegui il comando gcloud projects add-iam-policy-binding nel modo seguente per aggiungere il ruolo Utente istanza Cloud SQL al service account Google Cloud appena creato.
    gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
      --member="serviceAccount:quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
      --role="roles/cloudsql.instanceUser"
    
  4. Esegui il comando gcloud projects add-iam-policy-binding come segue per aggiungere il ruolo Scrittore log al service account Google Cloud appena creato.
    gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
      --member="serviceAccount:quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
      --role="roles/logging.logWriter"
    

4. Configura Cloud SQL

Esegui il comando gcloud sql instances create per creare un'istanza Cloud SQL.

  • --database-version: il tipo e la versione del motore del database. Se non viene specificato, viene utilizzato il valore predefinito dell'API. Consulta la documentazione sulle versioni del database gcloud per visualizzare le versioni attualmente disponibili.
  • --cpu: il numero di core desiderato nella macchina.
  • --memory: valore intero che indica la quantità di memoria desiderata nella macchina. Deve essere fornita un'unità di misura delle dimensioni (ad esempio 3072 MB o 9 GB). Se non vengono specificate unità, viene utilizzato il GB.
  • --region: posizione regionale dell'istanza (ad esempio: us-central1, asia-east1, us-east1).
  • --database-flags: consente di impostare i flag. In questo caso, attiviamo cloudsql.iam_authentication per consentire a Cloud Run di connettersi a Cloud SQL utilizzando il service account creato in precedenza.
    gcloud sql instances create quickstart-instance \
      --database-version=POSTGRES_18 \
      --tier=db-custom-1-3840 \
      --region=us-central1 \
      --edition=ENTERPRISE \
      --database-flags=cloudsql.iam_authentication=on
    

Il completamento di questo comando potrebbe richiedere alcuni minuti.

Esegui il comando gcloud sql databases create per creare un database Cloud SQL all'interno di quickstart-instance.

gcloud sql databases create quickstart_db \
  --instance=quickstart-instance

Crea un utente del database PostgreSQL per l'account di servizio creato in precedenza per accedere al database.

gcloud sql users create quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam \
  --instance=quickstart-instance \
  --type=cloud_iam_service_account \
  --database-roles=postgres

Avviso: non utilizzare --database-roles=postgres nelle applicazioni di produzione. Lo utilizziamo per fornire i privilegi necessari per creare ed eliminare tabelle a livello di programmazione per il codice in questo lab.

5. Prepara l'applicazione

Prepara un'applicazione Node.js che risponda alle richieste HTTP.

  1. In Cloud Shell crea una nuova directory denominata helloworld, quindi passa a quella directory:
    mkdir helloworld
    cd helloworld
    
  2. Inizializza un file package.json come modulo.
    npm init -y
    npm pkg set type="module"
    npm pkg set main="index.mjs"
    npm pkg set scripts.start="node index.mjs"
    
  3. Installa la dipendenza del connettore Node.js Cloud SQL.
    npm install @google-cloud/cloud-sql-connector
    
  4. Installa pg per interagire con il database PostgreSQL.
    npm install pg
    
  5. Installa express per accettare le richieste HTTP in entrata.
    npm install express
    
  6. Crea un file index.mjs con il codice dell'applicazione. Questo codice è in grado di:
    • Accetta richieste HTTP
    • Connettiti al database
    • Memorizzare l'ora della richiesta HTTP nel database
    • Restituisce gli orari delle ultime cinque richieste
    Esegui questo comando in Cloud Shell:
    cat > index.mjs << "EOF"
    import express from 'express';
    import pg from 'pg';
    import {Connector} from '@google-cloud/cloud-sql-connector';
    
    const {Pool} = pg;
    
    const connector = new Connector();
    const clientOpts = await connector.getOptions({
        instanceConnectionName: process.env.INSTANCE_CONNECTION_NAME,
        authType: 'IAM'
    });
    
    const pool = new Pool({
        ...clientOpts,
        user: process.env.DB_USER,
        database: process.env.DB_NAME
    });
    
    const app = express();
    
    app.get('/', async (req, res) => {
      await pool.query('INSERT INTO visits(created_at) VALUES(NOW())');
      const {rows} = await pool.query('SELECT created_at FROM visits ORDER BY created_at DESC LIMIT 5');
      console.table(rows); // prints the last 5 visits
      res.send(rows);
    });
    
    const port = parseInt(process.env.PORT) || 8080;
    app.listen(port, async () => {
      console.log('process.env: ', process.env);
      await pool.query(`CREATE TABLE IF NOT EXISTS visits (
        id SERIAL NOT NULL,
        created_at timestamp NOT NULL,
        PRIMARY KEY (id)
      );`);
      console.log(`helloworld: listening on port ${port}`);
    });
    
    EOF
    

Questo codice crea un server web di base in ascolto sulla porta definita dalla variabile di ambiente PORT. L'applicazione è ora pronta per il deployment.

6. Esegui il deployment dell'applicazione Cloud Run

Esegui il comando riportato di seguito per eseguire il deployment dell'applicazione su Cloud Run:

  • --region: posizione regionale dell'istanza (ad esempio: us-central1, asia-east1, us-east1).
  • --source: il codice sorgente da implementare. In questo caso, . si riferisce al codice sorgente nella cartella corrente helloworld.
  • --set-env-vars: imposta le variabili di ambiente utilizzate dall'applicazione per indirizzarla al database Cloud SQL.
  • --service-account: collega il deployment di Cloud Run al service account con le autorizzazioni per connettersi al database Cloud SQL creato all'inizio di questo codelab.
  • --allow-unauthenticated: consente le richieste non autenticate in modo che l'applicazione sia accessibile da internet.
gcloud run deploy helloworld \
  --region=us-central1 \
  --source=. \
  --set-env-vars INSTANCE_CONNECTION_NAME="${GOOGLE_CLOUD_PROJECT}:us-central1:quickstart-instance" \
  --set-env-vars DB_NAME="quickstart_db" \
  --set-env-vars DB_USER="quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam" \
  --service-account="quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
  --allow-unauthenticated

Se richiesto, premi y e Enter per confermare che vuoi continuare:

Do you want to continue (Y/n)? y

Dopo qualche minuto, l'applicazione dovrebbe fornire un URL da visitare.

Vai all'URL per vedere la tua applicazione in azione. Ogni volta che visiti l'URL o aggiorni la pagina, vedrai le cinque visite più recenti restituite in formato JSON.

7. Complimenti

Hai eseguito il deployment di un'applicazione Node.js su Cloud Run in grado di connettersi a un database PostgreSQL in esecuzione su Cloud SQL.

Argomenti trattati:

  • Creazione di un database Cloud SQL per PostgreSQL
  • Deployment di un'applicazione Node.js in Cloud Run
  • Connessione dell'applicazione a Cloud SQL utilizzando il connettore Node.js Cloud SQL

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. Se vuoi eliminare l'intero progetto, puoi eseguire:

gcloud projects delete ${GOOGLE_CLOUD_PROJECT}