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

1. Panoramica

Il connettore Cloud SQL Node.js è il modo più semplice per connettere in sicurezza 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 dimostrerà come connettere un'applicazione Node.js su Cloud Run a un database Cloud SQL per PostgreSQL in modo sicuro con un account di servizio utilizzando l'autenticazione IAM.

Cosa imparerai a fare

In questo lab imparerai a:

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

Prerequisiti

  • In questo lab si presuppone che tu abbia familiarità con gli ambienti della console Cloud e 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 disponi già di un Account Google, devi crearne uno.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

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 richiesta l'autorizzazione, fai clic su "Autorizza". per continuare.

6356559df3eccdda.png

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

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

3. Configurare un account di servizio

Creare e configurare un account di servizio Google Cloud che verrà utilizzato da 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 account di servizio:
    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 all'account di servizio Google Cloud che hai appena creato. In Cloud Shell, l'espressione ${GOOGLE_CLOUD_PROJECT} verrà sostituita dal nome del tuo progetto. Puoi anche effettuare la sostituzione manualmente se preferisci.
    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 come segue per aggiungere il ruolo Utente istanza Cloud SQL all'account di servizio 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 Writer log all'account di servizio Google Cloud che hai 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. Configurare Cloud SQL

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

  • –database-version: il tipo e la versione del motore del database. Se questo valore non è specificato, viene utilizzato il valore predefinito dell'API. Consulta la documentazione delle versioni del database gcloud per vedere le versioni attualmente disponibili.
  • -cpu: il numero di core desiderato nella macchina.
  • -memory: valore numerico intero che indica la quantità di memoria desiderata nella macchina. Deve essere indicata un'unità di dimensione (ad esempio, 3072 MB o 9 GB). Se non viene specificata alcuna unità, viene usato il valore GB.
  • –region: località regionale dell'istanza (ad esempio: us-central1, asia-east1, us-east1).
  • –database-flags: consente di impostare i flag. In questo caso, attiveremo cloudsql.iam_authentication per consentire a Cloud Run di connettersi a Cloud SQL utilizzando l'account di servizio che abbiamo creato in precedenza.
    gcloud sql instances create quickstart-instance \
      --database-version=POSTGRES_14 \
      --cpu=1 \
      --memory=4GB \
      --region=us-central1 \
      --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 che hai creato in precedenza al fine di accedere al database.

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

5. Prepara la richiesta

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 di 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 arrivo.
    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
    • Archiviare l'ora della richiesta HTTP nel database
    • Restituisce gli orari delle ultime cinque richieste
    di Gemini Advanced. 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 seguente per eseguire il deployment della tua applicazione in Cloud Run:

  • –region: località regionale dell'istanza (ad esempio: us-central1, asia-east1, us-east1).
  • –source: il codice sorgente di cui eseguire il deployment. 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 all'account di servizio 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 alcuni minuti, l'applicazione dovrebbe fornirti 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 di 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}