Déployer une application JavaScript dans Cloud Run avec AlloyDB

1. Présentation

Cloud Run est une plate-forme sans serveur entièrement gérée qui vous permet d'exécuter des conteneurs sans état accessibles via des requêtes HTTP. Cet atelier de programmation montre comment connecter de manière sécurisée une application Node.js sur Cloud Run à AlloyDB à l'aide d'un compte de service avec l'authentification IAM.

Objectifs de l'atelier

Dans cet atelier, vous allez apprendre à effectuer les tâches suivantes :

  • Créer une instance AlloyDB (configurée pour utiliser Private Service Connect)
  • Déployer une application dans Cloud Run qui se connecte à votre instance AlloyDB
  • Utiliser Gemini Code Assist pour ajouter des fonctionnalités à votre application

2. Prérequis

  1. Si vous ne possédez pas encore de compte Google, vous devez en créer un.
    • Vous utilisez un compte personnel au lieu d'un compte professionnel ou scolaire. Les comptes professionnels et scolaires peuvent être soumis à des restrictions qui vous empêchent d'activer les API nécessaires à cet atelier.

3. Configuration du projet

  1. Connectez-vous à la console Google Cloud.
  2. Activez la facturation dans la console Cloud.
    • La réalisation de cet atelier devrait coûter moins de 1 USD en ressources Cloud.
    • Vous pouvez suivre les étapes à la fin de cet atelier pour supprimer les ressources afin d'éviter d'autres frais.
    • Les nouveaux utilisateurs peuvent bénéficier d'un essai sans frais pour bénéficier d'un crédit de 300$.
  3. Créez un projet ou choisissez de réutiliser un projet existant.

4. Ouvrir l'éditeur Cloud Shell

  1. Accédez à l'éditeur Cloud Shell.
  2. Si le terminal ne s'affiche pas en bas de l'écran, ouvrez-le:
    • Cliquez sur le menu hamburger Icône du menu hamburger.
    • Cliquez sur Terminal
    • Cliquez sur Nouveau terminalOuvrir un nouveau terminal dans l'éditeur Cloud Shell
  3. Dans le terminal, définissez votre projet à l'aide de la commande suivante:
    • Format :
      gcloud config set project [PROJECT_ID]
      
    • Exemple :
      gcloud config set project lab-project-id-example
      
    • Si vous ne vous souvenez pas de l'ID de votre projet:
      • Vous pouvez lister tous vos ID de projet avec:
        gcloud projects list | awk '/PROJECT_ID/{print $2}'
        
      Définir l'ID de projet dans le terminal de l'éditeur Cloud Shell
  4. Si vous y êtes invité, cliquez sur Autoriser pour continuer. Cliquez pour autoriser Cloud Shell
  5. Le message suivant doit s'afficher :
    Updated property [core/project].
    
    Si un WARNING s'affiche et que vous êtes invité à saisir Do you want to continue (Y/N)?, vous avez probablement saisi l'ID de projet de manière incorrecte. Appuyez sur N, puis sur Enter, puis réessayez d'exécuter la commande gcloud config set project.

5. Activer les API

Dans le terminal, activez les API:

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

Si vous y êtes invité, cliquez sur Autoriser pour continuer. Cliquez pour autoriser Cloud Shell

L'exécution de cette commande peut prendre quelques minutes, mais un message semblable à celui-ci devrait s'afficher pour vous indiquer que l'opération s'est correctement déroulée:

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

6. Configurer un compte de service

Créez et configurez un compte de service Google Cloud à utiliser par Cloud Run afin qu'il dispose des autorisations appropriées pour se connecter à AlloyDB.

  1. Pour créer un compte de service, exécutez la commande gcloud iam service-accounts create comme suit:
    gcloud iam service-accounts create quickstart-service-account \
      --display-name="Quickstart Service Account"
    
  2. Exécutez la commande gcloud projects add-iam-policy-binding comme suit pour ajouter le rôle Utilisateur de la base de données AlloyDB au compte de service Google Cloud que vous venez de créer.
    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. Exécutez la commande gcloud projects add-iam-policy-binding comme suit pour ajouter le rôle Consommateur de Service Usage au compte de service Google Cloud que vous venez de créer.
    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. Exécutez la commande gcloud projects add-iam-policy-binding comme suit pour ajouter le rôle Rédacteur de journal au compte de service Google Cloud que vous venez de créer.
    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. Créer une instance AlloyDB

  1. Exécuter la commande gcloud alloydb clusters create pour créer une instance 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
    

L'exécution de cette commande peut prendre quelques minutes.

  1. Exécuter la commande gcloud alloydb instances create pour créer une instance 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. Exécutez la commande gcloud alloydb instances describe pour obtenir le lien de rattachement de service PSC et l'exporter vers une variable.
    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}
    

Créez un utilisateur de base de données PostgreSQL pour le compte de service que vous avez créé précédemment afin d'accéder à la base de données.

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

8. Préparer l'application

Préparez une application Node.js qui répond aux requêtes HTTP.

  1. Dans Cloud Shell, créez un répertoire nommé helloworld, puis accédez-y:
    mkdir helloworld
    cd helloworld
    
  2. Initialisez un fichier package.json en tant que module.
    npm init -y
    npm pkg set type="module"
    npm pkg set main="index.mjs"
    npm pkg set scripts.start="node index.mjs"
    
  3. Installez la bibliothèque Google Cloud Auth.
    npm install google-auth-library
    
  4. Installez pg pour interagir avec la base de données PostgreSQL.
    npm install pg
    
  5. Installez Express pour accepter les requêtes HTTP entrantes.
    npm install express
    
  6. Créez un fichier index.mjs avec le code de l'application. Ce code peut:
    • Accepter les requêtes HTTP
    • Se connecter à la base de données
    • Stocker l'heure de la requête HTTP dans la base de données
    • Afficher les heures des cinq dernières requêtes
    Exécutez la commande suivante dans 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
    

Ce code crée un serveur Web de base qui écoute le port défini par la variable d'environnement PORT. L'application est maintenant prête à être déployée.

9. Déployer une application Cloud Run

  1. Exécutez la commande gcloud projects add-iam-policy-binding comme suit pour ajouter le rôle Utilisateur réseau au compte de service Cloud Run du service Cloud Run que vous êtes sur le point de créer.
    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. Exécutez la commande ci-dessous pour déployer votre application sur 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. Si vous y êtes invité, appuyez sur Y et Enter pour confirmer que vous souhaitez continuer:
    Do you want to continue (Y/n)? Y
    

Après quelques minutes, l'application doit vous fournir une URL à laquelle vous pouvez accéder.

Accédez à l'URL pour voir votre application en action. Chaque fois que vous accédez à l'URL ou actualisez la page, les cinq visites les plus récentes sont renvoyées au format JSON.

Après quelques minutes, l'application doit vous fournir une URL à laquelle vous pouvez accéder.

Accédez à l'URL pour voir votre application en action. Chaque fois que vous accédez à l'URL ou actualisez la page, les cinq visites les plus récentes sont renvoyées au format JSON.

10. Félicitations

Dans cet atelier, vous avez appris à:

  • Créer une instance AlloyDB (configurée pour utiliser Private Service Connect)
  • Déployer une application dans Cloud Run qui se connecte à votre instance AlloyDB
  • Utiliser Gemini Code Assist pour ajouter des fonctionnalités à votre application

Effectuer un nettoyage

Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez chaque ressource individuellement. Si vous souhaitez supprimer l'ensemble du projet, vous pouvez exécuter la commande suivante:

gcloud projects delete ${GOOGLE_CLOUD_PROJECT}