Esegui il deployment di un'applicazione JavaScript in Cloud Run con AlloyDB

1. Panoramica

Cloud Run è una piattaforma serverless completamente gestita che consente di eseguire container stateless richiamabili tramite richieste HTTP. Questo Codelab dimostrerà come connettere in modo sicuro un'applicazione Node.js su Cloud Run ad AlloyDB con un account di servizio utilizzando l'autenticazione IAM.

Cosa imparerai a fare

In questo lab, imparerai a:

  • Crea un'istanza AlloyDB (configurata per l'utilizzo di Private Service Connect)
  • Esegui il deployment di un'applicazione in Cloud Run che si connette all'istanza AlloyDB
  • Utilizzare Gemini Code Assist per aggiungere funzionalità all'applicazione

2. Prerequisiti

  1. Se non hai ancora un Account Google, devi crearne uno.
    • Utilizzi un account personale anziché un account di lavoro o della scuola. Gli account di lavoro e della scuola potrebbero avere limitazioni che ti impediscono di attivare le API necessarie per questo lab.

3. Configurazione del progetto

  1. Accedi alla console Google Cloud.
  2. Attiva la fatturazione in Cloud Console.
    • Il completamento di questo lab dovrebbe costare meno di 1 $in risorse Cloud.
    • Per eliminare le risorse ed evitare ulteriori addebiti, puoi seguire i passaggi alla fine di questo lab.
    • I nuovi utenti sono idonei per la prova senza costi di 300$.
  3. Crea un nuovo progetto o scegli di riutilizzare un progetto esistente.

4. Apri editor di Cloud Shell

  1. Vai a Cloud Shell Editor.
  2. Se il terminale non viene visualizzato nella parte inferiore dello schermo, aprilo:
    • Fai clic sul menu a tre linee Icona del menu di navigazione.
    • Fai clic su Terminale.
    • Fai clic su Nuovo terminaleAprire un nuovo terminale nell'editor di Cloud Shell.
  3. Nel terminale, imposta il progetto con questo comando:
    • Formato:
      gcloud config set project [PROJECT_ID]
      
    • Esempio:
      gcloud config set project lab-project-id-example
      
    • Se non ricordi l'ID progetto:
      • Puoi elencare tutti gli ID progetto con:
        gcloud projects list | awk '/PROJECT_ID/{print $2}'
        
      Impostare l'ID progetto nel terminale dell'editor di Cloud Shell
  4. Se ti viene chiesto di concedere l'autorizzazione, fai clic su Autorizza per continuare. Fai clic per autorizzare Cloud Shell
  5. Dovresti vedere questo messaggio:
    Updated property [core/project].
    
    Se vedi un WARNING e ti viene chiesto Do you want to continue (Y/N)?, è probabile che tu abbia inserito l'ID progetto in modo errato. Premi N, premi Enter e prova a eseguire di nuovo il comando gcloud config set project.

5. Abilita API

Nel terminale, abilita le API:

gcloud services enable \
  compute.googleapis.com \
  alloydb.googleapis.com \
  run.googleapis.com \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  cloudaicompanion.googleapis.com

Se ti viene chiesto di concedere l'autorizzazione, fai clic su Autorizza per continuare. Fai clic per autorizzare Cloud Shell

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-73d90d00-47ee-447a-b600" finished successfully.

6. Configurare un account di servizio

Crea e configura un account di servizio Google Cloud da utilizzare da Cloud Run in modo che disponga delle autorizzazioni corrette per connettersi ad AlloyDB.

  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 Utente database AlloyDB 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/alloydb.databaseUser"
    
  3. Esegui il comando gcloud projects add-iam-policy-binding come indicato di seguito per aggiungere il ruolo Consumatore di utilizzo del servizio 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/serviceusage.serviceUsageConsumer"
    
  4. Esegui il comando gcloud projects add-iam-policy-binding come indicato di seguito per aggiungere il ruolo Autori di log 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/logging.logWriter"
    

7. Crea istanza AlloyDB

  1. Esegui il comando gcloud alloydb clusters create per creare un'istanza Cloud SQL
    gcloud alloydb clusters create quickstart-cluster \
      --password=$(openssl rand -base64 20) \
      --region=us-central1 \
      --project=${GOOGLE_CLOUD_PROJECT} \
      --enable-private-service-connect \
      --database-version=POSTGRES_16
    

Il completamento di questo comando potrebbe richiedere alcuni minuti.

  1. Esegui il comando gcloud alloydb instances create per creare un'istanza Cloud SQL
    gcloud alloydb instances create quickstart-instance \
      --project=${GOOGLE_CLOUD_PROJECT} \
      --instance-type=PRIMARY \
      --cpu-count=2 \
      --region=us-central1 \
      --cluster=quickstart-cluster \
      --allowed-psc-projects=${GOOGLE_CLOUD_PROJECT} \
      --database-flags=alloydb.iam_authentication=on
    
  2. Esegui il comando gcloud alloydb instances describe per ottenere il link al collegamento del servizio PSC ed esportarlo in una variabile
    export SERVICE_ATTACHMENT=$(gcloud alloydb instances describe quickstart-instance \
        --cluster=quickstart-cluster --region=us-central1 \
        --format="value(pscInstanceConfig.serviceAttachmentLink)")
    
  3. gcloud compute addresses create quickstart-address \
      --region=us-central1 \
      --subnet=default
    
  4. gcloud compute forwarding-rules create quickstart-endpoint \
      --region=us-central1 \
      --network=default \
      --address=quickstart-address \
      --target-service-attachment=${SERVICE_ATTACHMENT}
    

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

gcloud alloydb users create quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam \
  --cluster=quickstart-cluster \
  --region=us-central1 \
  --type=IAM_BASED \
  --superuser=true

8. Preparare 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 libreria Google Cloud Auth.
    npm install google-auth-library
    
  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 le richieste HTTP
    • Connettiti al database
    • Memorizza l'ora della richiesta HTTP nel database
    • Restituisce le ore delle ultime cinque richieste
    Esegui il comando riportato di seguito in Cloud Shell:
    cat > index.mjs << "EOF"
    import express from 'express';
    import pg from 'pg';
    const { Pool } = pg;
    import {GoogleAuth} from 'google-auth-library';
    
    const auth = new GoogleAuth({
      scopes: ['https://www.googleapis.com/auth/alloydb.login'],
    });
    
    const pool = new Pool({
      host: process.env.DB_HOST,
      user: process.env.DB_USER,
      password: async () => {
        return await auth.getAccessToken();
      },
      database: process.env.DB_NAME,
      ssl: {
        require: true,
        rejectUnauthorized: false, // required for self-signed certs
        // https://node-postgres.com/features/ssl#self-signed-cert
      }
    });
    
    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.

9. Esegui il deployment dell'applicazione Cloud Run

  1. Esegui il comando gcloud projects add-iam-policy-binding come indicato di seguito per aggiungere il ruolo Utente di rete all'account di servizio Cloud Run per il servizio Cloud Run che stai per creare.
    gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
    --member "serviceAccount:service-$(gcloud projects describe ${GOOGLE_CLOUD_PROJECT} --format="value(projectNumber)")@serverless-robot-prod.iam.gserviceaccount.com" \
    --role "roles/compute.networkUser"
    
  1. Esegui il comando seguente per eseguire il deployment dell'applicazione in Cloud Run:
    gcloud run deploy helloworld \
      --region=us-central1 \
      --source=. \
      --set-env-vars DB_NAME="quickstart_db" \
      --set-env-vars DB_USER="postgres" \
      --set-env-vars DB_PASSWORD=${DB_PASSWORD} \
      --set-env-vars DB_HOST="$(gcloud sql instances describe quickstart-instance --project=${GOOGLE_CLOUD_PROJECT} --format='value(settings.ipConfiguration.pscConfig.pscAutoConnections.ipAddress)')" \
      --service-account="quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
      --network=default \
      --subnet=default \
      --allow-unauthenticated
    
  2. 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 fornire un URL da visitare.

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

Dopo alcuni minuti, l'applicazione dovrebbe fornire un URL da visitare.

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

10. Complimenti

In questo lab hai imparato a:

  • Crea un'istanza AlloyDB (configurata per l'utilizzo di Private Service Connect)
  • Esegui il deployment di un'applicazione in Cloud Run che si connette all'istanza AlloyDB
  • Utilizzare Gemini Code Assist per aggiungere funzionalità all'applicazione

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}